適材適所

WindowsやPowerShellやネットワーク、IBMなどのシステム系の話など気になったことも載せているブログです。

VBAにおける文字列検索はどれが一番速いのか_中間編

VBAで特定の文字列が含まれるか検索するのに一番速いのは誰だッ!?

f:id:shinmai_papa:20211125210914p:plain

VBAにおいて、文字列の中を検索する場面はよくあるかと思います。

プログラムは速度が命。

どうせ同じように検索処理をするなら速いに越したことはありません。

なら、決めればいい。

最速を!

というわけで文字列から文字列を検索するときに、どの機能を使うのが一番速いのか、イチバンを決めたいと思います。

今回は、検索したい文字列が、中間にある場合

ルールは、文字列「東京都足立区」の中に「足立」が含まれていることをチェックする速度を競うッ!!

文字列検索最速を決める闘いが今、始まるッ!!

関連記事↓

VBAにおける文字列検索はどれが一番速いのか_先頭編 - 適材適所

出場選手紹介ッ!!

f:id:shinmai_papa:20211125224918p:plain

青龍の方角!!

Instr 関数

VS

白虎の方角ッ!!!

like 演算子

VS

朱雀のほうがくッッッッ!!!!

RegExpオブジェクトのTestメソッド

VS

そして!!

玄武の方角ttttt!!!

ワークシート関数のfind関数

ということで、選手は以下の通りです。

  • Instr 関数
  • like 演算子
  • RegExpオブジェクトのTestメソッド
  • ワークシート関数のfind関数

闘技場(検証した環境)

OS:Windows10 Pro
CPU:Intel Core i5-4300U
メモリ:4G
Excel:2019

ルール

東京都足立区が足立を含むかチェックするプログラムを100万回する時間。10回の平均を比較。

テストしたプログラム

これがそのプログラム!

 
Option Explicit
Dim reg As RegExp
Dim i As Long
Const EXPRESSION As String = "東京都足立区"
Const PATTERN As String = "足立"
Const PATTERN2 As String = "*足立*"

Sub main()
    Dim i As Long
    For i = 1 To 10
        doTest
    Next i
End Sub

Sub doTest()
    Const CNT As Long = 1000000
    Set reg = New RegExp
    Dim startDouble As Double: startDouble = Timer
    Dim rec As String
    'テスト対象以外はコメントアウトします
    'rec = InstrTest(CNT)
    'rec = LikeTest(CNT)
    'rec = WorksheetFunctionTest(CNT)
    rec = RegExpTest(CNT)
    Dim endDouble As Double: endDouble = Timer
    Debug.Print rec & "," & endDouble - startDouble & "," & CNT
End Sub

Function InstrTest(kai) As String
    For i = 1 To kai
        If InStr(EXPRESSION, PATTERN) > 0 Then
        End If
    Next i
    InstrTest = "InstrTest"
End Function

Function LikeTest(kai As Long) As String
    For i = 1 To kai
        If EXPRESSION Like PATTERN2 Then
        End If
    Next i
    LikeTest = "LikeTest"
End Function

Function WorksheetFunctionTest(kai As Long) As String
    For i = 1 To kai
        If WorksheetFunction.Find(PATTERN, EXPRESSION) > 0 Then
        End If
    Next i
    WorksheetFunctionTest = "WorksheetFunctionTest"
End Function

Function RegExpTest(kai As Long) As String
    reg.PATTERN = PATTERN
    For i = 1 To kai
        If reg.test(EXPRESSION) Then
        End If
    Next i
    RegExpTest = "RegExpTest"
End Function

闘いの行方は・・・?

アツい闘いの結果、以下の通りとなりましたッ!!

ざわ・・・ざわ・・・

わッ!!

順位 機能 かかった秒数
1位 Instr関数 0.056641秒
2位 Like関数 0.090625秒
3位 RegExp 0.201563秒
4位 find関数 4.073047秒

チャンピオンはInstr関数!!

f:id:shinmai_papa:20211125225145p:plain

優勝は、Instr関数ゥゥッ~~~~!!!

Instr関数が圧倒的な力の差を見せつけて堂々の優勝です!!

これには驚きました。Like演算子の2倍の性能が出ています。

まさに圧倒的!!

チャンピオンの名に恥じぬ戦いっぷりでしたッ!!

総括

先頭編と総合してみると、文字列の検索の際にはInstr関数が高いパフォーマンスを発揮してくれるようですね。

文字列を検索するときは、Instr関数改め、チャンピオン関数を使えば間違いないですね。

次点でlike演算子。こいつも半端じゃないポテンシャルを感じさせてくれました。

というわけで、今回は文字列の検索を行う際に中間に検索対象の文字列があった場合に、各機能でどれだけの速度が出るかの検証でした。

まだまだ野にはチャンピオンを脅かす隠れた猛者がいるかも知れません。

しかし、今回はここまでとしますッ!!

最後に、ここまでのアツい戦いを演じてくれた4選手に盛大な拍手を!!

f:id:shinmai_papa:20211125225023p:plain

ワ―ッ ワーッ!!

(スタンディングオベーション、そして去り行く4選手。歓声はいつまでも鳴りやまない・・・)

というわけで、ここまでお付き合いいただき、ありがとうございました。