【VBA】ArrayList
Microsoft は .NET Framework とよばれるアプリケーション開発環境を提供 (Windows に標準搭載) していて、VBA でも .NET Framework のクラスの一部を利用することができます。その中の1つ、ArrayListは動的配列 (dynamic arrays) 機能を備えたクラスです。
要素の追加・削除
VBA の動的配列に比べると、ArrayListは柔軟で直感的な操作が可能です。Redim で要素数を確定する必要はなく、要素を追加 (または削除) すると配列サイズは自動的に調整されます。
'VBA Arraylist Add sample_code Sub ArrayList_add() 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_add の実行結果: 'こばと 真理子 涼音 'こばと 真理子
Arraylist のインデックスの下限値は 0 です。
Option Base の宣言は効きません。
上のコードにあるように、3 番目の要素を削除する場合は
mydata.Removeat 2
と記述します。あるいは Removeメソッドを使って
mydata.Remove mydata(2)
と記述することもできます。あるいは要素の名前を使って削除することもできます。
mydata.Remove "涼音"
Clearメソッドはすべての要素を削除します。
以下のコードは、要素を追加した直後と、要素をすべて削除した直後に Debug.Print で配列の中身をすべて表示させようとしますが、2 回目の命令実行時には要素がすべてなくなっているので何も表示されません。
'VBA Arraylist Clear sample_code Sub ArrayList_clear() 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_clear の実行結果: '10 20 30
要素の参照
ArrayList の各要素は Itemメソッドを介して参照できます。あるいは、オブジェクトのインデックス番号から直接アクセスします。
'VBA Arraylist Item sample_code 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 'Arraylist_item の実行結果: 'Kobato 'Suzune
要素数のカウント
Countメソッドで配列の要素数を取得できます。
'VBA Arraylist Count sample_code Sub ArrayList_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 'ArrayList_count の実行結果: '3
要素を逆順に並び替える
Reverseメソッドを使うと、要素を逆順に並び替えることできます。
'VBA Arraylist Reverse sample_code Sub ArrayList_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 'ArrayList_reverse の実行結果: '1 2 3 4 5 '5 4 3 2 1
配列のソート
Sortメソッドは配列をソートします (昇順に並び替えます)。数字であれば小さい順に、アルファベットであれば、a, b, c, ... のように並べます。
'VBA Arraylist Sort sample_code Sub ArrayList_sort() 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 'ArrayList_sort の実行結果: 'あいうえお
要素の挿入
Insertメソッドを使って、好きな位置に要素を挿入できます。
'VBA Arraylist Insert sample_code Sub ArrayList_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 'ArrayList_insert() の実行結果: 'こばと 沙希 真理子 涼音
配列の連結
AddRangeメソッドを使うと、配列の末尾に別の配列を連結させることができます。
'VBA Arraylist Addrange sample_code '配列の連結 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 'ArrayList_addrange の実行結果: 'すきやき とんかつ オムライス '焼きそば ラーメン お好み焼き
InsertRangeメソッドを使うと、インデックスを指定して別の配列を割り込ませることができます。
'VBA Arraylist Insertrange sample_code Sub arraylist_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 'arraylist_insertrange の実行結果: 'りんご メロン ぶどう オレンジ バナナ
配列の複製
Cloneメソッドは配列の複製 (クローン) を生成します。
'VBA Arraylist Clone sample_code Sub ArrayList_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 'ArrayList_clone の実行結果: 'りんご オレンジ バナナ
コメント