Join
Join関数は配列に格納されている文字列データを、指定した区切り文字で連結して、1つの文字列として返します。
例えば、配列の各要素の”aa”、”bb”、”cc” をJoin関数を使ってカンマで連結すると”aa,bb,cc”になります。
変換が可能な配列は1次元配列に限定されます。
2次元配列などを変換しようとすると実行時エラー’5’(プロシージャの呼び出し、または引数が不正です。)が発生します。
構文
Function Join(SourceArray, [Delimiter]) As String
SourceArray | 文字列データを持つ1次元配列を指定します。
文字列でないデータが含まれている場合は実行時エラー’13’(型が一致しません。)が発生します。 |
Delimiter 省略可 |
連結する際の区切り文字を指定します。
区切り文字は何文字でも構いません。 0文字以上区切り文字が未設定の場合は、配列の各要素が区切り文字なしで連結されます。 省略時は半角スペース1文字が指定されます。 |
戻り値 String |
各要素を区切り文字で連結した文字列を返します。 |
単純なサンプルコード
配列の要素をJoin関数を使って区切り文字で連結する単純なサンプルです。
3つの要素を持つ配列を用意して、それをJoin関数を使ってカンマ(,)で連結しています。
1 2 3 4 5 6 7 8 9 10 11 12 13 |
Sub JoinTest() Dim ar(2) As String ar(0) = "aa" ar(1) = "bbb" ar(2) = "cccc" Dim s As String s = Join(ar, ",") Debug.Print s End Sub |
実行結果
aa,bbb,cccc
CSVデータを作成する場合
Join関数を使う用途として多いものの1つにCSVデータの作成が挙げられます。
上記のサンプルコードもCSVデータ化していますが、実際にCSVデータを作る場合はそう単純ではない場合があります。
配列の要素を編集する必要があったり、CSVデータのフォーマットが’aaa’や”aaa”のようにシングルクォーテーションやダブルクォーテーションで囲む場合があるなど、状況に応じて変わることになります。
そうなってくると単純に、Join関数を使えばいい、とはならなくなります。
Join関数を使うために、元の配列と元の配列の各要素をCSVデータ用に編集した配列とで2つの配列を用意し、Join関数でCSVデータを作成する方法ももちろんありますが、無理にJoin関数を使うよりも、編集処理を優先した方がコードが分かりやすくなることがあります。
元配列と編集用配列を用意してJoin関数を使う方法
元配列の内容を編集して編集用配列に格納し、それをJoin関数で連結し、ダブルクォーテーションでのCSVデータ化する方法です。
編集用配列への格納時と、Join関数での区切り文字と、Join関数の戻り値の文字列の左右へのダブルクォーテーションの付与、と3か所で編集処理が発生しています。
このコードはそんなに長くないためそこまで問題にはなりませんが、要素の数や編集パターンが増えてくると、編集処理の個所が大半を占めるようになる恐れがあります。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
Sub JoinTest3() Dim ar(2) As String ar(0) = "aa" ar(1) = "bbb" ar(2) = "cccc" Dim arEdit() ReDim Preserve arEdit(UBound(ar)) arEdit(0) = UCase(ar(0)) '// "AA" arEdit(1) = "@" & ar(1) '// "@bbb" arEdit(2) = ar(2) & CStr(Len(ar(2))) '// "cccc4" Dim s As String s = Join(arEdit, """,""") '// AA","@bbb","cccc4 s = """" & s & """" '// "AA","@bbb","cccc4" Debug.Print s End Sub |
元配列をJoin関数を使わずCSVデータ化する際に編集する方法
配列の各要素を編集して、カンマとダブルクォーテーションを使って連結してCSVデータ化する方法です。
編集処理はCSVデータ文字列の作成時に限定されています。
仮に配列の要素や編集パターンが増えても、編集処理はCSVデータ文字列の作成時に限定されるため、編集処理の個所がわかりやすい利点があります。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
Sub JoinTest4() Dim ar(2) As String ar(0) = "aa" ar(1) = "bbb" ar(2) = "cccc" Dim s As String Dim dq As String dq = """" s = "" s = s & dq & UCase(ar(0)) & dq '// "AA" s = s & dq & "," & "@" & ar(1) & dq '// "AA","@bbb" s = s & dq & "," & ar(2) & CStr(Len(ar(2))) & dq '// "AA","@bbb""cccc4" Debug.Print s End Sub |
Join関数を使った方がいいかどうか
上記のJoin関数を使う場合と使わない場合のCSVデータの作成のように、状況に応じてJoin関数を使った方がいいかどうかは変わってきます。
個人的にはJoin関数は配列をそのまま連結できる場合に限り使い、編集が必要な場合は使わないようにした方がいいと思います。
その理由は、無理にJoin関数を使おうとすると、上のサンプルのようにデータの編集処理を行う個所が点在することになり、コードが読みにくくなることがあるためです。
また、編集処理がその時点で必要なのであれば、今後編集内容が増えたり変わることはあっても、Join関数を単純に使えるような状況になることはほとんどないだろうと想定されるためです。
Join関数を使う前に、使った方がいいのか使わない方がいいのかを考えてみてください。
文字列連結の高速化にはJoin関数はおすすめ
&での文字列の連結処理はかなり遅い処理になります。
そのような場合には&での文字列連結を配列に格納する処理に書き換えて、配列に全て格納されてからJoin関数(s = Join(ary, “”)のように)すると処理速度はかなり速くなります。
Join関数を使った処理速度の向上方法については「VBAの高速化(文字列の連結はJoinで行う)」をご参照ください。