VBA 配列の仕組みと使い方(Excel/Access)

VBAの配列の仕組みと使い方のサンプルです。Excel、Accessとも同じです。

目次

仕組み 配列とは
作成する 静的配列(要素数を宣言して配列を作成する)
  動的配列(ReDimとPreserve)
  Array関数で配列を作成する
取得する 配列の値をfor文で取得する
  複数のセルの値を配列で取得する (Range)
  要素数を取得する(Ubound)
変更する 配列の値を変更する
  配列を初期化する(Erase)
コピー 配列をコピーする
2次元 2次元配列を作成する

配列とは

a = Array( 値1 , 値2 , 値3 )

上記は複数の値を変数aに代入しています。
この変数aは配列として複数の値を持ちます。

静的配列(要素数を宣言して配列を作成する)

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

関連の記事

VBA For文のサンプル(Excel/Access)
VBA Do Loop文のサンプル(Excel/Access)
VBA For Each文のサンプル(Excel/Access)

△上に戻る