VBAは多次元配列の利用が可能
VBAの配列では2次元の作成が可能です。また、3次元、4次元、と多次元配列も可能です。実際には2次元までが現実的なところと思われます。
3次元以降になってくると管理もデバッグも大変になってくるため、コレクションなどの配列以外の方法で実装する方が都合がいい気がします。
実装可能な最大次元数は要素数が2(ary(1, 1, ・・・)と、各要素を1で定義する配列)の場合は理論上は31次元になりますが、メモリの関係で16次元ぐらいが最大次元数になります。
これについては別ページ「VBAで定義可能な配列の最大次元数」に書いています。
2次元配列の宣言
2次元配列とは行と列の関係にある配列です。
実際に利用する場面としては、Excelのシートの内容を保持するために、行と列からセルを特定する場合が多いと思われます。
宣言の書き方
1 2 |
'// Dim 変数名(要素1番目, 要素2番目) As データ型 Dim a(2, 3) As String '// 3行4列の2次元配列 |
2次元配列に限らず、配列を定義する場合の要素数は実際の領域から1引いた値を設定します。
要素に2と書くと、0, 1, 2 の3つの領域を持つことになります。
なお、Option Baseを設定している場合は異なります。
2次元配列へのデータの設定
以下のような感じでデータを格納します。
1 2 3 4 5 6 7 8 9 10 |
Sub 二次元配列() Dim ary(1, 2) ary(0, 0) = "00" ary(0, 1) = "01" ary(0, 2) = "02" ary(1, 0) = "10" ary(1, 1) = "11" ary(1, 2) = "12" End Sub |
2次元配列の初期化
2次元配列の初期化は1次元配列と同様でEraseステートメントを使います。
静的配列の場合はEraseステートメントを実行すると配列自体は残りますが値が変数の型に合わせて初期化されます。
動的配列の場合は配列であることは残りますが、要素数が未定の状態にまで解放され、Dim ary() の状態になります。
1 |
Erase ary |
シートの内容を2次元配列に格納するサンプル
以下のような表形式のデータを2次元配列に格納するサンプルです。
ソースコード
事前に表の行数と列数が確定している場合のコードです。
静的配列で書いています。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
Sub GetSheetData2Dim() Dim ary(4, 4) '// シートの内容を格納する2次元配列 Dim sCell '// セル値 Dim iRow '// 行 Dim iCol '// 列 Dim iRowMax '// 最大行 Dim iColMax '// 最大列 '// 最終行を取得 iRowMax = ActiveSheet.UsedRange.Rows.Count - 1 iColMax = ActiveSheet.UsedRange.Columns.Count '// 処理開始セルを選択 Range("A2").Select '// 行ループ For iRow = 0 To iRowMax - 1 '// 列ループ For iCol = 0 To iColMax - 1 '// 現在行列のセル値を首都kう sCell = ActiveCell.Offset(iRow, iCol).Value '// 2次元配列にセル値を格納 ary(iRow, iCol) = sCell Next Next End Sub |
ソースコードの説明
2行目で2次元配列を静的配列として定義しています。
10行目は表の行数を取得しています。ヘッダ行があるためその分を減らしています。
11行目は表の列数を取得しています。最終行と最終列の取得については別ページ「VBAで編集されているセル範囲を選択する(最終行、最終列の取得)」にも書いてありますので参考にしてください。
14行目で開始セル位置を選択しています。これ以降はこのセルが基点となります。
17行目で行のループを行い、その中の19行目で列のループを行います。
21行目で現在の行と列のセルの値を取得します。
23行目で取得したセルの値を配列に格納します。