正規表現で抽出したいデータを取得「regValue」の解説

今回は、正規表現を利用したデータの抽出方法について解説していきます。
Wikipediaでは「正規表現(せいきひょうげん、英: regular expression)とは、文字列の集合を一つの文字列で表現する方法の一つである。」と説明されていますが、知らない方にとってはなんとも分かりづらい表現です
私も理解できるように説明はできませんが、要はある文字列の中で指定したパターン(正規表現)にあてはまる文字列を抽出したり、数を数えたりと覚えれば大変便利な機能となります。
ワイルドカードといえば、理解できる方もいるかと思いますが、ワイルドカードを更に強化したものが正規表現だと思ってください。
では、VBAのIE制御でどのような場面で利用されるかというと、以下の場合URLだけを抽出するにはどのように制御したらいいでしょうか?

<p>VBAのIE制御入門サイトは、エクセルVBAによるIE制御やデータ取得など基本的なものから実践向けの内容まで幅広くカバーしている入門サイトでURLはhttp://www.vba-ie.net/になります。</p>
<p>VBAのIE制御掲示板はEXCELのVBAを利用したIE(Internet Explorer)の制御方法や自動操作についてのQ&A掲示板でURLはhttp://www.vba-ie.net/qanda/qanda.cgiになります。</p>

pタグ要素内の文字列の取得は「GetElementsByTagNameメソッド」を利用すれば簡単に取り出せますが、URLだけとなると簡単にはいきません。
Instr・Mid関数などを用いて抽出することも可能ですが、今回の事例以外に複雑な文字列の場合は対応できない場合があります。
このようにある特定の文字列を抽出するのに困難な場合、正規表現は非常に便利な機能と言えます。
それでは見ていきましょう。

スポンサー リンク

正規表現で抽出したいデータを取得するサブルーチン


Function regValue(strValue As String, _
                  Optional Pattern As String = "url") As Variant()

 'パターン設定
 Const patURL As String = "http(s)?://([\w-]+\.)+[\w-]+(/[\w- ./?%&=]*)?"
 Const patMAIL As String = "[A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]{2,4}"
 Const patZIPCODE As String = "[0-9]{3}-[0-9]{4}"
 Const patTEL As String = "0[0-9]{1,4}[-(][0-9]{1,4}[-)][0-9]{4}"
 Const patTWITTER As String = "@[0-9a-zA-Z_]{1,15}"

 '正規表現オブジェクト作成
 Set objReg = CreateObject("VBScript.RegExp")
    
 With objReg
  Select Case Pattern 'パターン選択
   Case "url"
    .Pattern = patURL
   Case "mail"
    .Pattern = patMAIL
   Case "zipcode"
    .Pattern = patZIPCODE
   Case "tel"
    .Pattern = patTEL
   Case "twitter"
    .Pattern = patTWITTER
  End Select
  
  .IgnoreCase = True '大文字と小文字を区別しない
  .Global = True       '文字列全体を検索
 End With
    
 Set objMatches = objReg.Execute(strValue)
    
 '要素数セット
 Dim exeValue() As Variant
 ReDim exeValue(objMatches.Count)
    
 For i = 0 To (objMatches.Count - 1)
  exeValue(i) = objMatches(i).value
 Next

 '要素数再セット
 If UBound(exeValue) > 0 Then
  ReDim Preserve exeValue(UBound(exeValue) - 1)
 End If
    
 Set objReg = Nothing
    
 regValue = exeValue()

End Function

pタグ内のURLだけを抽出するマクロ

Sub sample()
     
 Dim objIE As InternetExplorer
 Dim objTag As Object
 Dim res As Variant
     
 'テストページをIEで表示
  Call ieView(objIE, "http://www.vba-ie.net/code/test4.html")
    
  For Each objTag In objIE.document.getElementsByTagName("p")
                                                             
  res = regValue(objTag.innerText, "url")
    
  For i = 0 To UBound(res)
   Debug.Print res(i)
    Next i

 Next

End Sub

実行結果

http://www.vba-ie.net/
http://www.vba-ie.net/qanda/qanda.cgi

今回は、値を取得するために戻り値が必要となりますのでfunctionマクロで対応しています。
引数は以下の2つが設定されています。

引数名データ型内容値の事例初期値省略
strValueStringチェックする文字列"VBAのIE制御入門サイトは・・・"×
PatternStringチェックするパターン文字列"url,"mail","zipcode","tel","twitter""url"
regValue("チェックする文字列","チェックするパターン文字列")

「strValue」は必須項目です。
正規表現で抽出する対象の文字列を指定してください。
「Pattern」は正規表現のパターンを決定するパターン文字列を入力します。
それでは、1つずつコードを見ていきましょう。


'パターン設定
Const patURL As String = "http(s)?://([\w-]+\.)+[\w-]+(/[\w- ./?%&=]*)?"
Const patMAIL As String = "[A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]{2,4}"
Const patZIPCODE As String = "[0-9]{3}-[0-9]{4}"
Const patTEL As String = "0[0-9]{1,4}[-(][0-9]{1,4}[-)][0-9]{4}"
Const patTWITTER As String = "@[0-9a-zA-Z_]{1,15}"

こちらでは、正規表現のパターンを定数に設定しています。
正規表現の書き方については割愛しますので、ご自身で調べてみてください。
尚、パターンの内容は以下になります。

  • patURL・・・urlの正規表現
  • patMAIL・・・メールアドレスの正規表現
  • patZIPCODE・・・郵便番号の正規表現
  • patTEL・・・電話番号の正規表現
  • patTWITTER・・・ツイッターアカウントの正規表現

Set objReg = CreateObject("VBScript.RegExp")

正規表現を使った検索や置き換えを行う場合は、VBScriptのRegular Expression オブジェクト(以下、RegExpオブジェクト)で制御します。
こちらでは正規表現オブジェクトのインスタンスを作成しています。


With objReg
 Select Case Pattern 'パターン選択
  Case "url"
   .Pattern = patURL
  Case "mail"
   .Pattern = patMAIL
  Case "zipcode"
   .Pattern = patZIPCODE
  Case "tel"
   .Pattern = patTEL
  Case "twitter"
   .Pattern = patTWITTER
 End Select
 
 .IgnoreCase = True '大文字と小文字を区別しない
 .Global = True       '文字列全体を検索
End With

こちらでは、、RegExpオブジェクトのプロパティを設定しています。
「Pattern」プロパティには、正規表現のパターンを設定します。
「Select Case ステートメント」で引数Pattern毎に最初に定数で設定した正規表現のパターンを決定します。

次に「IgnoreCase」プロパティは、大文字・小文字を区別するかを設定します。
こちらでは「True」を設定していますので、大文字・小文字の区分はしません。

最後に「Global」プロパティは、最初にマッチした部分だけを対象とするか、マッチした全ての部分を対象とするかを設定します。
こちらでは、「True」を設定していますので、文字列全体を検索対象としています。


Set objMatches = objReg.Execute(strValue)

こちらでは、「Execute」メソッドを利用してマッチしたデータを取得します。


Dim exeValue() As Variant
ReDim exeValue(objMatches.Count)

こちらでは、配列の要素数を設定しています。
チェックする文字列の中ではマッチする文字列が複数存在する場合もあります。
その場合は、配列数が変動するため、一旦「Dimステートメント」で配列を宣言し、「ReDimステートメント」にマッチした数の分だけ要素数に設定します。
ただし、こちらでは、「Countプロパティ」で数を取得していますが、配列は0からですので、実際には1つ多く要素数が設定されてしまいます。
色々な対応方法はあるのですが、今回は、データ取得後に要素数を1減らす対応で行っていきます。

 

For i = 0 To (objMatches.Count - 1)
 exeValue(i) = objMatches(i).value
Next

こちらでは、マッチした数だけ配列に格納しています。
この時点では、要素数が1つ多く空の要素が存在します。


If UBound(exeValue) > 0 Then
 ReDim Preserve exeValue(UBound(exeValue) - 1)
End If

こちらで空の要素を削除していきますが、マッチしなかった場合はエラーになるためい、「IF~Thenステートメント」でマッチした文字列だけ再宣言を行っています。
ちなみに「Preserve」はすでに配列内に持つデータ配列を失うことなく要素数を変更することができます。


Set objReg = Nothing
regValue = exeValue()

最後にオブジェクトを開放し、regValueの戻り値に値を代入して完了です。
注意する点は戻り値が配列変数ですので、マクロ側で値を取得するには添字を設定する必要があります。

パターン化されているHTMLほど正規表現でのデータ抽出は簡単ですので、こちらでの制御方法を覚えておくだけでも非常に便利です。

次の記事: VBAでIE操作にセルの重複データ削除 >>

Excel VBAでIEを思いのままに操作できるプログラミング術 Excel 2013/2010/2007/2003対応

近田 伸矢, 植木 悠二, 上田 寛

IEのデータ収集&自動操作のプログラミング本はこの1冊だけ!IEの起動やポップアップウィンドウ、表示を制御する基本的なコードはもちろん、テキストボックスやラジオボタン、表、ハイパーリンクなどのHTML部品を制御する方法など、自動操作に欠かせないノウハウを丁寧に解説。

VBAのIE制御についてのQ&A掲示板

↑エクセルVBAのIE(InternetExplorer)操作で分からない事があればこちらの掲示板よりご質問ください^^

ExcelのVBA初心者入門

↑こちらはExcelのVBAをマスターできるよう初心者向けのエクセルVBA入門コンテンツになります^^

VBAのIE制御入門RSS

RSSフィードを登録すると最新記事を受け取ることができます。

VBAIE操作のスカイプレッスン

VBAでIE(InternetExplorer)制御の準備

【ダウンロード】IE操作に便利なツール

こちらでは、これまでに紹介したIE(InternetExplorer)操作で便利な機能をツール化しています。無償でダウンロードできますので、目的に合わせたご利用ください。

IEオブジェクトのメソッド・プロパティ

こちらでは、IE(InternetExplorer)オブジェクトのメソッド・プロパティをまとめています。

IE操作に利用されているVBA関数

こちらでは、エクセルVBAのIE(InternetExplorer)操作で利用されたVBA関数をまとめています。

IE操作に利用されているステートメント

こちらでは、エクセルVBAのIE(InternetExplorer)操作で利用されたステートメントをまとめています。ExcelのVBAで基本的な部分になりますので、しっかり理解しましょう。

IE(InternetExplorer)制御のVBAコード

こちらでは、これまでに作成したIE(InternetExplorer)操作で役立つサブルーチンをまとめています。
全てをコピーする必要はありませんが、目的に合わせたサブルーチンをご利用ください。

ExcelのVBAで作成した役立つVBAコード

こちらでは、IE(InternetExplorer)制御の利用だけでなく、Excel全般で利用できるVBAコードです。エクセルVBAで役に立つものばかりですので、ご利用ください。