文字列を区切り文字付きで結合する、Join関数の使い方を解説します。
基本形
Join(結合したい配列, 区切り文字)
実行例
' 「みかん,りんご,いちご」が表示されます。 MsgBox Join(Array("みかん","りんご","いちご"), ",")
解説
Join関数は、1次元配列と区切り文字を渡すと
「各要素間に区切り文字を入れた1つの文字列」にしてくれる関数です。
区切り文字を省略した場合は半角スペースで区切ります。
省略時はカンマではありませんのでご注意ください。
セル範囲から実行したい場合
この関数はセル範囲に実行し、
このような文字列生成ができると便利なのですが、
前述の通りJoin関数は1次元配列しか受け取りません。
以下のコードを実行すると、
「型が一致しません」エラーになってしまします。
品物リスト = Join(Range("A1:A3"), ",")
Rangeオブジェクト(のValueプロパティ)が返す配列は、
たとえ1列(1行)のセル範囲でも2次元配列になるためです。
これを解決する方法として最も簡単なのは、
Excel2019から実装の「TextJoin関数」を使うことですが、
こちらはマクロを使う全ユーザーが新Excelを使っている前提となります。
そこで簡単かつ旧Excelと互換性を保って実装できる方法として、
TRANSPOSE関数を利用する方法があります。
品物リスト = Join(WorksheetFunction.Transpose(Range("A1:A3")), ",")
これで「みかん,りんご,いちご」を品物リストに代入することができます。
TRANSPOSE関数は「配列の行と列を入れ替える」関数で、
↓このような変換を行うための関数です。
ですがTRANSPOSE関数にはひとつ面白い特徴があり、
「できた配列が1×nだった場合は1次元配列に変換」してくれます。
このため、今回のように2次元配列を1次元配列に変換するためにも使えます。
ただし注意点として、先ほど記したようにこの変換は、
「できた配列が1×nだった場合」にのみ行われます。
つまり、できた配列がn×1だった場合は2次元配列のままになります。
よって、
このように最初から1×nの列方向範囲に実行したい場合は、
品物リスト = Join(WorksheetFunction.Transpose _ (WorksheetFunction.Transpose(Range("A1:C1"))),",")
と、Transpose関数を2回かませる必要がありますのでご注意下さい。
このTransposeによるセル範囲⇒1次元配列への変換は、
Join関数以外にも活用できます。
配列を受け取る関数へセル範囲を渡したいときには、
Transpose関数が使えることを覚えておきましょう。