ExcelのVBAの配列の仕組みと使い方のサンプルです。
目次
仕組み | 配列とは |
作成する | 静的配列(要素数を宣言して配列を作成する) |
動的配列(ReDimとPreserve) | |
Array関数で配列を作成する | |
取得する | 配列の値をfor文で取得する |
複数のセルの値を配列で取得する (Range) | |
要素数を取得する(Ubound) | |
変更する | 配列の値を変更する |
配列を初期化する(Erase) | |
コピー | 配列をコピーする |
2次元 | 2次元配列を作成する |
配列とは
a = Array( 値1 , 値2 , 値3 ) |
上記は複数の値を変数aに代入しています。
この変数aは配列として複数の値を持ちます。
- 1つの変数で同じ型の複数の値を保持できます。
- 各項目を要素(element)といいます。
- 要素の順序をインデックス(添字)で管理します。上記図では(0)、(1)、(2)、(3)がインデックスです。
- インデックスの先頭は0から始まります。
- 以下は、MicrosoftのVBAの配列のリンクです。
https://docs.microsoft.com/ja-jp/office/vba/language/concepts/getting-started/declaring-arrays
静的配列(要素数を宣言して配列を作成する)
Dim 変数名(数値) as データ型 |
Sub test1()
Dim arr(2) As Integer
arr(0) = 1
arr(1) = 2
arr(2) = 3
'arr(3) = 4 インデックスが有効範囲にありません
Debug.Print arr(0) '1
Debug.Print arr(1) '2
Debug.Print arr(2) '3
End Sub
3行目は、変数の後のかっこで2を指定しています。
その場合の要素は、4~6行目のようにインデックスは0から2までの3つ入ります。
要素の数が2つではないので注意が必要です。
Javaの場合は、3と宣言したら要素の数は3つです。
動的配列(ReDimとPreserve)
dim 変数名() as データ型 |
ReDim 配列の変数(数値) |
Redim Preserve 配列の変数(数値) |
要素数が変わるので動的配列と呼ばれます。
Sub test1()
Dim arr() As String
ReDim arr(2)
arr(0) = "赤"
arr(1) = "黄"
arr(2) = "青"
ReDim Preserve arr(3)
arr(3) = "オレンジ"
For Each b In arr
Debug.Print b '赤 黄 青 オレンジ
Next
End Sub
3行目は、配列の変数を宣言しています。要素数は指定しません。
5行目は、Redimで数値を2にしています。
7~9行目は、値をセットしています。
11行目は、Redim Preserveで数値を3に変更しています。
Preserveは保持するという意味です。Preserveがないと7~9行目の値がクリアされてしまいます。
Array関数で配列を作成する
Sub test1()
Dim arr As Variant
arr = Array(1, 2, 3)
Debug.Print arr(0) '1
Debug.Print arr(1) '2
Debug.Print arr(2) '3
End Sub
3行目は、Variantで変数を宣言しています。
5行目は、Array関数で配列に値をまとめてセットしています。
7~9行目は、配列の値を表示しています。
配列の値をfor文で取得する
Sub test1()
Dim arr As Variant
arr = Array(1, 2, 3)
For Each b In arr
Debug.Print b '1 2 3
Next
For i = 0 To UBound(arr)
Debug.Print arr(i) '1 2 3
Next
Debug.Print UBound(arr) '2
Debug.Print LBound(arr) '0
End Sub
6行目は、For Each文で配列の値の数分処理を繰り返します。
10行目は、For文で配列の値の数分処理を繰り返します。
UBoundは引数の配列の最大のインデックス値を返します。2が返ります。
Lboundは引数の配列の最小のインデックス値を返します。0が返ります。
複数のセルの値を配列で取得する (Range)
Range("開始位置のセル:終了位置のセル") |
上記のB2,C2,D2の値を取得します。
Sub test1()
Dim arr As Variant
arr = Range("b2:D2")
Debug.Print arr(1, 1) 'aが出力される
Debug.Print arr(1, 2) 'aが出力される
Debug.Print arr(1, 3) 'aが出力される
End Sub
5行目は、複数のセルの値を取得しています。
取得した値は7行目以降のように2次元配列になります。
要素数を取得する(Ubound)
Sub test1()
Dim arr As Variant
arr = Array(1, 2, 3)
Debug.Print UBound(arr) + 1 ' 3
Debug.Print arr(0) '1
Debug.Print arr(1) '2
Debug.Print arr(2) '3
End Sub
7行目は、配列の要素数を表示しています。UBoundに1追加します。
配列の値を変更する
Sub test1()
Dim arr As Variant
arr = Array("赤", "黄", "青")
arr(1) = "オレンジ"
Debug.Print arr(0) '赤が出力される
Debug.Print arr(1) 'オレンジが出力される
Debug.Print arr(2) '青が出力される
End Sub
6行目は、文字列を配列の変数に代入しています。
インデックス(添字)で変更したい要素を指定します
配列を初期化する(Erase)
動的配列と静的配列のデータ型で挙動が異なります。
Sub test1()
Dim arr1() As String '動的配列
ReDim arr1(2)
arr1(0) = "a"
arr1(1) = "b"
arr1(2) = "c"
Erase arr1
'Debug.Print UBound(arr1) 'エラー
Dim arr2(2) As String '静的配列
arr2(0) = "a"
arr2(1) = "b"
arr2(2) = "c"
Erase arr2
Debug.Print UBound(arr2) '2(要素数は3)
Debug.Print arr2(0) '""
Debug.Print arr2(1) '""
Debug.Print arr2(2) '""
If arr2(0) = "" Then
Debug.Print "空文字" '空文字と出力される
End If
Dim arr3(2) As Integer '静的配列
arr3(0) = 1
arr3(1) = 2
arr3(2) = 3
Erase arr3
Debug.Print UBound(arr3) '2(要素数は3)
Debug.Print arr3(0) '0
Debug.Print arr3(1) '0
Debug.Print arr3(2) '0
End Sub
8行目は、動的配列をEraseしています。
9行目は、エラーになります。
16行目は、String型の静的配列をEraseしています。
18~20行目は、空文字になります。
30行目は、Integer型の静的配列をEraseしています。
32~34行目は、0になります。
配列をコピーする
Sub test1()
Dim arr1 As Variant
Dim arr2 As Variant
arr1 = Array("赤", "黄", "青")
arr2 = arr1 '配列をコピー
arr2(0) = "オレンジ"
Debug.Print arr2(0) 'オレンジ
Debug.Print arr2(1) '黄
Debug.Print arr2(2) '青
Debug.Print arr1(0) '赤
Debug.Print arr1(1) '黄
Debug.Print arr1(2) '青
End Sub
7行目は、配列をコピーしています。
9行目は、コピー先の配列の値を変更しています。
11~13行目は、9行目の変更が反映されています。
15~17行目は、元の配列ですが値は変更されていません。
2次元配列を作成する
Sub test1()
Dim arr(2, 2) As Integer
arr(0, 0) = 1
arr(0, 1) = 2
arr(0, 2) = 3
arr(1, 0) = 4
arr(1, 1) = 5
arr(1, 2) = 6
Debug.Print arr(0, 0) '1
Debug.Print arr(0, 1) '2
Debug.Print arr(0, 2) '3
Debug.Print arr(1, 0) '4
Debug.Print arr(1, 1) '5
Debug.Print arr(1, 2) '6
End Sub
3行目は、arr(2,2)としています。これは配列の要素の数を3つずつ宣言しています。
指定の数プラス1が実際の要素の数です。
5~10行目は、2次元配列に値をセットしています。
12~17行目は、2次元配列の値を表示しています。
for文のループで2次元配列を作成する
for文で2次元配列を作成した場合です。
Sub test1()
Dim arr(2, 2) As Integer
num = 1
For i = 0 To 1
For j = 0 To 2
arr(i, j) = num
num = num + 1
Next
Next
Debug.Print arr(0, 0) '1
Debug.Print arr(0, 1) '2
Debug.Print arr(0, 2) '3
Debug.Print arr(1, 0) '4
Debug.Print arr(1, 1) '5
Debug.Print arr(1, 2) '6
End Sub
関連の記事
Excel VBAのFor文のサンプル
Excel VBAのDo Loop文のサンプル
Excel VBAのFor Each文のサンプル