適材適所

パソコン作業の自動化・効率化のための情報を発信するブログ(VBA,PowerShellなど)

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

はじめに

文字列の中から特定の文字列を含むかチェックする場面はよくある場面かと思います。

前回(VBAにおける文字列検索はどれが一番速いのか_先頭編 - 適材適所)に続き、どの検索方法が最速なのか、検証してみました。

今回は中間の文字列を検索する場合です。

お題: 文字列「東京都足立区」の中に「足立」が含まれているかどうかチェックする

テストする機能

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

テストした環境

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

条件

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

結果

1位 Instr関数  0.056641秒
2位 Like関数   0.090625秒
3位 RegExp   0.201563秒
4位 find関数   4.073047秒

一番速いのはInstr関数!!

今回はなんとInstr関数に軍配が!!

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

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

といっても、like演算子も十分に速いですが。

今回は中間の文字列を判定する機能の速度調査でした。

意外と実務でも必要とされるのではないでしょうか。その際の参考になれば。

お読みいただき、ありがとうございました。

テストしたプログラム

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