カテゴリー
Microsoft

【Excel VBA】配列をフラットなコレクションに変換する関数コード

Excel VBA には map reduce がございません。使いたいです (使いこなせているかどうかは別として)!これらのページ等を参考にすればできそうですの♪

map するためには、対象となる集合を用意する必要がございます。Excel VBA ですと配列、特に 2 次元配列を使うことが多いように感じます。これを map にかけるのは、、、なんだか難しそうですのでまずはコレクションで試してみたいですわ。

そのために、まずはコレクションを気軽に作れるようにしたいですわ♪そのようなわけで、どんな配列でもコレクションにする関数を書いてみましたの!

VBA コード

''' <summary>
''' 配列をフラットなコレクションに変換します。
''' </summary>
''' <param name="arr">変換対象配列</param>
''' <returns>フラットなコレクション</returns>
Public Function ArrayToCollection(ByVal arr As Variant) As Collection
    Set ArrayToCollection = New Collection
    ' 引数が配列でない場合は要素数 1 のコレクションとして返す。
    If Not IsArray(arr) Then
        Call ArrayToCollection.Add(arr)
        Exit Function
    End If

    Dim v As Variant
    For Each v In arr
        If IsArray(v) Then
            ' 配列の要素が配列の場合は再帰的に処理
            Dim c As Collection: Set c = ArrayToCollection(v)
            Dim v2 As Variant
            For Each v2 In c
                Call ArrayToCollection.Add(v2)
            Next v2
        Else
            Call ArrayToCollection.Add(v)
        End If
    Next v
End Function

Public Sub Test()
    ' 2次元配列
    Dim strArray(2, 2) As String
    strArray(0, 0) = "縦1横1"
    strArray(0, 1) = "縦1横2"
    strArray(0, 2) = "縦1横3"
    strArray(1, 0) = "縦2横1"
    strArray(1, 1) = "縦2横2"
    strArray(1, 2) = "縦2横3"
    strArray(2, 0) = "縦3横1"
    strArray(2, 1) = "縦3横2"
    strArray(2, 2) = "縦3横3"
    Dim c1 As Collection: Set c1 = ArrayToCollection(strArray)

    ' 擬似ジャグ配列
    Dim jagArray As Variant
    jagArray = Array(Array("a1", "b1", "c1"), Array("a2", "b2", "c2"), Array("a3", "b3", "c3"))
    Dim c2 As Collection: Set c2 = ArrayToCollection(jagArray)
    ' 深いジャグ配列
    Dim jagArray2 As Variant
    jagArray2 = Array(1, Array(2, Array(3, Array(4, Array(5), 6))), 7)
    Dim c3 As Collection: Set c3 = ArrayToCollection(jagArray2)

    ' 配列じゃない
    Dim str As String: str = "配列じゃない"
    Dim c4 As Collection: Set c4 = ArrayToCollection(str)

    Stop
End Sub

おまけ。他のアイデア

  • 引数が配列でなくてもエラーとならないようにするために (If を不要にするために)、最初に arr を Array 関数に入れて配列にしてしまっても良さそう。
  • 早いかどうか、パフォーマンスがよいかは知らない。むしろ悪そう。
  • 再帰プロシージャを作成する

おわりに

参考ページです。ありがとう存じます!

以上です。

「【Excel VBA】配列をフラットなコレクションに変換する関数コード」への2件の返信

コメントありがとう存じます。別の話題ですけれども、ページの考え方からワークシートのデータを VBA で簡単に扱う着想を得ることもできました。ご本人さまからコメントいただき大変光栄に、うれしく思います。