【VBA入門】文字列の結合を高速にする方法(Mid、Join)

こんにちは!フリーランスの長野です。

文字列の結合って使っていますか?「&」記号を使って結合するのが一般的ですが、文字列の数が多くなると処理に時間がかかります。

そこで高速に処理するために、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

実行結果:
Conect01

このサンプルコードのように、「&」記号を使って改行コード(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

実行結果:
Conect01

ただし、四則演算の和算と混同する場合があるのであまり使われません。

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

実行結果:
Conect02

このサンプルコードでは、まず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

実行結果:
Conect02

このサンプルコードでは、まず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

実行結果:
Conect03

このサンプルコードで確認した結果はこのようになりました。

実行環境により結果は変わってきますが、「&」記号で結合する場合はかなり遅くなっています。「&」記号で結合する場合の処理時間は、Midステートメントを使った処理に比べて約1万倍遅くなっています。

大量の文字列を結合する場合は、MidステートメントかJoin関数を使うようにしましょう!

文字列操作の総まとめ

文字列の結合のほかにも置換や分割などの文字列の操作については、こちらのサイトで詳しく解説しています。

ぜひ参考にしてください。

まとめ

ここでは、文字列の結合について「&」記号、Midステートメント、Join関数それぞれの使い方について説明しました。

「&」記号で結合するのが一般的ですが、大量の文字列を結合する場合は処理が遅くなるので、MidステートメントもしくはJoin関数を使うようにしましょう!

使いこなすことができるように、この記事を何度も参考にして下さいね!

この記事を書いた人

熊本在住のフリープログラマ兼ライターです。C/C++/C#、Java、Python、HTML/CSS、PHPを使ってプログラミングをしています。専門は画像処理で最近は機械学習、ディープラーニングにはまっています。幅広くやってきた経験を活かしてポイントをわかりやすくお伝えしようと思います。
お問合せはこちらでも受け付けています。
info@sss-lab.com

目次