EXCEL VBA - 配列の操作

配列の初期化

配列を初期化する方法には主に 2 つの方法があります。Erase ステートメントを使う方法と Array 関数を使う方法です。

Erase ステートメントは、配列のデータ型によって初期化される初期値が以下のとおり異なります。

  • 数値配列:0
  • 文字列配列:空文字
  • オブジェクト配列:Nothing
  • バリアント配列:Empty
Dim List(3) As Integer

Erase List
配列の初期化

Erase ステートメントでの初期化は、すべての要素が決まった値で初期化されます。一方、Array 関数での初期化は、要素の値を個別に指定することができます。ただし、動的配列かつ、データ型はバリアント型に限ります。

Dim List() As Variant

List = Array(0, 1, 2, 3)
配列の初期化

動的配列である場合、ReDim ステートメントを使って初期化を行うこともできます。

Dim List() As Variant

ReDim List(0)
配列の初期化

配列のコピー

配列をコピーする場合、コピー先が静的配列か動的配列かでコピーする方法が異なります。静的配列の場合、各要素は繰り返し処理によってコピーしなければなりません。

Dim List1(2) As Integer
Dim List2(2) As Integer

List1(0) = 0
List1(1) = 1
List1(2) = 2

Dim i As Integer
For i = LBound(List1) To UBound(List1)
    List2(i) = List1(i)
Next i
配列のコピー

動的配列の場合、繰り返し処理による同様のコピーもできますが、代入による設定も可能です。ただし、コピー先の配列は、要素数を定義しない配列に限ります。なお、VBA における配列のコピーは、値渡しのコピーになります。

Dim List1() As Variant
Dim List2() As Variant

ReDim List1(2)
List1(0) = 0
List1(1) = 1
List1(2) = 2

List2 = List1
配列のコピー

要素の追加と削除

配列の要素を追加するには ReDim Preserve ステートメントを使用します。

Dim List() As Variant
List = Array(1, 2, 3)

ReDim Preserve List(3)
List(3) = 4
配列の要素を追加する

VBA には配列の要素を削除するための関数はありません。そのため、以下のように手動で削除します。

Dim List() As Variant
List = Array(1, 2, 3, 4, 5)

'' 3番目の要素を削除する
Dim i As Integer
For i = 2 To UBound(List) - 1
    List(i) = List(i + 1)
Next i

ReDim Preserve List(UBound(List) - 1)
配列の要素を削除する

要素の結合

配列の要素を結合するには、Join 関数を使用します。

Dim List(2) As String
List(0) = "a"
List(1) = "b"
List(2) = "c"

Dim str As String
str = Join(List, "")
配列の要素を結合する

要素を結合する際に、区切り文字を設定するには Join 関数の引数に定義します。例えば、以下のコードでは区切り文字に , を定義しています。

Dim List(2) As String
List(0) = "a"
List(1) = "b"
List(2) = "c"

Dim str As String
str = Join(List, ",")
配列の要素を結合する

配列同士を結合するには、Split 関数と Join 関数を使用します。

Dim List1() As Variant
List1 = Array("1", "2")

Dim List2() As Variant
List2 = Array("3", "4", "5")

Dim List3 As Variant
List3 = Split(Join(List1) & " " & Join(List2))
配列の同士を結合する

Join 関数を使用することで配列同士の比較をすることもできます。

Dim List1() As Variant
List1 = Array("1", "2")

Dim List2() As Variant
List2 = Array("3", "4", "5")

If Join(List1) = Join(List2) Then
    Debug.Print ("配列は同じです")
Else
    Debug.Print ("配列は異なります")
End If
配列の同士を比較する

配列の要素を検索

配列の要素の中から条件に一致する要素が含まれているか検索するには Filter 関数を使用します。

Dim List() As Variant
List = Array("北海道", "東京都", "愛知県", "京都府")

Dim Var As Variant
Var = Filter(List, "京", True)
配列の要素を検索

上記の例では、「京」が含まれる文字列(東京都と京都府)が配列として返ります。

要素の並べ替え

VBA には配列の要素を並び替える関数は用意されていません。そのため、以下のように手動で並び替える必要があります。以下は、ソート方法のひとつであるクイックソートです。

Sub QuickSort(ByRef data As Variant, ByVal low As Long, ByVal high As Long)
    Dim l As Long
    Dim r As Long
    l = low
    r = high

    Dim pivot As Variant
    pivot = data((low + high) \ 2)

    Dim temp As Variant
    
    Do While (l <= r)
        Do While (data(l) < pivot And l < high)
            l = l + 1
        Loop
        Do While (pivot < data(r) And r > low)
            r = r - 1
        Loop
    
        If (l <= r) Then
            temp = data(l)
            data(l) = data(r)
            data(r) = temp
            l = l + 1
            r = r - 1
        End If
    Loop
    
    If (low < r) Then
        Call QuickSort(data, low, r)
    End If
    If (l < high) Then
        Call QuickSort(data, l, high)
    End If
End Sub


Sub main()
    Dim data As Variant
    data = Array(7, 2, 6, 3, 9, 1, 8, 0, 5, 4)
    Call QuickSort(data, LBound(data), UBound(data))
End Sub
クイックソート

関連記事