Excel VBAで正規表現を使って文字列をマッチさせる方法

Excel VBAで正規表現を使って文字列をマッチさせる方法

Posted at February 4,2014 1:55 AM
Tag:[Excel, VBA]

Excel VBAで正規表現を使って文字列をマッチさせる方法を紹介します。

1.はじめに

Excel VBAでは正規表現による文字列マッチを行うことが可能ですが、PHPやPerlなどより、お作法がちょっと面倒です。

また、ネットで検索してもパッとみて分かるようなサンプルがなかったので、できるだけ無駄なものを省いたサンプルを使って本エントリーで説明してみたいと思います。

2.文字列をマッチさせるサンプル

正規表現を使って文字列をマッチさせるサンプルは次のとおりです。

Sub test()
    Dim str As String
    str = "foo bar hoge"
    
    Dim regex 
    Set regex = CreateObject("VBScript.RegExp")
    regex.Pattern = "\s\w+\s"
    
    Dim result
    Set result = regex.Execute(str)
    If result.Count > 0 Then
        MsgBox result(0)
    End If
 
    Set regex = Nothing
End Sub

解説です。

まず検索対象の文字列を作ります。ここでは「foo bar hoge」とします。

    Dim str As String
    str = "foo bar hoge"

次に正規表現のためのオブジェクトを作成します。

    Dim regex
    Set regex = CreateObject("VBScript.RegExp")

Patternプロパティに、正規表現でマッチさせたいパターンを設定します。

    regex.Pattern = "\s\w+\s"

Executeメソッドで文字列マッチを実行します。結果はMatchesコレクションとして返却されます。

    Dim result
    Set result = regex.Execute(str)

result.CountでMatchオブジェクトの個数が分かります。個数が0以上であればマッチしたことを意味するので、結果を表示します。ここでは「 bar 」がマッチするので、0番目の内容だけを出力します。

    If result.Count > 0 Then
        MsgBox result(0)
    End If

パターンマッチが終わったらオブジェクトへの参照を解除します。

    Set regex = Nothing

実行結果のMsgBoxには「 bar 」が表示されます。

3.複数回マッチさせる

2項のサンプルでは、検索文字列にマッチする文字が複数回出現しても1度しかマッチしません。

複数回マッチさせるには、以下の1行を追加します。

regex.Global = True

サンプルの正規表現や実行結果部分も複数マッチに対応できるよう変更します。追加・変更部分を赤色で示します。

Sub test()
    Dim str As String
    str = "foo bar hoge"
    
    Dim regex
    Set regex = CreateObject("VBScript.RegExp")
    regex.Pattern = "\w+"
    regex.Global = True
    
    Dim result
    Set result = regex.Execute(str)
    If result.Count > 0 Then
        For i = 0 To result.Count - 1
            MsgBox result(i)
        Next
    End If
 
    Set regex = Nothing
End Sub

実行結果のMsgBoxには「foo」「bar」「hoge」が表示されます。

4.大文字・小文字を区別する

大文字・小文字を区別するには以下の1行を追加します。

regex.IgnoreCase = True

サンプルの検索対象の文字列を「foo Foo FOO」に変更してマッチ文字列を「foo」にします。追加・変更部分を赤色で示します。

Sub test()
    Dim str As String
    str = "foo Foo FOO"
    
    Dim regex
    Set regex = CreateObject("VBScript.RegExp")
    regex.Pattern = "foo"
    regex.Global = True
    regex.IgnoreCase = True
    
    Dim result
    Set result = regex.Execute(str)
    If result.Count > 0 Then
        For i = 0 To result.Count - 1
            MsgBox result(i)
        Next
    End If
 
    Set regex = Nothing
End Sub

実行結果のMsgBoxには「foo」「Foo」「FOO」が表示されます。

関連記事
トラックバックURL


コメントする
greeting

*必須

*必須(非表示)


ご質問のコメントの回答については、内容あるいは多忙の場合、1週間以上かかる場合があります。また、すべてのご質問にはお答えできない可能性があります。予めご了承ください。

太字イタリックアンダーラインハイパーリンク引用
[サインインしない場合はここにCAPTCHAを表示します]

コメント投稿後にScript Errorや500エラーが表示された場合は、すぐに再送信せず、ブラウザの「戻る」ボタンで一旦エントリーのページに戻り(プレビュー画面で投稿した場合は、投稿内容をマウスコピーしてからエントリーのページに戻り)、ブラウザをリロードして投稿コメントが反映されていることを確認してください。

コメント欄に(X)HTMLタグやMTタグを記述される場合、「<」は「&lt;」、「>」は「&gt;」と入力してください。例えば「<$MTBlogURL$>」は「&lt;$MTBlogURL$&gt;」となります(全て半角文字)