テキストボックス以外から値を取得する
操作対象画面(単純なテーブルの例)を起動
'サンプル3.4.1_テキストボックス以外(テーブル)から値を取得する
Public Sub getDataFromTable()
Dim ie As InternetExplorer
Dim htdoc As HTMLDocument
Dim TDs As Object
Dim TD As HTMLTableCell
'操作対象Web画面を取得
Set ie = getIE("単純なテーブルの例")
'ドキュメントを取り出す(参照設定:Microsoft HTML Object Library)
Set htdoc = ie.document
'ドキュメントに含まれるすべてのTD要素を取り出す
Set TDs = htdoc.getElementsByTagName("TD")
'すべてのTD要素内の値を出力する
For Each TD In TDs
'innerTextを出力
MsgBox TD.innerText
Next
End Sub
'ドキュメントタイトル/URLを指定してIEを取得
Public Function getIE(arg_title As String, Optional arg_url As String) As Object
Dim ie As Object 'IEを格納する変数(オブジェクト型)
Dim sh As Object '起動中のShellWindow一式を格納する変数
Dim win As Object 'ShellWindowを格納する変数
Dim document_title As String 'ドキュメントタイトルの一時格納変数
Set sh = CreateObject("Shell.Application") 'ShellWindowをwinsに格納
'ShellWindowから1つづつ取得して処理
For Each win In sh.windows
'ドキュメントタイトル取得失敗を無視(処理継続)
On Error Resume Next
document_title = ""
document_title = win.document.Title
On Error GoTo 0
'タイトルバーに引数が含まれるかチェック
If InStr(document_title, arg_title) > 0 Then
Set ie = win '変数ieに取得したwinを格納
Exit For 'ループを抜ける
End If
Next
Set getIE = ie '値の返却
End Function
タグから値を取得する場合、まずはタグ名を指定してHTML文書中のすべての特定タグ要素を取得する。
Set TDs = htdoc.getElementsByTagName("TD")
取得した各要素に対して、For Eachでループさせれば全要素の値が出力できるわ。
For Each TD In TDs
'innerTextを出力
MsgBox TD.innerText
Next
'サンプル3.4.2_テキストボックス以外(テーブル)から値を取得する(特定値)
Public Sub getDataFromTable2()
Dim ie As InternetExplorer
Dim htdoc As HTMLDocument
Dim TDs As Object
Dim i As Integer
'操作対象Web画面を取得
Set ie = getIE("単純なテーブルの例")
'ドキュメントを取り出す(参照設定:Microsoft HTML Object Library)
Set htdoc = ie.document
'ドキュメントに含まれるすべてのTD要素を取り出す
Set TDs = htdoc.getElementsByTagName("TD")
'すべてのTD要素内の値をチェック(Lengthは要素数なので、indexとしては-1が必要)
For i = 0 To TDs.Length - 1
'innerTextをチェック
If TDs(i).innerText = "ラーメン" Then
'次のTDタグに金額があるのでi+1番目のinnerTextを表示
MsgBox TDs(i + 1).innerText
'ループを抜ける
Exit For
End If
Next
End Sub
'ドキュメントタイトル/URLを指定してIEを取得
Public Function getIE(arg_title As String, Optional arg_url As String) As Object
Dim ie As Object 'IEを格納する変数(オブジェクト型)
Dim sh As Object '起動中のShellWindow一式を格納する変数
Dim win As Object 'ShellWindowを格納する変数
Dim document_title As String 'ドキュメントタイトルの一時格納変数
Set sh = CreateObject("Shell.Application") 'ShellWindowをwinsに格納
'ShellWindowから1つづつ取得して処理
For Each win In sh.windows
'ドキュメントタイトル取得失敗を無視(処理継続)
On Error Resume Next
document_title = ""
document_title = win.document.Title
On Error GoTo 0
'タイトルバーに引数が含まれるかチェック
If InStr(document_title, arg_title) > 0 Then
Set ie = win '変数ieに取得したwinを格納
Exit For 'ループを抜ける
End If
Next
Set getIE = ie '値の返却
End Function
先の例ではテーブルのすべてのセル値を取得したけれど、今度はテーブル中の特定の値、たとえば「ラーメン」に対応する価格を取得する。
考え方としては、「ラーメン」という値が出てきたら、その次のTDタグの値を取得する、という処理を作るわ。
そのためにはループの条件をFor Eachから以下のように修正する必要がある。
For i = 0 To TDs.Length - 1
ループの中ではTD要素の中身を評価して、「ラーメン」だった場合に「i + 1」番目のTD要素の値を取得する。
If TDs(i).innerText = "ラーメン" Then
'次のTDタグに金額があるのでi+1番目のinnerTextを表示
MsgBox TDs(i + 1).innerText
今回はシンプルなテーブルなのでi+1が隣のセルを表すけれど、複雑な段組や入れ子構造がある場合はiに加算する値を調整したり出現回数を意識する場合があるわ。