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