CONCAT 関数 / TEXTJOIN 関数


ここで解説する CONCAT関数 と TEXTJOIN関数 は、Excel 2016のProPlusに追加された関数です。Professional Plusなどでは使用できません。ProPlusなどに関しては、

Excel 2016レビュー「Office 2016は3種類ある

を、ご覧ください。

どちらも、セル内の文字列を結合する関数です。従来から使用できたCONCATENATE関数の拡張版ですね。まず、今までの文字列結合を振り返ってみましょう。

上図のように、複数のセルに入力されている文字列を結合するには、CONCATENATE関数か&演算子を使いました。

いずれにしても、入力されているセルをカンマで区切って、ひとつずつ指定しなければなりませんでした。これ、3つくらいならいいですけど、もっと多かったら面倒くさいです。「ったく!こっからここまで全部結合みたくできねーのかよ」と、Excelに悪態をついたのは私だけじゃないはずです。ちなみに、そのような動作を実現するマクロを作ったりもしました。

あるいは、ただ結合するだけでなく「A-B-C」みたいに、別の文字を区切りとして挿入するとなれば、これはもう&演算子を使って、地道にやるしか手はありませんでした。ああ、なんと古典的なやりかたなのでしょう。とても令和の時代には相応しくありません。

こうした文字列結合を拡張したのがCONCAT関数とTEXTJOIN関数です。順番に解説します。

CONCAT関数

使い方は簡単。引数に、ただセル範囲を指定するだけです。

まぁ、ほとんどの場合は、これで用が足りると思いますが、一応引数には、複数の文字列を指定できるので、こんなことや

こんなことも可能です。

CONCAT関数に関しては以上です。これで作業が楽になる人も多いのでは。なお、CONCAT関数が追加されたことで、今までのCONCATENATE関数は「これからは、これ使わないでね~」的な扱いになりました。使ってもいいですけど。

TEXTJOIN関数

引数「区切り文字」には区切り文字を指定します。たとえば「A-B-C」のようにハイフンで区切るのなら"-"を、「A,B,C」のようにカンマで区切るのなら","です。スペースも指定できます。区切り文字を別のセルに入れておき、そのセルを参照することも可能です。空欄("")を指定すると、文字列が区切られず「ABC」のようになります。

引数「空のセルは無視」には、もし指定したセル範囲内にブランクセルがあった場合、そのブランクセルをスキップして、区切り記号も表示しないのか、ブランクセルはスキップするものの、区切り記号は表示するのかを指定します。これは、実際の違いを見ると分かりやすいです。ああ、ちなみに引数「文字列」のところに、結合したい文字列が入力されているセル範囲を指定します。

一般的には、TRUEを指定することが多いと思います。

VBAから使える

CONCAT関数やTEXTJOIN関数は、VBAからWorksheetFunctionで呼び出すことができます。特にTEXTJOIN関数は超便利です。VBAには以前からJoin関数がありました。Join関数は、配列内の文字列を結合します。

Sub Macro1()
    Dim A(2) As String
    A(0) = "A"
    A(1) = "B"
    A(2) = "C"
    MsgBox Join(A, "-")
End Sub

あまり知られていないJoin関数ですが、おそらくその原因は、結合する元の文字列が必ず1次元配列に入っていなければならないという仕様です。今回のように、結合する文字列がセルに入力されているときでも、Join関数の引数にセル範囲を直接指定することはできません。なぜなら、セル範囲は2次元配列になるからです。

これができたら、どれほど便利だろう…と、何度も神様にお祈りしましたがダメでした。今まではしかたなく、次のようにするしかなかったです。

Sub Macro3()
    Dim A(2) As String
    A(0) = Range("A1")
    A(1) = Range("A2")
    A(2) = Range("A3")
    MsgBox Join(A, "-")
End Sub

それが!TEXTJOIN関数なら一発です。神様ありがとう!

Sub Macro4()
    MsgBox WorksheetFunction.TextJoin("-", True, Range("A1:A3"))
End Sub

ワークシート上に作成したデータをCSV形式で保存するようなときに重宝しますね。