フレーム内タグの値取得「frameTagValue」の解説
今回は、フレーム内の値を取得するサブルーチン化について解説していきます。
値取得には「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部品を制御する方法など、自動操作に欠かせないノウハウを丁寧に解説。