Excel VBA で正規表現を使用する

Bilal Shahid 2023年6月21日
  1. Microsoft Excel の正規表現
  2. Excel VBA の正規表現の例
  3. まとめ
Excel VBA で正規表現を使用する

Visual Basic for Applications は、Microsoft アプリケーションで使用されるイベント駆動型プログラミング言語です。 これにより、ユーザーはタスクを自動化し、要件に応じていくつかの機能を書き直すことができます。

VBA を使用すると、ユーザーは、マクロの形式で格納されたいくつかのコード ステートメントを使用して、複数のタスクを実行できます。 マクロを使用すると、ユーザーはコードを何度も再利用できます。

Microsoft Excel の正規表現

Microsoft Excel は、大規模なデータ操作を可能にする強力なアプリケーションです。 データベースから入力を取得し、データを操作し、結果を要約することは、Microsoft Excel の助けを借りて非常に簡単です。

正規表現 (Regex) は、文字列内のパターンを識別して照合するために使用されます。 Microsoft Excel で正規表現を使用すると、データを大幅に操作できます。

たとえば、性別に基づいてデータ入力を分割できます。 さらに、ユーザーが正しい電子メールを入力したかどうかを確認することもできます。

つまり、フォーマットされたデータを確認し、それに応じて操作を実行するのは非常に簡単です。

Excel での正規表現の使用を許可する

Microsoft Excel で正規表現を使用するには、Microsoft VBScript 正規表現 5.5への VBA 参照を追加することが不可欠です。 次の手順で実行できます。

  • Excelで開発者タブを選択します
  • コードリボンセクションからVisual Basicアイコンを選択します
  • Microsoft Visual Basic for ApplicationsウィンドウのトップメニューからToolsを選択します
  • 参考文献を選択
  • Microsoft VBScript正規表現5.5を確認してください

これらの手順により、VBA コードで正規表現を使用できるようになります。

正規表現を書く

正規表現を作成するのに役立つ基本的な定義のいくつかを以下に示します。

  1. 範囲について言及する

    - 記号は、範囲を定義するために使用されます。 たとえば、a-z は小文字の文字列に一致します。

  2. 1つのオブジェクトを一致させる

    角括弧 [] は、角括弧内に記載されているオブジェクトの 1つに正確に一致するために使用されます。 たとえば、[wxyz] は、w、x、y、または z の 1 文字に一致します。

  3. パターンの 1 回または 0 回の出現に一致

    クエスチョンマーク ? 角括弧で定義されたパターンに 0 回または 1 回一致します。 [0-9]? 空の文字列または任意の 1 桁に一致します。

  4. パターンの0回以上の出現に一致

    アスタリスク * は、角括弧で定義されたパターンに 0 回以上一致します。 [0-9]* は、空の文字列または数字の任意の文字列に一致します。

  5. パターンの 1つ以上の出現に一致する

    プラス + 記号は、角括弧で定義されたパターンに 1 回以上一致します。 [0-9]+ は、少なくとも 1つ以上の数字と一致します。

  6. パターンの多重度

    パターンを複数回繰り返すには、中括弧 {} を使用します。 例えば:

    6.1. [x]{2} は、2つの連続する小文字の x に一致します。 xx に一致します。

    6.2. [x]{1, 3} は、最小 1 から最大 3 回まで、角括弧で定義されたパターンに一致します。 xxx、および xxx に一致します。

  7. OR 演算子

    OR 演算子 | 複数のオプションを一致させることができます。 たとえば、x|y|z はオプションの 1つと一致します。

  8. NOT 演算子

    NOT 演算子 ^ は、角括弧で定義されたパターンと一致しません。 たとえば、[^a-z] は小文字と一致しません。

  9. 異なるマッチをグループ化する

    かっこ () は、さまざまな一致パターンをグループ化するために使用されます。 たとえば、(^[0-9]{3})([a-z]) は、先頭が 3 桁で、その後に小文字が続くパターンに一致します。

  10. 固定パターン

    ^ 演算子を使用して、文字列の先頭に一致させることができます。 たとえば、式 ^a は、文字列が小文字の 'a' で始まることを保証します。

    $ 演算子は、文字列の末尾に一致させるために使用されます。 たとえば、式 a$ は、文字列が小文字の 'a' で終わることを保証します。

正規表現の優先順位

次の表に示すように、演算子ごとに優先順位が異なります。

注文 名前 表現
1 括弧 ( )
2 乗数 ? + * {m,n} {m, n}?
3 シーケンスとアンカー abc ^ $
4 オルタネーション |

文字の略語

正規表現では、定義済みの文字の省略形がいくつか使用されています。 以下の表に、定義済みの文字の省略形の一部を示します。

略語 意味
\d 一桁を表すには
\D 数字以外の文字を表すには
\w 単語の文字を表すには
\W 単語以外の文字を表すには
\s スペース文字を表すには
\S スペース以外の文字を表すには
\n 新しい行を表すには

Excel VBA の正規表現の例

次の例では、大文字のセル値を確認し、空の文字列に置き換えます。 つまり、すべての大文字が一致し、入力文字列から削除されます。

コードをマクロとして実行する

次のコードは、セル参照として A1 を取り、A1 に配置された文字列からすべての大文字を削除します。 結果は Msgbox に表示されます。

たとえば、入力文字列 aAbBcC はメッセージ ボックスで abc に変わります。

Private Sub test()
    Dim pattern As String: pattern = "[A-Z]"
    Dim replace As String: replace = ""
    Dim exp As New RegExp
    Dim cellVal As String
    Dim rangeref As Range

    Set rangeref = ActiveSheet.Range("A1")

    If pattern <> "" Then
        cellVal = rangeref.Value

        With exp
            .Global = True
            .MultiLine = True
            .IgnoreCase = False
            .pattern = pattern
        End With

        If exp.test(cellVal) Then
            MsgBox (exp.replace(cellVal, replace))
        Else
            MsgBox ("Not matched")
        End If

    End If
End Sub

範囲をループする

最初の例で使用した同じコードは、特定の範囲でマクロを実行するために For ループを追加することで変更できます。 定義された範囲内のセルごとにループが実行され、各セルの出力がメッセージ ボックスに表示されます。

Private Sub test()
    Dim pattern As String: pattern = "[A-Z]"
    Dim replace As String: replace = ""
    Dim exp As New RegExp
    Dim cellVal As String
    Dim rangeref As Range

    Set rangeref = ActiveSheet.Range("A1:A5")

    For Each cell In rangeref
        If pattern <> "" Then
            cellVal = cell.Value

            With exp
                .Global = True
                .MultiLine = True
                .IgnoreCase = False
                .pattern = pattern
            End With

            If exp.test(cellVal) Then
                MsgBox (exp.replace(cellVal, replace))
            Else
                MsgBox ("Not matched")
            End If

        End If
    Next
End Sub

関数を作成する

次のコードを使用して、文字列内の大文字を削除するセル内関数を作成できます。 このコードは、最初の例で使用したものと似ています。

関数に変換するためにいくつかの変更が加えられました。

Function cellTest(rangeref As Range) As String
    Dim pattern As String: pattern = "[A-Z]"
    Dim replace As String: replace = ""
    Dim exp As New RegExp
    Dim cellVal As String


    If pattern <> "" Then
        cellVal = rangeref.Value

        With exp
            .Global = True
            .MultiLine = True
            .IgnoreCase = False
            .pattern = pattern
        End With

        If exp.test(cellVal) Then
            cellTest = exp.replace(cellVal, replace)
        Else
            cellTest = "Not matched"
        End If

    End If
End Function

A1DdEeleTte を含む cellTest(A1) を使用すると、関数は delete を返します。

まとめ

生成できる正規表現の数に制限はありません。 必要な一般的な形式を特定できたら、その正規表現を作成し、それに基づいてすべての文字列をテストします。

これは、さまざまな機能に基づいてデータを分割するのに役立ちます。

著者: Bilal Shahid
Bilal Shahid avatar Bilal Shahid avatar

Hello, I am Bilal, a research enthusiast who tends to break and make code from scratch. I dwell deep into the latest issues faced by the developer community and provide answers and different solutions. Apart from that, I am just another normal developer with a laptop, a mug of coffee, some biscuits and a thick spectacle!

GitHub