【EXCEL VBA】正規表現を扱うRegExpオブジェクト

スポンサーリンク

正規表現を扱うRegExpオブジェクト

正規表現とは

正規表現とは、文字列のパターンを表現するための方法です。他の記事でも色々紹介していますが、文字列を検索したり置換したりするときに非常に協力な武器になります。

VBAだけではなく、様々なところで登場しますので覚えといて損はありません(^o^)


正規表現について書いた他の記事


a~Z、0~9などの通常の文字と、[]や{}などの特殊な役割を持つ「メタ文字」と言う記号の組み合わせでパターンを表現します。

分かりにくいと思うので、早速ですがよく使われる正規表現の記号の一覧です。

よく使われる「正規表現」の記号

記号意味正規表現の例マッチする文字列例
.任意の1文字.a , b, c なんでも
?0回または1回の出現ab?cdacd → 0回 abcd → 1回
*0回以上の繰り返しの出現ab*cdacd → 0回 abcd → 1回 abbcd → 2回  abbbcd → 3回  abbbb・・・cd → 4回以上何回でも
+1回以上の繰り返しの出現ab+cdabcd → 1回 abbcd → 2回  abbbcd → 3回  abbbb・・・cd → 4回以上何回でも
{n}n回の繰り返しの出現ab{3}cdabbbcd → 3回 
{n,}n回以上の繰り返しの出現ab{3,}cdabbbcd → 3回 abbbbcd → 4回 abbbbbcd → 5回 abbbbbb・・・cd → 5回以上何回でも
{m,n}n回以上m回以下の繰り返しの出現ab{3,4}cdabbbcd → 3回 abbbbcd → 4回
^文字列の先頭^abcdabcd~ → abcで始まる
$文字列の末尾abcd$abcd → abcdで終わる
||の左側の文字列もしくは、|の右側の文字列a(b|c)dabd acd
 \wアルファベット、アンダーバー、数字ab\wcdabgcd ab_cd ab9cd ab[a-zA-Z_0-9]cdと同じ
\Wアルファベット、アンダーバー、数字以外の文字ab\Wcdabcd abcd ab[^a-zA-Z_0-9]cdと同じ
\s空白文字(半角スペース,タブ,改行,キャリッジリターン)ab\scdab cd ※半角スペース
\S空白文字以外ab\Scdabgcd ab9cd
\d半角数字(0~9)ab\dcdab8cd ab5cd
\D半角数字以外ab\Dcdabmcd abcd
[~]~のいずれかの1文字ab[cde]fgabcfg abdfg abefg
[^~]~のいずれの1文字にも一致しないab[^cde]fgabafg abbfg abffg ab1fg

※他にもたくさんありますので興味のある方はググったり本を買ったりして勉強して下さい!

このような、記号を組み合わせて文字列のパターンを作成し、そのパターンにマッチした文字列を検索するために使います。

要するに、「超便利なあいまい検索」って感じですね^_^

RegExpオブジェクト

それでは、VBAから正規表現を利用して文字列を検索する方法を紹介します。

RegExpオブジェクトというオブジェクトを利用します。

RegExpオブジェクト というのは上記で説明したような、正規表現を扱うオブジェクトです。

では早速と行きたいところなんですが、実はRegExp オブジェクト は、VBScriptのオブジェクトになります。

ですのでVBAから利用する場合には、先に”CreateObject関数”を使ってオブジェクトを作ってやる必要があります。

構文

CreateObject(Class)

引数の”Class”には、作成するオブジェクトのクラスとアプリケーション名を指定します。

ちょっと分かりにくい表現ですが、呼び出したいものによって書き方が決まってますので、あまり難しく考えなくていいかと思います。

VBScriptのRegExpオブジェクトを作成するには次のようにします。

構文

CreateObject(”VBScript.RegExp”)

こんな感じです。

これでオブジェクトを作成しているので、後で使いやすいようにオブジェクト型の変数に格納しちゃいましょう!

Sub sample()

    'RegExpオブジェクトを格納する変数を準備
    Dim reg As Object
    
    '変数にRegExpオブジェクトを格納
    Set reg = CreateObject("VBScript.RegExp")
    
End Sub

Testメソッド

準備が出来ましたので次のサンプルシートで試していきましょう!

タイトル列にある文字列を正規表現でチェックして、マッチ結果を表示します。

コードは次のようになります。

Sub sample()

    'RegExpオブジェクトを格納する変数を準備
    Dim reg As Object
    
    '変数にRegExpオブジェクトを格納
    Set reg = CreateObject("VBScript.RegExp")
    
    '検索する正規表現のパターンをセット
    reg.Pattern = "^VBA"    '…VBAで始まる正規表現
    
    'セル(1列目)を検索して結果を2列目に入力
    Dim i As Long
    For i = 2 To 12
        Cells(i, 2) = reg.Test(Cells(i, 1))
    Next
    
End Sub

reg.Pattern = "^VBA"

のところで検索する正規表現をセットしています。

”^VBA”がVBAで始まる文字列という意味の正規表現になります。

Dim i As Long
For i = 2 To 12
    Cells(i, 2) = reg.Test(Cells(i, 1))
Next

の部分で、文字列をチェックしています。

Testメソッドでチェックします。

構文

RegExpオブジェクト.Test(チェックしたい文字列)

の形で、マッチしていたらTrue、していなければFalseが返ります。

その結果を、直接2列目のセルに入力しています。

では、実行してみましょう!

正しくマッチ結果が返されましたね(^o^)

基本はこれですが、他にも便利なメソッドが用意されています。

メソッドやプロパティ一覧

メソッド名書式引数・戻り値
Testメソッドobject.Test ( string )object…対象となる RegExpオブジェクト
string … 正規表現にで検索したい文字列
戻り値 … ブール型(Boolean) 一致する文字列が見つかるとTrue、見つからないとFalse
Replaceメソッドobject.Replace ( string1, string2 )object … 対象となるRegExpオブジェクト
string1 … 検索・置換の対象となるテキスト文字列
string2 … 置換するテキスト文字列
戻り値 … 正規表現で検索し、マッチした文字列をstring2で指定した文字列に置き換えた文字列。マッチするものが見つからなかった場合は、string1を返します。
Executeメソッドobject.Execute ( string )object … 対象となるRegExpオブジェクト
string … 正規表現による検索の対象となるテキスト文字列
戻り値 … Matchesコレクション

Replaceメソッド

正規表現で検索して、マッチした文字列を別の文字列に置き換えをします。

構文

object.Replace ( string1, string2 )

VBAかEXCEL、いずれかの文字列を”エクセル”に置き換えします。

Sub sample()

    'RegExpオブジェクトを格納する変数を準備
    Dim reg As Object
    
    '変数にRegExpオブジェクトを格納
    Set reg = CreateObject("VBScript.RegExp")
    
    '検索する正規表現のパターンをセット
    reg.Pattern = "VBA|EXCEL"        'VBAかEXCEL
    
    'セル(1列目)を検索して結果を2列目に入力
    Dim i As Long
    For i = 2 To 12
        Cells(i, 2) = reg.Replace(Cells(i, 1), "エクセル")
    Next
    
End Sub

Cells(i, 2) = reg.Replace(Cells(i, 1), "エクセル")

この部分ですね。

マッチする文字列があれば”エクセル”に置き換えます。

Executeメソッド

Matchesコレクション

Matchesコレクションのプロパティなど

プロパテ等書式引数・戻り値
Count プロパティobject.Matches.Countobject … 対象となるRegExpオブジェクト
戻り値 … Executeメソッドにより取得したMatcheオブジェクトの数
Item プロパティobject.Matches[.Item](number)object … 対象となるRegExpオブジェク
number … インデックス値(0 からMatches.Count–1までの数値)
戻り値 … Executeメソッドにより取得したMatcheオブジェクト

Matche オブジェクトのプロパティ等

プロパテ等書式引数・戻り値
FirstIndexプロパティobject.FirstIndexobject … 対象となるMatcheオブジェクト
戻り値 … 検索文字列の最初の位置を0とするオフセット値
Lengthプロパティobject.Lengthobject… 対象となるMatcheオブジェクト
Valueプロパティobject.Valueobject … 対象となるMatcheオブジェクト
SubMatchesコレクションobject.SubMatches(number)object … 対象となるMatcheオブジェクト
number … 0以上SubMatches.Count -1までのインデックス値
戻り値 … SubMatchesコレクション。SubMatchesコレクションの各項目は、正規表現によって検索および取得される文字列です。

各メソッドの使い方は、おいおい追記していきます(^o^)

コメント

タイトルとURLをコピーしました