フレーム内タグの値取得「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

実行結果

VBAでFormを操作するためのテストページ

今回は値の取得ですので、functionマクロで対応しています。引数は4つで設定しています。

引数名データ型内容値の事例初期値省略
objIEInternetExplorerIEオブジェクトobjIE,objIE2×
tagNameString目的タグの文字列"p","h1","tr","li"×
tagStrString目的エレメント内の一意のキーワード文字列"p-value"×
valueTypeString要素テキスト取得のプロパティ文字列"innerHTML",
"innerText",
"outerHTML",
"outerText"
×
frameTagValue("IEオブジェクト","目的タグの文字列","目的エレメント内の一意のキーワード文字列","テキスト取得のプロパティ文字列")

こちらは、全て必須項目となります。
「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にアクセスして取得すればよいだけの話です。
もちろんお気づきの方もいるかと思いますが、

Debug.Print FrameTagValue(objIE, "h1", "ieView2", "innerText")

とすれば、フレーム2のh1の取得が可能です。
しかし、実践的に考えて1ページのh1タグを取得するのであれば、単純にコピペすればいいだけですので、プログラム自体の必要性はありません。
必要性があるとすれば、大量ページから取得するなどの処理の場合です。
この場合では、上記のような方法は無意味です。
なぜなら必ず全てのページにieView2が含まれているわけではないからです。
フレーム内でどうしても一意の文言がない場合は、無理にサブルーチンを使わずに直接取得する方法に切り替えてください。

次の記事: 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)操作で役立つサブルーチンをまとめています。
全てをコピーする必要はありませんが、目的に合わせたサブルーチンをご利用ください。