プログラミング

【PR】を含みます。

【Excel VBA】Rangeオブジェクトで2次元配列を作成する際の罠と対策方法

Rangeオブジェクトで2次元配列を作成する際の罠と対策方法

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
  1. Public Function convert_range_to_arr(ByVal rng As Range) As Variant
  2.     If rng.Count = 1 Then
  3.         ' 1行1列のRangeオブジェクトの場合、二次元配列で返す
  4.         Dim resultArr(1 To 1, 1 To 1)
  5.         resultArr(1, 1) = rng.Value
  6.         convert_range_to_arr = resultArr
  7.     Else
  8.         convert_range_to_arr = rng.Value
  9.     End If
  10. End Function

convert_range_to_arr()関数の使用方法

第一引数のrngにRangeオブジェクトを指定することで、1行1列(1つのセル)のデータを2次元配列に変換できます。

2次元配列が渡された場合、そのまま2次元配列が返されます。

各引数について

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

convert_range_to_arr()関数の使用例

以下では、「Sheet1」シートの「A1」セルの値を2次元配列で取得しています。

VBA
Copy
  1. Sub sample()
  2.     Dim rng As Range
  3.     Set rng = Sheets("Sheet1").Range("A1")
  4.     Dim myArr As Variant
  5.     myArr = convert_range_to_arr(rng)
  6. End Sub
  7. Public Function convert_range_to_arr(ByVal rng As Range) As Variant
  8.     If rng.Count = 1 Then
  9.         ' 1行1列のRangeオブジェクトの場合、二次元配列で返す
  10.         Dim resultArr(1 To 1, 1 To 1)
  11.         resultArr(1, 1) = rng.Value
  12.         convert_range_to_arr = resultArr
  13.     Else
  14.         convert_range_to_arr = rng.Value
  15.     End If
  16. End Function

Excel VBAで初心者を卒業したいという方におすすめの1冊

アイコン画像

もみじ

入門書レベルの内容を理解できる方におすすめの1冊で、実務で必要なスキルを学ぶことができます。

具体的には、コーディングの作法や効率的なコーディング方法、CSVやWeb上のデータとの連携方法、そしてマクロの高速化などの実務で役立つスキルを学ぶことができます。

-プログラミング
-,