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つ示します。
宣言の方法
[静的配列]
1 |
Dim [配列名]([要素数1],[要素数2])as [型] |
[動的配列]
1 |
Dim [配列名]()as [型] |
[型]は、通常の変数と同様で、数値型、文字列型、バリアント型、日付型等を指定します。バリアント型以外の型指定をした場合は、通常の変数と同様、型違いの値を代入しようとすると(数値型に文字列など)、「型が違います」のエラーが発生します。
動的配列で宣言した場合は、値代入前に配列の大きさを、Redimを用いて再定義できます。構文は以下のとおりです。
1 |
Redim (Preserve) [配列名]([要素数1],[要素数2]<strong>)</strong> |
途中で何度でも再定義が可能です。Preserveを記述すると、現在入っている値を残したまま、サイズの再定義が可能ですが、変更できるのは配列の最終次元(上記の場合ですと[要素数2])のみです。
実行例
下記は、静的配列と動的配列を宣言したものです。
1 2 3 4 5 6 7 8 9 10 11 |
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】静的配列 宣言直後
【2】動的配列 宣言直後
【3】動的配列(Ary2)に値を代入した直後
【4】動的配列(Ary2)定義(Preserve使用)
ワークシートとのやりとりを考慮した配列宣言
ExcelVBAにおいては、配列の各値をワークシートに書き写す、あるいはその逆、といった処理をよく行います。この際、配列のインデックス番号は特に指定しない限り"0"から始まるのに対し、セルのインデックス番号は"1"からですので、エラーを招くことがあります。配列宣言時にできる対策として、下記2通りの方法があります。
(1)配列宣言時、インデックスの開始番号を指定する
1 |
Dim [配列名] ([1To 要素数1],[1 To 要素数2])as [型] |
としてやると、インデックスの最小値が1となり、セルとの整合が取れます。
(2)Option Baseステートメントを使用する
モジュール先頭部に以下のように宣言してやると、上記(1)と同じ効果が得られます。
Option Base 1
下記は、Option Base を有効にしたサンプルです。配列とセルのインデックス番号が一致しており、シンプルになります。セルA1、B1、A2、B2にはそれぞれ"あ"、"い"、"う"、"え"が入力されているものとします。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
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 |