[Excel]TEXTJOINカスタム関数

2020年5月4日

概要

TEXTJOIN関数のカスタム関数を作成しました。機能はExcel365やExcel2019のTEXTJOIN関数と同じです。

TEXTJOIN 関数は、複数の範囲や文字列からのテキストを結合し、結合する各テキスト値の間に、指定した区切り記号を挿入します。 区切り記号が空の文字列の場合は、範囲が連結されます。

Microsoftホームページ

下記のコードを標準モジュールに貼り付けることで、Excel2016以前のExcel(Excel2007,Excel2010,Excel2013など)でもTEXTJOIN関数を使用することが出来ます。貼り付け方は下記を参照してください。

他のサイトでも同じ趣旨のカスタム関数はありましたが、Microsoft純正関数と挙動が異なるものしか見つからなかったため、改めて書いてみました。

ソースコード

下記のコードを全てコピーし、標準モジュール等に貼り付けて下さい。下記のコード表示欄の右上に「Copy」ボタンがありますのでご使用下さい。なお、標準モジュールが何だか分からない方は、 Excelのカスタムワークシート関数を使用する方法 を参照して下さい。

'* @fn Public Function TEXTJOIN(ByRef Delimiter As Variant, ByVal IgnoreEmpty As Boolean, ParamArray Params() As Variant) As Variant
'* @brief Excel365・Excel2019のTEXTJOIN関数をExcel2016以前で使用可能にします。
'* @param[in] Delimiter     テキスト文字列、空、または二重引用符で囲まれた1つ以上の文字、または有効なテキスト文字列への参照。 数値を指定すると、文字列として扱われます。
'* @param[in] IgnoreEmpty   TRUE の場合、空のセルは無視されます。
'* @param[in] Params        結合するテキスト項目。 文字列またはセルの範囲などの文字列の配列。最大 252 のテキスト引数を設定できます。
'* @return Variant 結合した文字列。
'* @details TEXTJOIN関数は、複数の範囲や文字列からのテキストを結合し、結合する各テキスト値の間に、指定した区切り記号を挿入します。 区切り記号が空の文字列の場合は、範囲が連結されます。
'*
Public Function TEXTJOIN(ByRef Delimiter As Variant, ByVal IgnoreEmpty As Boolean, ParamArray Params() As Variant) As Variant
    
    Dim v As Variant
    Dim r As Range
    Dim Param As Variant
    Dim ParamType As VbVarType
    Dim Text As String
    
    Dim Row As Long
    Dim Col As Long
    Dim ColsCount As Long
    
    
    For Each Param In Params
        ParamType = VarType(Param)
        
        If (ParamType And vbArray) Then
            
            '参照配列の結合処理
            If (TypeName(Param) = "Range") Then
                Set r = Param
                v = r.Value2
                ColsCount = r.Columns.Count
                
                For Row = 1 To UBound(v)
                    For Col = 1 To ColsCount
                        Text = CStr(v(Row, Col))
                        GoSub Join
                    Next
                Next
            
            '2次元配列定数の結合処理
            ElseIf (True) Then
                
                '配列が一次元なら一次元配列用の処理へ移行
                On Error GoTo LinearArray
                ColsCount = UBound(Param, 2)
                
                For Row = 1 To UBound(Param, 1)
                    For Col = 1 To ColsCount
                        Text = CStr(Param(Row, Col))
                        GoSub Join
                    Next
                Next
            
            '1次元配列定数の結合処理
            Else
LinearArray:
                For Row = 1 To UBound(Param)
                    Text = CStr(Param(Row))
                    GoSub Join
                Next
            End If
        
        '単一参照結合処理
        ElseIf (ParamType = vbObject) Then
            Set r = Param
            Text = CStr(r.Value2)
            GoSub Join
                        
        '定数結合処理
        Else
            Text = CStr(Param)
            GoSub Join
        End If
        
    Next
    
    '先頭の区切り文字削除
    TEXTJOIN = Mid(TEXTJOIN, Len(Delimiter) + 1)
    
    Exit Function
Join:
    If (IgnoreEmpty) Then
        If (Text <> "") Then TEXTJOIN = TEXTJOIN & Delimiter & Text
    Else
        TEXTJOIN = TEXTJOIN & Delimiter & Text
    End If
    
    Return
End Function

ソースコードの利用について

本ソースコードは「GPL v3.0(GNU General Public License Version 3.0)」ライセンスで利用可能です。

本ソースコードを私的に利用される方は、本ソースコードが無料で利用できると考えて差し支え御座いません。下記の著作権表示をソースコード内に表示して頂ければ幸いです。

Copyright © 2017 黒い箱の中 All Rights Reserved.(https://kuroihako.com/)

本ホームページのソースコードを利用したソフトウェアを商用利用したり、ホームページ等で一般公開する方は、本ホームページのソフトウェアまたはソースコードに適用されているライセンスをご理解頂いてからご使用ください。同ライセンス以外での利用をご希望の方はお問い合わせフォームよりご連絡下さい。