【VBA】Webのテーブルデータ取得(InternetExplorer)

2021年9月3日

HTML

jimです。じゃんぼ✋

最近、Web操作(IE)の自動化をしなくてはいけなくて。

他にも方法はあるんだけど、情シスに断られてしまって。。

だから、仕方なくVBAでWebの自動化をしたっていう。。。

その時、Web操作のマクロを組むのが久しぶりで『色々忘れてた』ってのと、『派遣先が変わる度に調べるの面倒だな』っと思ったから記事にすることにしました。

ってことで、今回は『Webのテーブルデータ取得』の記事っす。

例えば↓の表みたいなものがあったとする(例えばね例えば)

a i u e o
K
S

これをブラウザの開発者ツール(F12)で見てみる・・・

『table』の配下に『tr』がいるということ。

↓図にすると、こんな感じでしょうか?

テーブルがあって、その下に行があるといった感じ。

さらに『tr』の配下を見てやります。

『tr』の配下に『th(td)』がいるわけです。

↓これを図にすると、こんな感じかな?

わかります?

 

コードを書き散らかす

じゃあ、具体的にどう取得すんのか?ってーと、

Excelでいう○○と言うBookの△△って言うシートの××ってセルみたいな指定をします。

下記コードのdebug.print部分っす。

参照設定に『InternetControls』と『HTMLObjectLibrary』が必要です。

Option Explicit
Sub table()
Dim objIe As InternetExplorer
Dim ieDocument As HTMLDocument
Dim i As Integer
    If GetWindow(objIe) = False Then
        Set objIe = CreateObject("InternetExplorer.Application")
        objIe.Visible = True
        objIe.navigate "https://bw-rocket.com/2021/08/23/post-2750/"
        Call WaitLoad(objIe)
    End If
    'th
    '正確には↓でしょうか?
    Debug.Print objIe.document.getElementById("gaketable"). _
                getElementsByTagName("tbody")(0). _
                getElementsByTagName("tr")(0). _
                getElementsByTagName("th")(1).innerText
    '繰り返すなら変数使ったほうがいい?
    Set ieDocument = objIe.document.getElementById("gaketable"). _
                getElementsByTagName("tbody")(0)
    For i = 0 To 5
        Debug.Print ieDocument.document.getElementsByTagName("th")(i).innerText
    Next
    'そもそもtrにIDが付いてるならtrから取得すればよい?
    Debug.Print objIe.document.getElementById("gake"). _
                getElementsByTagName("th")(2).innerText
    'td
    '2行目の4項目目
    Debug.Print objIe.document.getElementById("gake0"). _
                getElementsByTagName("td")(3).outerText
    '3行目の5項目目
    Debug.Print objIe.document.getElementById("gake1"). _
                getElementsByTagName("td")(4).innerHTML
    '4行目の6項目目
    Debug.Print objIe.document.getElementById("gake2"). _
                getElementsByTagName("td")(5).outerHTML
End Sub
Private Sub WaitLoad(ByVal objIe As InternetExplorer)
    Do While objIe.Busy = True Or objIe.readyState <> 4
        DoEvents
    Loop
End Sub
Function GetWindow(ByRef objIe As InternetExplorer)
Dim shellObject As Object
Dim windowObject As Object
    Set shellObject = CreateObject("Shell.Application")
    For Each windowObject In shellObject.Windows
        If windowObject = "Internet Explorer" Then
            If windowObject.document.Title = "【VBA】IEの表からデータを抜き出す | 崖っぷち派遣社員の日常" Then
                Set objIe = windowObject
                GetWindow = True
                Exit For
            End If
        End If
    Next
End Function

「tableやtrにid振ってなかったらどうすんの?」って思いました?

やれるけど、面倒す。というか、IEの自動操作全般ね。

そもそもの話、IEの操作って面倒だしオワコンだしイケてないのかもしれませんね。

独り言みたいなコメントアウトは無視してOK👍

んじゃ、またねぇ✋