Excel VBA には map reduce がございません。使いたいです (使いこなせているかどうかは別として)!これらのページ等を参考にすればできそうですの♪
- Excel VBA を学ぶなら moug モーグ | 即効テクニック | 指定されたオブジェクトのメソッドの実行/プロパティの値の取得/設定を行う(CallByName関数)
- いげ太の日記: [VBA] 長い長い FizzBuzz
- VBAHaskell ユーティリティを使ってみる – mmYYmmdd’s blog
map するためには、対象となる集合を用意する必要がございます。Excel VBA ですと配列、特に 2 次元配列を使うことが多いように感じます。これを map にかけるのは、、、なんだか難しそうですのでまずはコレクションで試してみたいですわ。
そのために、まずはコレクションを気軽に作れるようにしたいですわ♪そのようなわけで、どんな配列でもコレクションにする関数を書いてみましたの!
VBA コード
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 | ''' <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 で簡単に扱う着想を得ることもできました。ご本人さまからコメントいただき大変光栄に、うれしく思います。