こんにちは!フリーランスの長野です。
文字列の結合って使っていますか?「&」記号を使って結合するのが一般的ですが、文字列の数が多くなると処理に時間がかかります。
そこで高速に処理するために、MidステートメントやJoin関数を使う方法があります。
この記事では、文字列の結合について
- &で結合する方法
- +で結合する方法
- Midで結合する方法
- Joinで結合する方法
- 文字列結合の高速化
など基本的な内容から、応用的な内容についても解説していきます。
今回は文字列の結合について、使い方をわかりやすく解説します!
&で結合する方法
文字列を結合する方法として、「&」記号を使うのが一般的です。
他にも「+」記号を使っても連結することができますが、四則演算の和算と混同する場合があるので、「&」を使う方が一般的です。
サンプルコードで確認しましょう。
Sub macro1() Dim str1 As String, str2 As String, str3 As String, str4 As String str1 = "侍エンジニア" str2 = "SamuraiEngineer" str3 = "Hello" str4 = "VBA" MsgBox str1 & vbCrLf & str2 & vbCrLf & str3 & ", " & str4 End Sub
実行結果:
このサンプルコードのように、「&」記号を使って改行コード(vbCrLf)やカンマ(“,”)、半角スペース(” “)と結合することも可能です。
+で結合する方法
文字列の結合にはお伝えした「&」記号を使うのが一般的ですが、「+」記号を使って結合することもできます。
Sub macro1() Dim str1 As String, str2 As String, str3 As String, str4 As String str1 = "侍エンジニア" str2 = "SamuraiEngineer" str3 = "Hello" str4 = "VBA" MsgBox str1 + vbCrLf + str2 + vbCrLf + str3 + ", " + str4 End Sub
実行結果:
ただし、四則演算の和算と混同する場合があるのであまり使われません。
Midで結合する方法
文字列を結合する場合、一般的には「&」記号を使いますが、結合する文字列の量が多くなると処理が遅くなります。
それに対して、Midステートメントを使って結合すると高速に処理することができます。似たような呼び名でMid関数がありますが、これとは構文が異なります。
Midステートメントは別の文字列の文字に置き換える場合に使用します。
Midステートメントは以下のように記述します。
Mid(stringvar, start[, length]) = string
「[ ]」内の記述は省略することができます。
引数stringvarは変更する文字列変数名を指定します。
引数startは置換を開始する文字位置を指定します。
引数lengthは置換する文字数を指定します。
stringは置き換える文字列を指定します。
Midステートメントで結合する方法について、まずは簡単な例で確認しましょう。
Sub macro2() Dim str1 As String, str2 As String, msg As String str1 = "Hello" str2 = "VBA" msg = String(10, ",") Mid(msg, 1) = str1 Mid(msg, 7) = " " '半角スペース Mid(msg, 8) = str2 MsgBox msg End Sub
実行結果:
このサンプルコードでは、まずString関数を使って”,”が10個並んだ文字列msgを用意しています。ちなみに、String関数の第1引数には並べる文字数を、第2引数には並べる文字を指定します。
文字列msgをMidステートメントを使って文字列str1や半角スペース、str2で置換しています。あらかじめString型変数の領域を確保しておくことが、高速に処理するためのポイントになります。
Joinで結合する方法
結合する大量の文字列を配列に格納して、その配列の要素を全て結合することで高速に処理する方法もあります。
配列の要素を結合するには、Join関数を使用します。
Join関数は以下のように記述します。
Join(sourcearray[,delimiter])
「[ ]」内の記述は省略することができます。
Join関数は、指定した配列内の要素を全て結合した文字列を返します。
引数sourcearrayには、配列を指定します。
引数delimiterには、結合する要素を区切るための文字を指定します。
こちらも、まずは簡単な例で確認しましょう。
Sub macro3() Dim str1 As String, str2 As String, msg As String str1 = "Hello" str2 = "VBA" Dim arr(3) As String arr(0) = str1 arr(1) = ", " arr(2) = str2 msg = Join(arr, "") MsgBox msg End Sub
実行結果:
このサンプルコードでは、まずString型配列arrに文字列str1、”, “、str3を格納しています。
そのあと、Join関数を使って配列arrの要素を全て結合しています。
文字列結合の高速化
それでは、大量の文字列を結合する場合の処理時間を実際に計測して比較してみましょう。
結合する方法はこれまでご紹介してきた
- 「&」記号を使う方法
- Midステートメントを使う方法
- Join関数を使う方法
の3つの方法です。
文字列”ABCDE”を10万回結合した時間で比較します。
時間の取得にはWindows APIのGetTickCountを使用します。
以下のサンプルコードで比較します。
Declare Function GetTickCount Lib "KERNEL32.DLL" () As Long Sub macro4() Dim str As String, del As String, msg As String Dim num As Long, i As Long str = "ABCDE" '結合する文字列 del = "," '結合時の区切り文字 num = 100000 '結合回数 Dim newTimer As Long Dim t1 As Long, t2 As Long, t3 As Long '「&」で結合する方法 newTimer = GetTickCount '計測開始 For i = 1 To num msg = msg & str & del Next i t1 = GetTickCount - newTimer '処理時間算出 'Midステートメントで結合する方法 msg = "" '空文字にリセット newTimer = GetTickCount '計測開始 Dim strLen As Long, step As Integer step = Len(str) + Len(del) strLen = num * step msg = String(strLen, del) For i = 1 To strLen Step step Mid(msg, i) = str Next i t2 = GetTickCount - newTimer '処理時間算出 'Join関数で結合する方法 msg = "" '空文字にリセット newTimer = GetTickCount '計測開始 Dim arr() As String ReDim arr(num) For i = 1 To num arr(i - 1) = str Next i msg = Join(arr, del) t3 = GetTickCount - newTimer '処理時間算出 MsgBox "「&」で結合: " & t1 & "ミリ秒" & vbCrLf & _ "Midで結合: " & t2 & "ミリ秒" & vbCrLf & _ "Joinで結合: " & t3 & "ミリ秒" End Sub
実行結果:
このサンプルコードで確認した結果はこのようになりました。
実行環境により結果は変わってきますが、「&」記号で結合する場合はかなり遅くなっています。「&」記号で結合する場合の処理時間は、Midステートメントを使った処理に比べて約1万倍遅くなっています。
大量の文字列を結合する場合は、MidステートメントかJoin関数を使うようにしましょう!
文字列操作の総まとめ
文字列の結合のほかにも置換や分割などの文字列の操作については、こちらのサイトで詳しく解説しています。
ぜひ参考にしてください。
まとめ
ここでは、文字列の結合について「&」記号、Midステートメント、Join関数それぞれの使い方について説明しました。
「&」記号で結合するのが一般的ですが、大量の文字列を結合する場合は処理が遅くなるので、MidステートメントもしくはJoin関数を使うようにしましょう!
使いこなすことができるように、この記事を何度も参考にして下さいね!