エクセルで正規表現(VBScriptをつかって)


VBScript には、「RegExp」という正規表現用のオブジェクトが用意されています。

参考Webページのご紹介

VBScriptの正規表現についての詳細は、
http://www.microsoft.com/japan/msdn/columns/scripting/scripting051099.asp

以下は、MSDN Libraryにある、VBScriptの「正規表現の概説」です。
VBScriptで正規表現を使うならば、一度はざっと目を通しておくことをお勧めします。
http://www.microsoft.com/japan/msdn/library/default.asp?url=/japan/msdn/library/ja/script56/html/reconIntroductionToRegularExpressions.asp

この正規表現オブジェクトをエクセルでどのようにつかうのかを、簡単にご紹介します。





サンプルコード

Option Explicit Sub sample01() Dim re As Object, n As Object Dim Match As Object, Matches As Object Dim a As String a = "abcdefg123hijk456" '検索対象文字列 Set re = CreateObject("VBScript.RegExp") re.Pattern = "\d{3}" '検索する正規表現パターン re.Global = True '検索範囲はグローバル re.IgnoreCase = True '大文字・小文字を区別する

Set Matches = re.Execute(a) MsgBox a & " が検索対象の文字列です。" & vbCr & _ "パターンは " & re.Pattern & " です。" MsgBox Matches.Count & " 個がマッチしました。"

'Item をつかって取得する方法。 MsgBox Matches.Item(0).Value & " が1件目にマッチしました。" MsgBox Matches.Item(0).FirstIndex & " 文字めでした。" MsgBox Matches.Item(0).Length & " 文字(長さ)"

'Match をつかってGlobalでマッチしたすべてを取得する方法。 For Each Match In Matches MsgBox Match.Length & " 文字(長さ)の " & _ Match.Value & " が、 " & _ Match.FirstIndex & " 文字めにマッチしました。" Next Match

'置換のしかた。 MsgBox re.Replace(a, "あいう") & vbCr & _ " マッチした最初の文字を「あいう」と置換しました。"

Set re = Nothing End Sub


コーディングのしかた:

1.まずは、正規表現をつかって検索・置換をおこなう準備です。

記述 説明
Set ○ = CreateObject("VBScript.RegExp") 「VBScript」の「RegExp」オブジェクトを○という名前で設定します。
○.Pattern = "......" 正規表現のパターンを指定します。
○.Grobal = True/False 全体を検索するか、ひとつだけ検索するかを指定します。
デフォルトは False。
○.IgnoreCase = True/False 大文字と小文字を区別するかどうか。
デフォルトは False。


2.検索・置換・判定につかうメソッドの書式は以下のとおりです。

書式 説明
検索 □ = ○.Execute(検索対象) 対象となるテキストを検索し、その結果を□に返します。
全体検索としたばあいには、見つかったすべてのテキストのコレクションになるので注意してください。
はじめにみつかったもの □(0) 、つぎにみつかったもの □(1) といった感じでとりだします。
置換 □ = ○.Replace(検索対象, 置換文字列) 検索対象のテキストのなかから、正規表現のパターンで検索し、一致したものを「置換文字列」で置換します。結果は置換が実行された検索対象のテキストとなります。
判定 □ = ○.Test (検索対象) 対象となるテキストを検索するのは Execute と同様ですが、結果は一致するものがあるかどうか(True/False)です。条件判定等に便利につかえます。


サンプルコード



Sub test() 
  MsgBox tester("123 あああ位置度0.2いいい") 
End Sub 

Private Function tester(szTarget As String) 

 Set re = CreateObject("VBScript.RegExp") 
 re.Global = True 
  
 ' 1)(平面|平行|位置|対称|直角)度、が含まれていたら、その直後 
 '   の数字を、例えば、平面度1なら1(小数のときもある)を、抽出。 

 re.Pattern = "(?:平面|平行|位置|対称|直角)度\d+(?:\.\d+)?" 

  If re.test(szTarget) Then 
   Set ret = re.Execute(szTarget) 
   tester = Mid(ret(0), 4, Len(ret(0))) 
    
   Set ret = Nothing 
   Set re = Nothing 
   Exit Function 
  End If 

End Function





WebMaster
はじりんパパ
awker@tcnweb.ne.jp