VBAの配列の仕組みと使い方のサンプルです。Excel、Accessとも同じです。
目次
仕組み | 配列とは |
作成する | 静的配列を作成 / 動的配列を作成 / Array関数で作成 |
取得する | ForEach文、For文で要素を取得 / セルの値を取得 / 要素を検索 / 要素数を取得 |
変更する | 配列の値を変更 / Eraseで配列を初期化(動的配列と静的配列の違い) |
コピー | 配列をコピー |
配列とは
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
2行目は、変数の後のかっこで2を指定しています。
その場合の要素は、3~5行目のようにインデックスは0から2までの3つ入ります。
要素の数が2つではないので注意が必要です。
Javaの場合は、3と宣言したら要素の数は3つです。
動的配列を作成
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
2行目は、配列の変数を宣言しています。要素数は指定しません。
3行目は、Redimで数値を2にしています。
4~6行目は、値をセットしています。
8行目は、Redim Preserveで数値を3に変更しています。
Preserveは保持するという意味です。Preserveがないと4~6行目の値がクリアされてしまいます。
Array関数で作成
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
2行目は、Variantで変数を宣言しています。
3行目は、Array関数で配列に値をまとめてセットしています。
ForEach文、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
5行目は、For Each文で配列の値の数分処理を繰り返します。
9行目は、For文で配列の値の数分処理を繰り返します。
UBoundは引数の配列の最大のインデックス値を返します。2が返ります。
Lboundは引数の配列の最小のインデックス値を返します。0が返ります。
セルの値を取得
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) 'bが出力される
Debug.Print arr(1, 3) 'cが出力される
End Sub
3行目は、複数のセルの値を取得しています。
取得した値は5行目以降のように2次元配列になります。
要素を検索
要素を検索するサンプルです。
Sub test1()
Dim arr As Variant
Dim b1 As Boolean
arr = Array("赤", "黄", "青")
b1 = False
For Each c1 In arr
If c1 = "黄" Then
b1 = True
Exit For
End If
Next
Debug.Print (b1) 'Trueが表示される
End Sub
For Eachでループさせて配列の要素を一つずつ確認していきます。
要素数を取得
Uboundを使用して要素数を取得します。
Sub test1()
Dim arr As Variant
arr = Array(1, 2, 3)
Debug.Print UBound(arr) + 1 ' 3
End Sub
配列の要素数は、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
変更は、要素のインデックス(添字)を指定して値を代入します。
Eraseで配列を初期化(動的配列と静的配列の違い)
動的配列と静的配列のデータ型で挙動が異なります。
Sub test1()
Dim arr1() As String '1.動的配列
ReDim arr1(2)
arr1(0) = "a"
arr1(1) = "b"
arr1(2) = "c"
Erase arr1 'Eraseした後に要素数と値を確認する
'Debug.Print UBound(arr1) 'エラー
Dim arr2(2) As String '2.String型の静的配列
arr2(0) = "a"
arr2(1) = "b"
arr2(2) = "c"
Erase arr2 'Eraseした後に要素数と値を確認する
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 '3.Integer型の静的配列
arr3(0) = 1
arr3(1) = 2
arr3(2) = 3
Erase arr3 'Eraseした後に要素数と値を確認する
Debug.Print UBound(arr3) '2(要素数は3)
Debug.Print arr3(0) '0
Debug.Print arr3(1) '0
Debug.Print arr3(2) '0
End Sub
動的配列をEraseした場合、配列自体がなくなります。
String型の静的配列をEraseした場合、値は空文字になります。
Integer型の静的配列をEraseした場合、値は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
コピー先の配列の値を変更してもコピー元の配列の値は変更されません。
関連の記事