VBAのIE(InternetExplorer)制御のframe内値取得のサブルーチン化する方法について解説しています。
今回は、フレーム内の値を取得するサブルーチン化について解説していきます。
値取得には「GetElementByIdメソッドによる取得」「GetElementsByNameメソッドによる取得」「GetElementsByClassNameメソッドによる取得」など様々な方法がありましたが、一番利便性の高い「GetElementsByTagNameメソッドによる取得」を応用したサブルーチンを作成していきます。
Function frameTagValue(objIE As InternetExplorer, _
tagName As String, _
tagStr As String, _
valueType As String) As String
'フレームのオブジェクトを取得する
Set objFrame = objIE.document.frames
'フレームドキュメントのオブジェクトを取得する
For i = 0 To objFrame.Length - 1
Set objFrameDoc = objFrame(i).document
For Each objTag In objFrameDoc.getElementsByTagName(tagName)
With objTag
If InStr(.outerHTML, tagStr) > 0 Then
Select Case valueType
Case "innerHTML"
FrameTagValue = .innerHTML
Case "innerText"
FrameTagValue = .innerText
Case "outerHTML"
FrameTagValue = .outerHTML
Case "outerText"
FrameTagValue = .outerText
End Select
GoTo label01
End If
End With
Next
Next i
label01:
End Function
※ドラッグ(スワイプ)すると全体を確認できます。
Sub sample()
Dim objIE As InternetExplorer
'本サイトを起動
Call ieView(objIE, "http://www.vba-ie.net/code/test2.html")
Debug.Print frameTagValue(objIE, "h1", "", "innerText")
End Sub
※ドラッグ(スワイプ)すると全体を確認できます。
今回は値の取得ですので、functionマクロで対応しています。引数は4つで設定しています。
引数名 | データ型 | 内容 | 値の事例 | 初期値 | 省略 |
---|---|---|---|---|---|
objIE | InternetExplorer | IEオブジェクト | objIE,objIE2 | × | |
tagName | String | 目的タグの文字列 | "p","h1","tr","li" | × | |
tagStr | String | 目的エレメント内の一意のキーワード文字列 | "p-value" | × | |
valueType | String | 要素テキスト取得のプロパティ文字列 | "innerHTML", "innerText", "outerHTML", "outerText" | × |
こちらは、全て必須項目となります。
「objIE」はオブジェクトを入力します。
「tagName」はタグ要素(a,p,inputなど)の文字列を入力します。
「tagStr」には、エレメントに含まれる一意のキーワード文字列を入力します。「一意のキーワード」とはそこでしか使われていない文字列のことです。
探すポイントとしては、まずid属性が設定されているか確認してください。id属性は一意の属性ですので、こちらが設定されていれば簡単に取得できます。今回のpタグもid="p-value"があるエレメントを取得するという設定になっています。
id属性がない場合は、name属性・class属性で一意のキーワードがないか確認していきます。また、リンクのテキストを取得する場合は、URLの法則を見つけ、一意のキーワードを探していきます。
「valueType」には、要素テキスト取得のプロパティ(innerHTML,innerText,outerHTML,outerText)の文字列を入力します。
Set objFrame = objIE.document.frames
※ドラッグ(スワイプ)すると全体を確認できます。
こちらでフレーム情報を取得します。
For i = 0 To objFrame.Length - 1
(省略)
Next
※ドラッグ(スワイプ)すると全体を確認できます。
Lengthプロパティはフレームの数を取得します。
今回のフレーム数は2ですが、フレームは0からスタートするので、-1で処理数を合わせています。
Set objFrameDoc = objFrame(i).document
※ドラッグ(スワイプ)すると全体を確認できます。
こちらでループ毎にフレームのドキュメントを取得していきます。
For Each objTag In objFrameDoc.getElementsByTagName(tagName)
With objTag
If InStr(.outerHTML, tagStr) > 0 Then
Select Case valueType
Case "innerHTML"
FrameTagValue = .innerHTML
Case "innerText"
FrameTagValue = .innerText
Case "outerHTML"
FrameTagValue = .outerHTML
Case "outerText"
FrameTagValue = .outerText
End Select
GoTo label01
End If
End With
Next
※ドラッグ(スワイプ)すると全体を確認できます。
こちらの処理は「tagValueサブルーチン」と同じ処理になります。
フレームドキュメント内でまず指定したタグを取得して、指定したタグのエレメントから一意の文言がある場合に値を取得する処理です。最後に完了したら、Gotoステートメントを利用してループ脱出という流れになります。
さて、今回は、最初のフレームのh1タグのテキストを抽出しましたが、2つ目のフレームのh1タグテキストを取得する場合どうしますか?
もしサブルーチンをどうにかしようと考えているのであれば、汎用性のあるサブルーチンを考えてください。
例えば今回だけ取得する方法を考えるのであれば、何もサブルーチンを利用する必要もありません。
サブルーチンはあくまで汎用性のあるプログラムですので、今回のようにh1タグに一意性がなければ、直接フレーム2にアクセスして取得すればよいだけの話です。
もちろんお気づきの方もいるかと思いますが、
とすれば、フレーム2のh1の取得が可能です。
しかし、実践的に考えて1ページのh1タグを取得するのであれば、単純にコピペすればいいだけですので、プログラム自体の必要性はありません。
必要性があるとすれば、大量ページから取得するなどの処理の場合です。
この場合では、上記のような方法は無意味です。
なぜなら必ず全てのページにieView2が含まれているわけではないからです。
フレーム内でどうしても一意の文言がない場合は、無理にサブルーチンを使わずに直接取得する方法に切り替えてください。
次の記事: 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)操作で役立つサブルーチンをまとめています。
全てをコピーする必要はありませんが、目的に合わせたサブルーチンをご利用ください。