VBAでウェブページのデータを取得して、エクセルの表に取り込みます。
例としてyahooのトップページ(https://www.yahoo.co.jp/)を取り込んでみます。
VBAでウェブページを取り込む時の対応ブラウザはIEのみです。
それ以外のブラウザは使用できません。。
HTMLコードをこんな感じで取り込みます
1つの要素に対して、エクセルの1行に収まるように取得します。
取得する要素は次の通りです。全部で5つあります。
取得したデータについて調べました。簡単ですが次のようになります。
- TypeName
データの型 - tagName
指定したHTML要素の名前 - outerHTML
指定したHTML要素とその子要素 - innerHTML
指定したHTML要素の子要素 - outerText
指定したHTML要素のテキスト
上記の例だと、指定したHTML要素は「section」で、③ではsectionタグとそれに含まれる子要素も取得されています。④は「section」を除いた子要素のみ取得されています。
子要素は「h1」「ul」「li」「a」まで取得できてますが、実際のコードでは「a」タグ以下にspanタグもあります。これはVBAで取得する文字列を256文字まで制限しているからです。
⑤では「a」タグで指定されているテキストリンクの文字列が取得されています。
完成したVBAコード(全体)
完成したコードはこちらです!yahooのトップページの要素を取得するように設定されているので、他のサイトを取得する場合、MakeIchiranプロシージャーで宣言されているobjieの値を変更してください!
Set objie = UrlIE(“https://www.yahoo.co.jp/“)
Option Explicit
'URLを指定してIEを取得する
Function UrlIE(UrlTarget As String) As Object
Dim ie As Object
Set ie = CreateObject("InternetExplorer.Application")
ie.Visible = True
ie.navigate UrlTarget
Do While ie.Busy = True Or ie.readyState <> 4
DoEvents
Loop
Set UrlIE = ie
End Function
'要素を全て取得(確認用の要素一覧)
Sub MakeIchiran()
Dim objie As Object
Set objie = UrlIE("https://www.yahoo.co.jp/")
Call Ichiran_Make(objie)
MsgBox "一覧を作成しました"
End Sub
Sub Ichiran_Make(objie As Object)
Dim el As Object
Dim n As Long
Sheets("一覧").Select
Cells.ClearContents
'タイトル入力
Cells(1, 1) = "No."
Cells(1, 2) = "TypeName"
Cells(1, 3) = "tagName"
Cells(1, 4) = "outerHTML"
Cells(1, 5) = "innerHTML"
Cells(1, 6) = "outerText"
'幅指定
Cells(1, 1).ColumnWidth = 5.63
Cells(1, 2).ColumnWidth = 9.63
Cells(1, 3).ColumnWidth = 4.75
Cells(1, 4).ColumnWidth = 12.38
Cells(1, 5).ColumnWidth = 12.38
Cells(1, 6).ColumnWidth = 12.38
For Each el In objie.document.all
n = n + 1
Cells(n + 1, 1) = n
Cells(n + 1, 2) = "'" & TypeName(el) 'TypeNameでオブジェクトのタイプを表示
Cells(n + 1, 3) = "'" & el.tagName 'タグの名前
Cells(n + 1, 4) = "'" & Left(el.outerHTML, 256)
Cells(n + 1, 5) = "'" & Left(el.innerHTML, 256)
Cells(n + 1, 6) = "'" & Left(el.outerText, 256)
Next el
End Sub
ウェブページの読み込みが完了するまで処理を止める
ページの読みが完了しない状態でHTML要素を取得しようとすると、エラーになる場合があります。
そのため、サイトのページ読み込みが完了してから処理を実行します。
Do While ie.Busy = True Or ie.readyState <> 4
DoEvents
Loop
これはお約束なので、そのまま覚えます。
ちなみに、DoEventsはVBAからOSに制御を渡す関数で、IEがページ読み込みを完了するまで実行します。
ページ読み込み完了は、InternetExplorerオブジェクトのBusyプロパティと、readyStateプロパティの値で判定します。
<参考サイト>
まとめ
開いたページを表示させたら、InternetExplorerオブジェクトとして取得します。
あとは、オブジェクトが持っているプロパティやメソッドを調べながら、どんな値が取得できるか試行錯誤しながらの作業となります。これはHTMLの構造をチェックするのに役立つコードだと思いました。
コメント