- VBAで特定の文字列が含まれるか検索するのに一番速いのは誰だッ!?
- 出場選手紹介ッ!!
- 闘技場(検証した環境)
- ルール
- テストしたプログラム
- 闘いの行方は・・・?
- チャンピオンはInstr関数!!
- 総括
VBAで特定の文字列が含まれるか検索するのに一番速いのは誰だッ!?
VBAにおいて、文字列の中を検索する場面はよくあるかと思います。
プログラムは速度が命。
どうせ同じように検索処理をするなら速いに越したことはありません。
なら、決めればいい。
最速を!
というわけで文字列から文字列を検索するときに、どの機能を使うのが一番速いのか、イチバンを決めたいと思います。
今回は、検索したい文字列が、中間にある場合。
ルールは、文字列「東京都足立区」の中に「足立」が含まれていることをチェックする速度を競うッ!!
文字列検索最速を決める闘いが今、始まるッ!!
関連記事↓
VBAにおける文字列検索はどれが一番速いのか_先頭編 - 適材適所
出場選手紹介ッ!!
青龍の方角!!
Instr 関数
白虎の方角ッ!!!
like 演算子
朱雀のほうがくッッッッ!!!!
RegExpオブジェクトのTestメソッド
そして!!
玄武の方角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関数!!
優勝は、Instr関数ゥゥッ~~~~!!!
Instr関数が圧倒的な力の差を見せつけて堂々の優勝です!!
これには驚きました。Like演算子の2倍の性能が出ています。
まさに圧倒的!!
チャンピオンの名に恥じぬ戦いっぷりでしたッ!!
総括
先頭編と総合してみると、文字列の検索の際にはInstr関数が高いパフォーマンスを発揮してくれるようですね。
文字列を検索するときは、Instr関数改め、チャンピオン関数を使えば間違いないですね。
次点でlike演算子。こいつも半端じゃないポテンシャルを感じさせてくれました。
というわけで、今回は文字列の検索を行う際に中間に検索対象の文字列があった場合に、各機能でどれだけの速度が出るかの検証でした。
まだまだ野にはチャンピオンを脅かす隠れた猛者がいるかも知れません。
しかし、今回はここまでとしますッ!!
最後に、ここまでのアツい戦いを演じてくれた4選手に盛大な拍手を!!
ワ―ッ ワーッ!!
(スタンディングオベーション、そして去り行く4選手。歓声はいつまでも鳴りやまない・・・)
というわけで、ここまでお付き合いいただき、ありがとうございました。