和風スパゲティのレシピ

日本語でコーディングするExcelVBA

Collectionを配列(Array)に変換する

Collectionを配列に変換する方法を解説します。

標準機能にはないため、愚直に全要素を配列へ出力して変換します。

Collectionを二次元配列に変換する

Collectionを配列に変換したい状況としては、
セルへの一括出力を行いたい場合が多いと推測します。

この場合は二次元配列に変換する必要があるため、
まずはこちらのコードから紹介します。

ソースコード

Sub Collectionを二次元配列に変換する()

    Dim コレクション As New Collection
    コレクション.Add "みかん"
    コレクション.Add "りんご"
    コレクション.Add "いちご"
    コレクション.Add "さくらんぼ"
    
    ' 二次元配列に変換
    Dim 二次元配列()
    ReDim 二次元配列(1 To コレクション.Count, 1 To 1)
        
    Dim i As Long: i = 1
    Dim 要素
    For Each 要素 In コレクション
        二次元配列(i, 1) = 要素
        i = i + 1
    Next
    
    ' サンプル:A2セルより↓へ出力
    Range("A2").Resize(コレクション.Count).Value = 二次元配列

End Sub

解説

セルに出力する用の二次元配列は、
縦方向であれば一次元目、横方向であれば二次元目を伸ばす必要があります。

行方向に出力する場合はn行×1列の配列にしてください。


あとはFor Each文でコレクションの要素をすべてループし、
配列に代入していくだけですね。


一応注意点として、
CollectionはFor文でループすると処理速度がかなり遅くなるという特徴があります。


セルに一括出力したい場合は相応にデータ量が大きい場合が多く、
これをFor文で回してしまうとかなり遅くなる危険があります。

Collectionのこの仕様には注意してください。

汎用関数化

この処理をよく行う場合は、汎用関数にしておくのがおすすめです。

' Collection→二次元配列の汎用関数
Function Collectionを二次元配列へ変換(コレクション As Collection) As Variant

    ' コレクションが空なら空の配列を返す
    If コレクション.Count = 0 Then
        Collectionを二次元配列へ変換 = Array()
        Exit Function
    End If

    Dim 生成配列()
    ReDim 生成配列(1 To コレクション.Count, 1 To 1)
        
    Dim i As Long: i = 1
    Dim 要素
    For Each 要素 In コレクション
        生成配列(i, 1) = 要素
        i = i + 1
    Next

    Collectionを二次元配列へ変換 = 生成配列

End Function
' 汎用関数の使用サンプル
Sub Collectionを二次元配列に変換する_汎用関数版()

    Dim コレクション As New Collection
    コレクション.Add "みかん"
    コレクション.Add "りんご"
    コレクション.Add "いちご"
    コレクション.Add "さくらんぼ"
    
    ' 二次元配列に変換
    Dim 二次元配列
    二次元配列 = Collectionを二次元配列へ変換(コレクション)
    
    ' サンプル:A2セルより↓へ出力
    Range("A2").Resize(コレクション.Count).Value = 二次元配列

End Sub

このように汎用関数化することで、
今後の配列化コードを1行で終わらせることができます。

こういった汎用関数は積極的に活用していきましょう。


セルの出力までを汎用関数化するのもおすすめです。

' Collection → セル範囲
Sub Collectionをセルに一括出力する(出力コレクション As Collection _
    , 出力起点セル As Range, Optional is行方向に出力 As Boolean = True)

    ' 一旦Collectionを二次元配列に変換
    Dim 二次元配列()
    If is行方向に出力 Then
        ReDim 二次元配列(1 To コレクション.Count, 1 To 1)
    Else
        ReDim 二次元配列(1 To 1, 1 To コレクション.Count)
    End If
    
    Dim i As Long: i = 1
    Dim 要素
    For Each 要素 In コレクション
        If is行方向に出力 Then
            二次元配列(i, 1) = 要素
        Else
            二次元配列(1, i) = 要素
        End If
        i = i + 1
    Next
    
    ' 二次元配列をセルに出力
    If is行方向に出力 Then
        出力起点セル.Resize(コレクション.Count, 1).Value = 二次元配列
    Else
        出力起点セル.Resize(1, コレクション.Count).Value = 二次元配列
    End If
    
End Sub
' 使用例
Sub Collectionを汎用関数でセルに一括出力する()

    Dim コレクション As New Collection
    コレクション.Add "みかん"
    コレクション.Add "りんご"
    コレクション.Add "いちご"
    コレクション.Add "さくらんぼ"
    
    ' 縦方向へ出力
    Call Collectionをセルに一括出力する(コレクション, Range("A2"))

    ' 横方向へ出力
    Call Collectionをセルに一括出力する(コレクション, Range("B1"), False)

End Sub

Collectionを一次元配列に変換する

続いて一次元配列に変換する方法です。

Collectionは「一度入れた要素を書き替えできない」という性質があるため、
これに対応する場合は一次元配列に変換を行います。

Sub Collectionを一次元配列に変換する()

    Dim コレクション As New Collection
    コレクション.Add "みかん"
    コレクション.Add "りんご"
    コレクション.Add "いちご"
    コレクション.Add "さくらんぼ"
    
    ' 二次元配列に変換
    Dim 一次元配列()
    ReDim 一次元配列(1 To コレクション.Count)
        
    Dim i As Long: i = 1
    Dim 要素
    For Each 要素 In コレクション
        一次元配列(i) = 要素
        i = i + 1
    Next
    
    ' サンプル:書き替えが可能に
    一次元配列(2) = "ぶどう"
    
    ' コレクション(2) = "ぶどう" ' ←ちなみにこれはエラー
    
End Sub

二次元配列とほぼ同じコードですね。


これは好みになるかもしれませんが、
配列のLBoundは0ではなく1にしておくのをおすすめします。

変換の前後でコレクションとIndexがズレてしまうと混乱しやすいため、
同じIndexで管理しておきましょう。


この処理もよく行う方は、汎用関数化がおすすめです。

' Collection→一次元配列の汎用関数
Function Collectionを一次元配列へ変換(コレクション As Collection) As Variant

    ' コレクションが空なら空の配列を返す
    If コレクション.Count = 0 Then
        Collectionを一次元配列へ変換 = Array()
        Exit Function
    End If

    Dim 生成配列()
    ReDim 生成配列(1 To コレクション.Count)
        
    Dim i As Long: i = 1
    Dim 要素
    For Each 要素 In コレクション
        生成配列(i) = 要素
        i = i + 1
    Next

    Collectionを一次元配列へ変換 = 生成配列

End Function

' 汎用関数の使用サンプル
Sub Collectionを一次元配列に変換する_汎用関数版()

    Dim コレクション As New Collection
    コレクション.Add "みかん"
    コレクション.Add "りんご"
    コレクション.Add "いちご"
    コレクション.Add "さくらんぼ"
    
    ' 二次元配列に変換
    Dim 一次元配列
    一次元配列 = Collectionを一次元配列へ変換(コレクション)
    
    ' サンプル:書き替えが可能に
    一次元配列(2) = "ぶどう"

End Sub