ParamArrayでTEXTJOINを再現
昨日は、「ユーザー定義関数の引数を、ループで取り出せればいいのに」とボヤいてみた。すると複数の方から、以下のアドバイスをいただいた。
ParamArrayを使ってみてはどうでしょう。
何ですか?それは。
調べてみると、まさに今回のような場合に打ってつけじゃないか!
(アドバイスをくださった皆様、ありがとうございます)。
www.moug.net
そこで今回は改めて、これを用いてTEXTJOIN関数をマクロで再現してみた。
Function Text_Join(delimiter As String, _ ignore_blank As Boolean, _ rng1 As Range, _ ParamArray additional_range()) As String Dim col As Collection Set col = New Collection Dim i As Long ' 一つ目の指定範囲にある各セルの値をコレクションに格納。 For i = 1 To rng1.Count col.Add rng1.Item(i).Value Next ' 二つ目以降の指定範囲があれば、各範囲・各セルの値を ' コレクションに格納。 Dim tempRange As Variant For Each tempRange In additional_range For i = 1 To tempRange.Count col.Add tempRange.Item(i).Value Next Next ' 空白を無視する場合、コレクションからEmptyを除去。 If ignore_blank = True Then For i = col.Count To 1 Step -1 If IsEmpty(col.Item(i)) = True Then col.Remove (i) End If Next End If ' コレクションを一旦配列にしたうえで結合。 Dim arr As Variant ReDim arr(1 To col.Count) For i = 1 To col.Count arr(i) = col.Item(i) Next Text_Join = Join(arr, delimiter) End Function
早速試してみると・・・上手くいったようだ。
ちなみに、はけたさんからは、このようなサイトも紹介していただいた。
(いつも有難うございます)。
github.com
TEXTJOIN関数はExcel2013以前は未サポートとのことで、既にこのように便利なアドインが世に出ていたようだ。ということで、今回は(も?)、自分の勉強用ってことで。
参考まで。