[VBA] ArrayList
Microsoft は .NET Framework とよばれるアプリケーション開発環境を提供 (Windows に標準搭載) していて、VBA でも .NET Framework のクラスの一部を利用することができます。その中の1つ、ArrayList は動的配列 (dynamic arrays) 機能を備えたクラスです。
要素の追加・削除
VBA の動的配列に比べると、ArrayList は柔軟で直感的な操作が可能です。Redim で要素数を確定する必要はなく、要素を追加 (または削除) すると配列サイズは自動的に調整されます。
Dim var As Variant
Dim mydata As Object
'Arraylistクラスのインスタンスを生成
Set mydata = CreateObject("System.Collections.ArrayList")
'Addメソッドで要素を追加
With mydata
.Add "こばと"
.Add "真理子"
.Add "涼音"
End With
'配列の中身を全て表示
For Each var In mydata
Debug.Print var,
Next var
'イミディエイトウィンドウで改行
Debug.Print vbCrLf; vbCrLf;
'3番目の要素を削除
mydata.Removeat 2
'もう一度、配列の中身を全て表示
For Each var In mydata
Debug.Print var,
Next var
End Sub
こばと 真理子
Arraylist のインデックスの下限値は 0 です。
Option Base の宣言は効きません。
上のコードにあるように、3 番目の要素を削除する場合は
と記述します。あるいは Removeメソッドを使って
と記述することもできます。あるいは要素の名前を使って削除することもできます。
Clearメソッドはすべての要素を削除します。
以下のコードは、要素を追加した直後と、要素をすべて削除した直後に Debug.Print で配列の中身をすべて表示させようとしますが、2 回目の命令実行時には要素がすべてなくなっているので何も表示されません。
Dim i As Long
Dim var As Variant
Dim mydata As Object
'Arraylistオブジェクトを生成
Set mydata = CreateObject("System.Collections.ArrayList")
'10,20,30を配列に格納
For i = 1 To 3
mydata.Add 10 * i
Next i
'配列の中身を全て表示
For Each var In mydata
Debug.Print var;
Next var
'すべての要素を削除
mydata.Clear
'もう一度、配列の中身を表示
For Each var In mydata
Debug.Print var;
Next var
End Sub
要素の参照
ArrayList の各要素は Itemメソッドを介して参照できます。あるいは、オブジェクトのインデックス番号から直接アクセスします。
Dim arr As Object
'Arraylistオブジェクトを生成
Set arr = CreateObject("System.Collections.ArrayList")
'要素を追加
With arr
.Add "Kobato"
.Add "Mariko"
.Add "Suzune"
.Add "Sayoko"
.Add "Koharu"
End With
'Itemメソッドで1番目の要素を参照
Debug.Print arr.Item(0)
'インデックスで3番目の要素にアクセス
Debug.Print arr(2)
End Sub
Suzune
要素数のカウント
Countメソッドで配列の要素数を取得できます。
Dim arr As Object
'Arraylistオブジェクトを生成
Set arr = CreateObject("System.Collections.ArrayList")
'要素を追加
With arr
.Add "Kobato"
.Add "Mariko"
.Add "Suzune"
End With
'要素数を表示
Debug.Print arr.Count
End Sub
要素を逆順に並び替える
Reverseメソッドを使うと、要素を逆順に並び替えることできます。
Dim i As Long
Dim var As Variant
Dim arr As Object
'Arraylistオブジェクトを生成
Set arr = CreateObject("System.Collections.ArrayList")
'要素を追加
For i = 1 To 5
arr.Add i
Next i
'配列の中身を表示
For Each var In arr
Debug.Print var;
Next var
'要素を逆順に並び替える
arr.Reverse
'イミディエイトウィンドウで改行
Debug.Print vbCrLf; vbCrLf;
'配列の中身を再び表示
For Each var In arr
Debug.Print var;
Next var
End Sub
5 4 3 2 1
配列のソート
Sortメソッドは配列をソートします (昇順に並び替えます)。数字であれば小さい順に、アルファベットであれば、a, b, c, ... のように並べます。
Dim var As Variant
Dim arr As Object
'Arraylistオブジェクトを生成
Set arr = CreateObject("System.Collections.ArrayList")
'要素を追加
With arr
.Add "え"
.Add "い"
.Add "あ"
.Add "お"
.Add "う"
End With
'配列をソート(昇順に並び替え)
arr.Sort
'配列の中身を表示
For Each var In arr
Debug.Print var;
Next var
End Sub
要素の挿入
Insertメソッドを使って、好きな位置に要素を挿入できます。
Dim var As Variant
Dim arr As Object
'Arraylistクラスのインスタンスを生成
Set arr = CreateObject("System.Collections.ArrayList")
'Addメソッドで要素を追加
With arr
.Add "こばと"
.Add "真理子"
.Add "涼音"
End With
'インデックス1の位置に新しい要素を挿入
arr.Insert 1, "沙希"
'配列の中身を表示
For Each var In arr
Debug.Print var,
Next var
End Sub
配列の連結
AddRangeメソッドを使うと、配列の末尾に別の配列を連結させることができます。
Sub ArrayList_addrange()
Dim i As Long
Dim var As Variant
Dim arr1 As Object, arr2 As Object
'Arraylistオブジェクトを生成
Set arr1 = CreateObject("System.Collections.ArrayList")
Set arr2 = CreateObject("System.Collections.ArrayList")
With arr1
.Add "すきやき"
.Add "とんかつ"
.Add "オムライス"
End With
With arr2
.Add "焼きそば"
.Add "ラーメン"
.Add "お好み焼き"
End With
'arr1とarr2を連結
arr1.AddRange arr2
'arr1の中身を全て表示
For Each var In arr1
Debug.Print var,
Next var
End Sub
焼きそば ラーメン お好み焼き
InsertRangeメソッドを使うと、インデックスを指定して別の配列を割り込ませることができます。
Dim var As Variant
Dim arr1 As Object
Dim arr2 As Object
'Arraylistクラスのインスタンスを生成
Set arr1 = CreateObject("System.Collections.ArrayList")
Set arr2 = CreateObject("System.Collections.ArrayList")
'arr1に要素を追加
With arr1
.Add "りんご"
.Add "オレンジ"
.Add "バナナ"
End With
'arr2に要素を追加
With arr2
.Add "メロン"
.Add "ぶどう"
End With
'arr1のインデックス1の位置にarr2を挿入
arr1.InsertRange 1, arr2
'arr1の中身を表示
For Each var In arr1
Debug.Print var,
Next var
End Sub
配列の複製
Cloneメソッドは配列の複製 (クローン) を生成します。
Dim var As Variant
Dim arr1 As Object
Dim arr2 As Object
'Arraylistクラスのインスタンスを生成
Set arr1 = CreateObject("System.Collections.ArrayList")
'arr1に要素を追加
With arr1
.Add "りんご"
.Add "オレンジ"
.Add "バナナ"
End With
'arr1の複製をarr2に格納
Set arr2 = arr1.Clone
'arr1の中身を表示
For Each var In arr2
Debug.Print var,
Next var
End Sub