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

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

目次

仕組み 配列とは
作成する 静的配列を作成 / 動的配列を作成 / Array関数で作成
取得する ForEach文、For文で要素を取得 / セルの値を取得 / 要素を検索 / 要素数を取得
変更する 配列の値を変更 / Eraseで配列を初期化(動的配列と静的配列の違い)
コピー 配列をコピー

配列とは

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

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

コピー先の配列の値を変更してもコピー元の配列の値は変更されません。

関連の記事

VBA For文のサンプル(Excel/Access)
VBA 2次元配列のサンプル

△上に戻る