もくじ
Excel VBAのRangeオブジェクトで1行1列(1つのセル)のデータを取得して2次元配列を作成すると、2次元配列ではなくなります。
この記事では2次元配列にならない原因と対策方法を紹介してます。
Rangeオブジェクトで取得した1行1列(1つのセル)のデータが2次元配列にならない罠に注意
Excel VBAで、RangeオブジェクトのValueプロパティを使って1行1列(1つのセル)のデータを取得すると、VBAでは2次元配列として扱われません。
2次元配列にならない原因
Excelのセル範囲が1行1列(1つのセル)の場合、Valueプロパティによって取得されるデータが2次元配列である必要がなく、VBAが自動的に最適なデータ構造に変換しているためです。
【実装コード】Rangeオブジェクトで取得した1行1列(1つのセル)のデータを2次元配列に変換する関数
VBA
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 If
End Function
convert_range_to_arr()関数の使用方法
第一引数のrng
にRangeオブジェクトを指定することで、1行1列(1つのセル)のデータを2次元配列に変換できます。
2次元配列が渡された場合、そのまま2次元配列が返されます。
各引数について
- rng (必須)
Rangeオブジェクトを指定します。
convert_range_to_arr()関数の使用例
以下では、「Sheet1」シートの「A1」セルの値を2次元配列で取得しています。
VBA
Copy
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
Excel VBAで初心者を卒業したいという方におすすめの1冊
リンク
もみじ
入門書レベルの内容を理解できる方におすすめの1冊で、実務で必要なスキルを学ぶことができます。
具体的には、コーディングの作法や効率的なコーディング方法、CSVやWeb上のデータとの連携方法、そしてマクロの高速化などの実務で役立つスキルを学ぶことができます。