今回はJoin関数の使い方についてご説明します。
Join関数は文字列の配列を、区切り文字で結合したい時などに使用します。
文字列を「&」で結合する方法と似ていますが、区切り文字という部分で少し違います。
区切り文字というのは、文字と文字の間の区切りに使用される「,」カンマなどの事です。
また、結合だけではなく逆に区切る方法についても簡単に説明したいと思います。
Join関数でエラーが出た時の対処法は「Join関数のエラーの対象方法「プロシージャの呼び出し、または引数が不正です。」をご覧下さい。
1.文字列の結合方法
文字列の結合方法にはいくつか方法があります。
- 「&」で結合
- 「+」で結合
- 「Join」で結合
基本的には「&」を使用して結合するかと思います。
区切り文字も意識して「A & “,” & B & “,” & C」等の様に結合します。
または、「+」で同様に結合出来ます。
こちらは数値の場合に四則演算の足し算と混同する可能性があるため、「&」が一般的な方法かと思います。
「&」の場合はデータ量が増えたときに処理時間が長くなります。
Joinは高速に結合できるため、データ量が増えると処理時間に大きな差が出来るので、Joinで結合する事をおすすめします。
1.Join関数の使い方
Join関数は次のように記述します。
Join(文字列型配列, 区切り文字)
「区切り文字」は省略可能で、省略した場合は半角スペースがデフォルトで指定されます。
半角スペースでも問題ありませんが、「絶対に使用されてない」であろう区切り文字を任意に指定した方が、区切るときに予期せぬ挙動回避出来ます。
また、直接セルを指定出来ないため、配列に格納後に要素を指定するケースが多いと思います。
配列内の要素は全て結合されますので、結合したい要素のみ配列に格納します。
注意点が、2次元以上の配列はJoin関数に使えないため、1次元配列にする必要があります。
1列しか格納していなくても2次元配列となる場合もありますので、もしエラーになった場合は、一度配列の次元を確認してみてください。
意外と1次元配列なのにエラーが発生する!という方が多いのではないかと思い、解決策を掲載しましたのでエラーを解決できない方は一度ご覧下さい。
「Join関数のエラー「プロシージャの呼び出し、または引数が不正です。」の対処方法」
2.Join関数のサンプルコード
まずは基本的なコードです。
A列に47都道府県が入力されたデータがあります。
こちらのデータを使用して結合します。
Option Explicit
Sub Sample1()
Dim myArray() As Variant
Dim myStr As String
Dim i As Long
ReDim myArray(0 To 46)
For i = 1 To 47
myArray(i - 1) = Cells(i, 1) 'セルを配列に格納
Next i
myStr = Join(myArray, ",")
MsgBox myStr
End Sub
3.条件で指定した文字列のみ結合する
上記データで「府」を含む文字列のみ、結合したいと思います。
配列に格納した要素は全て結合してしまうため、条件に合った文字列のみ配列に格納する必要があります。
Sub Sample2()
Dim myArray() As Variant
Dim getArray() As Variant
Dim myStr As String
Dim i As Long
Dim a As Long
a = 0
For i = 1 To 47
If InStr(Cells(i, 1), "府") <> 0 Then
ReDim Preserve myArray(0 To a)
myArray(a) = Cells(i, 1) 'セルを配列に格納
a = a + 1
End If
Next i
myStr = Join(myArray, ",") '配列の要素をすべて「,」区切りで結合
MsgBox myStr
End Sub
3.Joinで結合した文字列を区切る方法
結合された文字列を区切る方法は「Split関数」を使用します。
上記で使用したSample1データと結合した結果を、再度区切り文字で区切ってC列に出力したいと思います。
Sub Sample3()
Dim myArray() As Variant
Dim myStr As String
Dim temp As Variant
Dim i As Long
ReDim myArray(0 To 46)
For i = 1 To 47
myArray(i - 1) = Cells(i, 1) 'セルを配列に格納
Next i
myStr = Join(myArray, ",") '配列の要素をすべて「,」区切りで結合
temp = Split(myStr, ",")
For i = 0 To UBound(temp)
Cells(i + 1, 3) = temp(i)
Next i
End Sub
4.「&」と「Join」の速度比較
最後に「&」と「Join」の処理速度の比較をしたいと思います。
上記だけでは、正直文字の結合の区切り文字設定が楽になる程度にしか、メリットが無いように感じます。
一番の大きなメリットは処理速度にあります。
次のコードは1~100,000までの整数をすべて結合します。
Joinの速度検証
Sub Sample4()
Dim myArray() As String
Dim myStr As String
Dim temp As Variant
Dim i As Long
ReDim myArray(0 To 99999)
For i = 1 To 100000
myArray(i - 1) = i 'セルを配列に格納
Next i
myStr = Join(myArray, ",") '配列の要素をすべて「,」区切りで結合
End Sub
「0.04秒」でした。
「&」の速度検証
Sub Sample5()
Dim myStr As String
Dim temp As Variant
Dim i As Long
For i = 1 To 100000
myStr = myStr & "," & i 'セルを配列に格納
Next i
End Sub
「51秒」でした。
約1250倍です。
PCスペックや実際のコードで処理速度は大きく変動するかと思いますが、確実に処理速度が速くなります。
5.まとめ
意外と文字結合は処理回数が増えたときに、「&」か「Join」かで処理速度に大きな差が生じます。
処理速度がなかなか早くならないと思った際に、もし文字列の結合で「&」を使用していた場合、結合部分を見直してみるのもありかもしれません。
今回、紹介しませんでしたが「Midステートメント」でも結合が可能です。
「Mid」は「Join」よりも高速です。
今回紹介しなかった理由は「Midステートメント」は(個人的に)扱いが複雑だからです。