【EXCEL VBA】Collectionについてまとめて知りたい 応用編(要素挿入、入れ子、再帰処理)

以下記事で紹介した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
かきくけこ
さしすせそ
たちつてと
はひふへほ