ParamArrayでTEXTJOINを再現

昨日は、「ユーザー定義関数の引数を、ループで取り出せればいいのに」とボヤいてみた。すると複数の方から、以下のアドバイスをいただいた。

ParamArrayを使ってみてはどうでしょう。

何ですか?それは。
調べてみると、まさに今回のような場合に打ってつけじゃないか!
(アドバイスをくださった皆様、ありがとうございます)。
www.moug.net
そこで今回は改めて、これを用いてTEXTJOIN関数をマクロで再現してみた。
f:id:Infoment:20190610192539p:plain

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

早速試してみると・・・上手くいったようだ。
f:id:Infoment:20190610192913g:plain

ちなみに、はけたさんからは、このようなサイトも紹介していただいた。
(いつも有難うございます)。
github.com

TEXTJOIN関数はExcel2013以前は未サポートとのことで、既にこのように便利なアドインが世に出ていたようだ。ということで、今回は(も?)、自分の勉強用ってことで。

参考まで。