VBAのIE(InternetExplorer)制御で役立つ正規表現でデータを抽出する制御方法について解説しています。
今回は、正規表現を利用したデータの抽出方法について解説していきます。
Wikipediaでは「正規表現(せいきひょうげん、英: regular expression)とは、文字列の集合を一つの文字列で表現する方法の一つである。」と説明されていますが、知らない方にとってはなんとも分かりづらい表現です
私も理解できるように説明はできませんが、要はある文字列の中で指定したパターン(正規表現)にあてはまる文字列を抽出したり、数を数えたりと覚えれば大変便利な機能となります。
ワイルドカードといえば、理解できる方もいるかと思いますが、ワイルドカードを更に強化したものが正規表現だと思ってください。
では、VBAのIE制御でどのような場面で利用されるかというと、以下の場合URLだけを抽出するにはどのように制御したらいいでしょうか?
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
※ドラッグ(スワイプ)すると全体を確認できます。
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
※ドラッグ(スワイプ)すると全体を確認できます。
今回は、値を取得するために戻り値が必要となりますのでfunctionマクロで対応しています。
引数は以下の2つが設定されています。
引数名 | データ型 | 内容 | 値の事例 | 初期値 | 省略 |
---|---|---|---|---|---|
strValue | String | チェックする文字列 | "VBAのIE制御入門サイトは・・・" | × | |
Pattern | String | チェックするパターン文字列 | "url,"mail","zipcode","tel","twitter" | "url" | ○ |
「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}"
※ドラッグ(スワイプ)すると全体を確認できます。
こちらでは、正規表現のパターンを定数に設定しています。
正規表現の書き方については割愛しますので、ご自身で調べてみてください。
尚、パターンの内容は以下になります。
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操作にセルの重複データ削除 >>
近田 伸矢, 植木 悠二, 上田 寛
IEのデータ収集&自動操作のプログラミング本はこの1冊だけ!IEの起動やポップアップウィンドウ、表示を制御する基本的なコードはもちろん、テキストボックスやラジオボタン、表、ハイパーリンクなどのHTML部品を制御する方法など、自動操作に欠かせないノウハウを丁寧に解説。
↑VBAのIE操作で分からない事があればこちらの掲示板よりご質問ください。
ExcelのVBA初心者入門↑こちらはVBAをマスターできるよう初心者向けのエクセルVBA入門コンテンツになります。
こちらでは、これまでに紹介したIE(InternetExplorer)操作で便利な機能をツール化しています。無償でダウンロードできますので、目的に合わせたご利用ください。
こちらでは、IE(InternetExplorer)オブジェクトのメソッド・プロパティをまとめています。
こちらでは、エクセルVBAのIE(InternetExplorer)操作で利用されたVBA関数をまとめています。
こちらでは、エクセルVBAのIE(InternetExplorer)操作で利用されたステートメントをまとめています。ExcelのVBAで基本的な部分になりますので、しっかり理解しましょう。
こちらでは、これまでに作成したIE(InternetExplorer)操作で役立つサブルーチンをまとめています。
全てをコピーする必要はありませんが、目的に合わせたサブルーチンをご利用ください。
こちらでは、IE(InternetExplorer)制御の利用だけでなく、Excel全般で利用できるVBAコードです。エクセルVBAで役に立つものばかりですので、ご利用ください。