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 コードで正規表現を使用できるようになります。
正規表現を書く
正規表現を作成するのに役立つ基本的な定義のいくつかを以下に示します。
-
範囲について言及する
-
記号は、範囲を定義するために使用されます。 たとえば、a-z
は小文字の文字列に一致します。 -
1つのオブジェクトを一致させる
角括弧
[]
は、角括弧内に記載されているオブジェクトの 1つに正確に一致するために使用されます。 たとえば、[wxyz]
は、w、x、y、または z の 1 文字に一致します。 -
パターンの 1 回または 0 回の出現に一致
クエスチョンマーク
?
角括弧で定義されたパターンに 0 回または 1 回一致します。[0-9]?
空の文字列または任意の 1 桁に一致します。 -
パターンの0回以上の出現に一致
アスタリスク
*
は、角括弧で定義されたパターンに 0 回以上一致します。[0-9]*
は、空の文字列または数字の任意の文字列に一致します。 -
パターンの 1つ以上の出現に一致する
プラス
+
記号は、角括弧で定義されたパターンに 1 回以上一致します。[0-9]+
は、少なくとも 1つ以上の数字と一致します。 -
パターンの多重度
パターンを複数回繰り返すには、中括弧
{}
を使用します。 例えば:6.1.
[x]{2}
は、2つの連続する小文字のx
に一致します。xx
に一致します。6.2.
[x]{1, 3}
は、最小1
から最大3
回まで、角括弧で定義されたパターンに一致します。x
、xx
、およびxxx
に一致します。 -
OR
演算子OR
演算子|
複数のオプションを一致させることができます。 たとえば、x|y|z
はオプションの 1つと一致します。 -
NOT
演算子NOT
演算子^
は、角括弧で定義されたパターンと一致しません。 たとえば、[^a-z]
は小文字と一致しません。 -
異なるマッチをグループ化する
かっこ
()
は、さまざまな一致パターンをグループ化するために使用されます。 たとえば、(^[0-9]{3})([a-z])
は、先頭が 3 桁で、その後に小文字が続くパターンに一致します。 -
固定パターン
^
演算子を使用して、文字列の先頭に一致させることができます。 たとえば、式^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
A1
が DdEeleTte
を含む cellTest(A1)
を使用すると、関数は delete
を返します。
まとめ
生成できる正規表現の数に制限はありません。 必要な一般的な形式を特定できたら、その正規表現を作成し、それに基づいてすべての文字列をテストします。
これは、さまざまな機能に基づいてデータを分割するのに役立ちます。
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