Excel VBAで2次元配列を宣言する

VBAで2次元配列を宣言する方法について説明します。

2次元配列とは

よく扱う1次元配列は、たとえば{0,1,2……}にように、一列に並んだようなものを指します。一方で2次元配列は、1次元目の要素と2次元目の要素が入れ子状になっているものを言います。以下のようなものは2次元配列です。

(1,0) (1,1) (1,2) (1,3)
(2,0) (2,1) (2,2) (2,3)
(3,0) (3,1) (3,2) (3,3) 

2次元配列の宣言

2次元に限ったことではありませんが、配列は他の変数と同じように、プロシージャの先頭部で宣言するのが一般的です。要素(配列の中に入れるデータ)の数がはっきりしているときは静的配列、わからない、あるいは増減するような場合は、動的配列で宣言します。2次元なので、要素は2つ示します。

宣言の方法

[静的配列]

Dim Ary1(2, 2) As String            '【1】静的配列 要素数2x2
Dim Ary2() As String                '【2】動的配列

'動的配列では、途中でサイズを再定義できます
ReDim Ary2(2, 2)    '動的配列再定義 要素数2x2

'【3】Ary2に値を代入
Ary2(0, 0) = "A": Ary2(0, 1) = "B"
Ary2(1, 0) = "C": Ary2(1, 1) = "D"

ReDim Preserve Ary2(1, 2)    '【4】動的配列再定義 要素数1x2 元値温存

[実行結果]

【1】静的配列 宣言直後                                

Ary1【2】動的配列 宣言直後

Ary2

【3】動的配列(Ary2)に値を代入した直後

Ary3

【4】動的配列(Ary2)定義(Preserve使用)

Ary4

ワークシートとのやりとりを考慮した配列宣言

ExcelVBAにおいては、配列の各値をワークシートに書き写す、あるいはその逆、といった処理をよく行います。この際、配列のインデックス番号は特に指定しない限り"0"から始まるのに対し、セルのインデックス番号は"1"からですので、エラーを招くことがあります。配列宣言時にできる対策として、下記2通りの方法があります。

(1)配列宣言時、インデックスの開始番号を指定する

Option Explicit

'Option Baseはモジュール先頭に宣言します
Option Base 1

Sub TwoDimArySample()

    Dim Ary(2, 2) As String '配列宣言 要素数2x2
    Dim i As Long, j As Long

'値代入
    For i = 1 To 2
        For j = 1 To 2
            Ary(i, j) = Cells(i, j).Value
        Next j
    Next i

End Sub

[実行結果]Ary5