和風スパゲティのレシピ

日本語でコーディングするExcelVBA

文字列を区切り文字付きで結合する - Join関数

文字列を区切り文字付きで結合する、Join関数の使い方を解説します。

基本形

Join(結合したい配列, 区切り文字)

実行例

' 「みかん,りんご,いちご」が表示されます。
MsgBox Join(Array("みかん","りんご","いちご"), ",")

解説

Join関数は、1次元配列と区切り文字を渡すと
「各要素間に区切り文字を入れた1つの文字列」にしてくれる関数です。


区切り文字を省略した場合は半角スペースで区切ります。
省略時はカンマではありませんのでご注意ください。

セル範囲から実行したい場合

この関数はセル範囲に実行し、

セル範囲へのJoin関数実行

このような文字列生成ができると便利なのですが、
前述の通りJoin関数は1次元配列しか受け取りません。


以下のコードを実行すると、
型が一致しません」エラーになってしまします。

品物リスト = Join(Range("A1:A3"), ",")

 
Rangeオブジェクト(のValueプロパティ)が返す配列は、
たとえ1列(1行)のセル範囲でも2次元配列になるためです。


これを解決する方法として最も簡単なのは、
Excel2019から実装の「TextJoin関数」を使うことですが、
こちらはマクロを使う全ユーザーが新Excelを使っている前提となります。


そこで簡単かつ旧Excelと互換性を保って実装できる方法として、
TRANSPOSE関数を利用する方法があります。
 

品物リスト = Join(WorksheetFunction.Transpose(Range("A1:A3")), ",")

これで「みかん,りんご,いちご」を品物リストに代入することができます。



TRANSPOSE関数は「配列の行と列を入れ替える」関数で、
↓このような変換を行うための関数です。

Transpose関数の正規の使い方

ですがTRANSPOSE関数にはひとつ面白い特徴があり、
できた配列が1×nだった場合は1次元配列に変換」してくれます。

このため、今回のように2次元配列を1次元配列に変換するためにも使えます。


ただし注意点として、先ほど記したようにこの変換は、
「できた配列が1×nだった場合」にのみ行われます。

つまり、できた配列がn×1だった場合は2次元配列のままになります。


よって、

1×nのデータ

このように最初から1×nの列方向範囲に実行したい場合は、

品物リスト = Join(WorksheetFunction.Transpose _
                      (WorksheetFunction.Transpose(Range("A1:C1"))),",")

と、Transpose関数を2回かませる必要がありますのでご注意下さい。


このTransposeによるセル範囲⇒1次元配列への変換は、
Join関数以外にも活用できます。

配列を受け取る関数へセル範囲を渡したいときには、
Transpose関数が使えることを覚えておきましょう。