【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 の実行結果: 'りんご オレンジ バナナ
コメント
VBAのArrayListをAIが解説します
[ChatGPT] VBA(Visual Basic for Applications)は、Microsoft Office製品(Excel、Word、Accessなど)のマクロ言語です。VBAでは、データの格納や操作に便利なデータ構造としてArrayListが使用されます。ArrayListは可変長のデータコレクションであり、異なるデータ型の要素を格納できます。以下に、VBAのArrayListに関する基本的な情報と操作方法を説明します。
ArrayListの宣言と初期化:ArrayListを使用するには、まずArrayListオブジェクトを宣言して初期化する必要があります。次のように宣言します。
要素の追加:ArrayListに要素を追加するには、Addメソッドを使用します。要素は末尾に追加されます。例えば、数値や文字列を追加する場合は次のようにします。
要素の取得と変更:ArrayListの要素には、インデックスを指定してアクセスできます。インデックスは0から始まります。次の例では、要素の取得と変更を示します。
要素の削除:ArrayListから要素を削除するには、Removeメソッドを使用します。次の例では、インデックスを指定して要素を削除しています。
要素数の取得:ArrayListの要素数は、Countプロパティを使用して取得できます。
ループ処理:ArrayListの要素をループ処理するには、For Each文を使用します。次の例では、すべての要素を順に表示しています。
以上が、VBAのArrayListの基本的な使用方法です。ArrayListは、要素の追加や削除が容易で、柔軟なデータ操作が可能なため、VBAプログラミングで非常に便利です。