もくじ
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)
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 If
End Function
convert_range_to_arr関数の使い方
第一引数のrng
にRangeオブジェクトを指定することで、1行1列(1つのセル)のデータを2次元配列に変換できます。
複数セルが指定された場合は、元の2次元配列のまま返されます。
この関数を使えば、Excel VBAで常に二次元配列としてデータを扱えるようになり、処理の一貫性が保てます。
各引数について
- rng (必須)
Rangeオブジェクトを指定します。
【サンプルコード】Range.Valueで1セル指定でも二次元配列として取得
以下VBAコードでは、「Sheet1」シートの「A1」セルの値を2次元配列で取得しています。
Sub sample()
Dim rng As Range
Set rng = Sheets("Sheet1").Range("A1")
Dim myArr As Variant
myArr = convert_range_to_arr(rng)
End Sub
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 If
End Function
まとめ:VBAでRangeを2次元配列として扱うには
Range.Valueは、1セルの場合は配列ではなく単一の値になる
2次元配列として常に扱いたいなら、関数で変換処理を加える
本記事の関数
convert_range_to_arr
で、どんな範囲でも配列化できる
VBAで安定的に配列処理をしたい場合、事前にこのような対策を入れておくとエラーを防げます。
今回のように関数化しておけば、VBAでの配列エラー対策も簡単になります。