No Programming, No Life

プログラミング関連の話題や雑記

VBA(Excel)で文字列結合(Join)する関数

f:id:fumokmm:20200504205857p:plain

TEXTJOIN関数が使えないときに使うため、文字列結合関数を書きました。 エラー処理などは省略していますので、実用の際は適当に拡張してお使い下さい。

概要

イメージとしては、[引数1, 引数2, 引数3...] となった時に、"引数1, 引数2, 引数3, ..." という文字列を返却してくれる関数ということです。 Excelの標準関数にTEXTJOINというのが追加されましたが、こちらはMicrosoft 365でしか使えないのかな?よくわかりません。なので、 TEXTJOINが使えないときにサクっと使えるようにするため、StrJoinという関数を書きました。

仕様

  • 引数で指定された内容を指定された結合文字列で繋いだ文字列を返却する
  • 値数式で参照可能
  • 範囲でも指定可能
  • 直接指定可能
  • 接続文字、先頭、末尾文字を指定可能

ソース

Option Explicit

''
' 文字列の結合関数
'
' 処理概要:
'   文字列の結合を行います。
'   特徴
'     ・値数式で参照可能
'     ・範囲でも指定可能
'     ・直接指定可能
'     ・接続文字、先頭、末尾文字を指定可能
'
' 引数:
'  x_startStr  - 開始文字列
'  x_endStr    - 終了文字列
'  x_joinStr   - 接続文字列
'  x_values    - 文字列や範囲(複数指定可)
'
Public Function StrJoin(x_startStr As String, x_endStr As String, x_joinStr As String, ParamArray x_values() As Variant) As String
    Dim p_result As String: p_result = ""
    Dim p_ratch As Boolean: p_ratch = False
    Dim p_value As Variant
    For Each p_value In x_values
        If TypeName(p_value) = "Range" Then
            Dim p_RangeValue As Range: Set p_RangeValue = p_value
            Dim p_rng As Range
            For Each p_rng In p_RangeValue
                If p_ratch Then p_result = p_result & x_joinStr Else p_ratch = True
                p_result = p_result & p_rng.Value
            Next p_rng
        Else
            If p_ratch Then p_result = p_result & x_joinStr Else p_ratch = True
            p_result = p_result & CStr(p_value)
        End If
    Next p_value
    StrJoin = x_startStr & p_result & x_endStr
End Function

挙動とは関係ないですが、VBEのエディタが貧弱なので、変数名に以下のコーディングルールを採用しています。

  1. 引数の変数名は "x_" で始める。その後ろは自由
  2. ローカル変数名は "p_" で始める。その後ろは自由

上記コードもこのルールで記述しています。

リポジトリ

github.com

利用例(デモ)

f:id:fumokmm:20200714135453g:plain

まとめ

  • Excel関数としても利用できます
  • TEXTJOINが使えるときは、そちらを使ったほうがいいかもしれません

参考