カテゴリー
Microsoft

【Excel VBA】コレクションを配列に変換するコード

VBA コード

  • CollectionToArrary の返却値は Variant だが、本当はどんな型なのか限定させたかった。。。
  • 汎用性を考慮して、また、Arrary(“い”, “ろ”, “は”) などで配列を生成するときは Variant の変数とすることを考慮して、CollectionToArrary の返却値は Variant に決定した。
  • ループ内で ReDim して配列サイズを毎回変更することはしないようにした。
  • 要素を回すのに、元となるコレクションをループする方法と、作られる配列をループする方法とがある。今回、コレクションをループする方法を採った。
    • コレクションのインデックスは必ず 1 から始まる。配列のインデックスの開始は配列の定義時に自由に設定できる。
    • 配列をループしてそのインデックスに対応するコレクションのインデックスを計算して取り出すよりも、コレクションをループして配列の開始インデックスをインクリメントしていく形で要素を詰め込んでいく方がシンプルに書ける。
    • よって、ループする前に LBound で配列の最低のインデックスを取得して変数に代入しておき、ループ内の最後で変数を + 1 することで配列の添字を動かしていく。

コード内の CollectionToArrary メソッドが本投稿のメイン部分で、Test メソッドはそれを確かめる箇所となりますわ。

Option Explicit

' 確認用コード
Public Sub Test()
  ' 返還前コレクションの準備
  Dim colBefores As Collection
  set colBefores = New Collection
  Call colBefores.Add("い")
  Call colBefores.Add("ろ")
  Call colBefores.Add("は")

  ' 変換処理
  Dim vntAfters As Variant
  vntAfters = CollectionToArray(colBefores)

  ' 返還後の確認。ウォッチ式に追加してデバッグするとよりよく確認できる。
  Dim i As Long
  For i = LBound(vntAfters) To UBound(vntAfters)
    Debug.Print vntAfters(i)
  Next i
End Sub

''' <summary>
''' コレクションを 1 次元配列に変換します。
''' 配列のインデックスは 0 から始まります。
''' </summary>
''' <param name="colTarget">変換対象コレクション</param>
''' <returns>変換した 1 次元配列</returns>
Public Function CollectionToArray(ByVal colTarget As Collection) As Variant
  Dim vntResult As Variant
  ReDim vntResult(colTarget.Count - 1)

  Dim i As Long
  i = LBound(vntResult)
  Dim v As Variant
  For Each v In colTarget
    vntResult(i) = v
    i = i + 1
  Next v

  CollectionToArray = vntResult
End Function

おわりに

上記の方法を使って一気にワークシートに VBA で生成した文字列のコレクションを書き込みたく存じました。

そのためには配列を用意する必要がございますけれども、手元にあったのは Collection でしたの><。

そのようなことがあり、呼び出すだけで気軽にコレクションを配列に変換するメソッドを書きました!

なお、ReDim で配列サイズを決定する方法は、以前の次の投稿の経験が役立ちました♪

以上です。

コメントを残す