【PR】を含みます。

プログラミング

【Excel VBA】Range.Valueが配列にならない理由と2次元配列に変換する方法

Excel VBA Range.Valueが配列にならない理由と2次元配列に変換する方法

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)

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次元配列のまま返されます。

この関数を使えば、Excel VBAで常に二次元配列としてデータを扱えるようになり、処理の一貫性が保てます。

各引数について

  1. rng (必須)
    Rangeオブジェクトを指定します。

【サンプルコード】Range.Valueで1セル指定でも二次元配列として取得

以下VBAコードでは、「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

まとめ:VBAでRangeを2次元配列として扱うには

  1. Range.Valueは、1セルの場合は配列ではなく単一の値になる

  2. 2次元配列として常に扱いたいなら、関数で変換処理を加える

  3. 本記事の関数convert_range_to_arrで、どんな範囲でも配列化できる

VBAで安定的に配列処理をしたい場合、事前にこのような対策を入れておくとエラーを防げます。

今回のように関数化しておけば、VBAでの配列エラー対策も簡単になります。

-プログラミング
-,