もくじ
Excel VBAでRangeオブジェクトから配列を取得する際、1セル(1行1列)のみを指定すると、2次元配列ではなく単一の値として取得されてしまいます。
この記事では、「Range.Valueが配列にならない理由」と、「常に2次元配列で取得するためのVBA関数の作り方」について解説します。
【VBA Range 配列化の注意点】Range.Valueが二次元配列にならない理由
VBAでは、Range.Valueで1つのセルのみを参照した場合、自動的にそのセルの「値」として返され、2次元配列にはなりません。
そのため、2次元配列として扱いたい場合は自前で変換処理が必要です。
VBAでは、Range.Valueが配列にならない状況が起こりやすく、特に1セルのみを参照した場合は注意が必要です。
【コピペOK】1セルでも必ず二次元配列として取得できる関数(convert_range_to_arr)
Copyをクリックするとコピーできます。
Public Function convert_range_to_arr(ByVal rng As Range) As Variant    If rng.Count = 1 Then        ' 1行1列のRangeオブジェクトの場合、二次元配列で返す        Dim resultArr(1 To 1, 1 To 1)        resultArr(1, 1) = rng.Value        convert_range_to_arr = resultArr    Else        convert_range_to_arr = rng.Value    End IfEnd Functionconvert_range_to_arr関数の使い方
第一引数のrngにRangeオブジェクトを指定することで、1行1列(1つのセル)のデータを2次元配列に変換できます。
複数セルが指定された場合は、元の2次元配列のまま返されます。
この関数を使えば、Excel VBAで常に二次元配列としてデータを扱えるようになり、処理の一貫性が保てます。
各引数について
- rng (必須)
 Rangeオブジェクトを指定します。
【サンプルコード】Range.Valueで1セル指定でも二次元配列として取得
以下VBAコードでは、「Sheet1」シートの「A1」セルの値を2次元配列で取得しています。
Copyをクリックするとコピーできます。
Sub sample()    Dim rng As Range    Set rng = Sheets("Sheet1").Range("A1")    Dim myArr As Variant    myArr = convert_range_to_arr(rng)End SubPublic Function convert_range_to_arr(ByVal rng As Range) As Variant    If rng.Count = 1 Then        ' 1行1列のRangeオブジェクトの場合、二次元配列で返す        Dim resultArr(1 To 1, 1 To 1)        resultArr(1, 1) = rng.Value        convert_range_to_arr = resultArr    Else        convert_range_to_arr = rng.Value    End IfEnd Functionまとめ:VBAでRangeを2次元配列として扱うには
- Range.Valueは、1セルの場合は配列ではなく単一の値になる 
- 2次元配列として常に扱いたいなら、関数で変換処理を加える 
- 本記事の関数 - convert_range_to_arrで、どんな範囲でも配列化できる
VBAで安定的に配列処理をしたい場合、事前にこのような対策を入れておくとエラーを防げます。
今回のように関数化しておけば、VBAでの配列エラー対策も簡単になります。
