#774 RegExpオブジェクトによる正規表現の使い方の例 VBA

文字列内の検索を行いたい場合、Access VBAの一般的な関数ではあまり複雑なことまではできません。たとえば、「Aで始まる」や「ABCを含む」文字列かどうか調べるのであれば組み込み関数1つで出来ますが、「AかBかCか」や「A〜Zのいずれか」、「ABCを含みかつそれ以降にDEFを含む」といった正規表現のような検索を行いたい場合には、複数の関数を組み合わせたりANDやORといった論理演算子をいくつも組み合わせて対処する必要があります。

一方、『RegExpオブジェクト』を使うと、一般的な正規表現のパターンを指定することで、そのような検索を簡単に行うことができます。ここでは、VBAでRegExpオブジェクトを使った文字列検索の一例を紹介します。


次のプログラム例では、「mtbl商品マスタ」テーブルから全レコードを読み込み、「商品名」フィールドが「”カルピス” + 任意の文字列 + ”缶”」で構成されているものを検索し、マッチしたレコードがあればそれをイミディエイトウィンドウに出力します。また別の例として、文字列が「”カルピス”で始まり”(PET)”で終わる」ものも検索しています。

RegExpオブジェクトはVBAにあらかじめ用意されたオブジェクトではありませんので、最初にオブジェクトを生成するコードが必要となりますが、「Pattern」プロパティに正規表現による検索条件を指定することで、複雑なあいまい検索をそれ1つで実行することができます。

なお、検索は「Execute(検索対象文字列)」という構文のメソッドで実行します。その結果をオブジェクト変数に代入し、その変数の「Count」プロパティを調べることでヒットしたかどうかを調べることができます。・・・・1以上ならヒット、また2以上の複数のパターン一致となる場合もあります


プログラム例:

Dim objReg As Object
Dim dbs As Database
Dim rst As Recordset
Dim objMatch As Object

'正規表現のオブジェクト生成と検索条件の設定
Set objReg = CreateObject("VBScript.RegExp")
With objReg
  .Global = False                '検索範囲(True:最後まで検索、False:最初の一致まで検索)
  .IgnoreCase = True          '大文字/小文字の区別(True:しない、False:する)
  .Pattern = "カルピス.+缶"   'パターン(カルピス+任意の文字列+缶で構成されているものを検索)
End With

Set dbs = CurrentDb
Set rst = dbs.OpenRecordset("mtbl商品マスタ")
With rst
  'mtbl商品マスタの全レコードを読み込むループ
  Do Until .EOF
    '商品名フィールドについて検索実行
    Set objMatch = objReg.Execute(!商品名)
    If objMatch.Count > 0 Then
      '見つかったら商品名をイミディエイトウィンドウに出力
      Debug.Print !商品名
    End If
    .MoveNext
  Loop

  '条件を変えて先頭レコードから再検索
  objReg.Pattern = "^「カルピス.+(PET)$"   '「カルピスで始まり(PET)で終わるものを検索)
  .MoveFirst
  Do Until .EOF
    Set objMatch = objReg.Execute(!商品名)
    If objMatch.Count > 0 Then
      Debug.Print !商品名
    End If
    .MoveNext
  Loop

  .Close
End With

実行例:
| Index | Prev | Next |



T'sFactory
Accessで動く生産管理DB
Ureru Express
Webで使う販売顧客管理
Access開発&アドバイス
DB開発やテクニカルアドバイス
Copyright © T'sWare All rights reserved