以下記事で紹介したCollection基礎編は確認していただいたでしょうか?今回は応用編となります。
要素挿入(Add before, Add after)
要素追加はAdd関数を利用しました。何も指定をしなければ一番最後の要素として追加されます。Collectionの途中に要素を挿入したい場合は、before または afterで指定したIndex(またはキー)の前後に要素を挿入することができます。
入れ子、再帰処理
Collectionに追加できるのは、文字列や数値だけではありません。オブジェクトも追加することができます。つまりCollectionも追加できることができます。Collectionを入れ子に追加することで、より複雑な構造を定義することができます。よって再帰処理も簡単に記載することとができます(やや制約はありますが・・)。今回はPrintCollection関数にて再帰処理を表現していますので確認してみてください。
サンプルプログラム
Sub sample()
Dim i As Long
Dim list As New Collection
list.Add "あいうえお"
list.Add "さしすせそ"
list.Add "はひふへほ"
' 全要素表示
PrintCollection list
Debug.Print vbCrLf
' Index(1)の後に要素を追加 → "あいうえお"の後に要素を追加
list.Add "かきくけこ", after:=1
PrintCollection list
Debug.Print vbCrLf
' Index(4)の前に要素を追加 → "はひふへほ"の前に要素を追加
list.Add "たちつてと", before:=4
PrintCollection list
Debug.Print vbCrLf
' 要素にCollectionを追加(入れ子)
Dim childList As New Collection
childList.Add "ABC"
childList.Add "DEF"
list.Add childList, after:=1
Dim grandChildList As New Collection
grandChildList.Add "ghi"
grandChildList.Add "jkl"
childList.Add grandChildList, after:=1
Debug.Print list.item(2).item(1) ' ABC
Debug.Print list.item(2).item(3) ' DEF
Debug.Print list.item(2).item(2).item(1) ' ghi
Debug.Print list.item(2).item(2).item(2) ' jkl
Debug.Print vbCrLf
PrintCollection list
End Sub
' Collectionの入れ子を前提とした出力
Sub PrintCollection(list As Collection, Optional indent As Integer = 0)
Dim i As Long
For i = 1 To list.Count
If TypeName(list.item(i)) = "Collection" Then
PrintCollection list.item(i), indent + 2
Else
Debug.Print Space(indent) & CStr(list.item(i))
End If
Next
End Sub
出力結果
あいうえお
さしすせそ
はひふへほ
あいうえお
かきくけこ
さしすせそ
はひふへほ
あいうえお
かきくけこ
さしすせそ
たちつてと
はひふへほ
ABC
DEF
ghi
jkl
あいうえお
ABC
ghi
jkl
DEF
かきくけこ
さしすせそ
たちつてと
はひふへほ