【備忘】IFrameの中にある要素を取得するVBAコード

昨日、投降したVBAでネット上のファイルをダウンロードするマクロですが、どうやらご希望に添えるものではなかったようです。なんでも、IFrameがDOMにあったために、要素にたどり着けないんだとか。調べてみると、IFrameがあるDOMは一度IFrameのsrcを取得し、そこにNavigateしてから再度要素を取得しなければ取れないようです。 今回はアマゾンにあるフィギュアの画像を取るコードを書いていきたいと思います。

f:id:osashimix:20181029230214p:plain

御覧の通り、このページにはIFrameが入っています。今回はここから澪ちゃんのかわいい画像を保存するVBAを書きたいと思います(ファイルのダウンロードはないので)。

' Windows APIを呼び出すためのおまじない
Declare Function URLDownloadToFile Lib "urlmon" Alias _
    "URLDownloadToFileA" (ByVal pCaller As Long, _
    ByVal szURL As String, _
    ByVal szFileName As String, _
    ByVal dwReserved As Long, _
    ByVal lpfnCB As Long) As Long

Sub IFrame()

 Dim objIE As New InternetExplorer
 Dim URL As String, productTitle As String
 Dim objFrame As Object
 Dim result As Long
 
' おなじみの処理
 objIE.Visible = True
 URL = "https://www.amazon.co.jp/????????-?H?R?Y-1-7?X?P?[??-PVC?h?????????i/dp/B0041N46YS/ref=pd_sbs_0_5?_encoding=UTF8&pd_rd_i=B0041N46YS&pd_rd_r=a406524c-db7e-11e8-839d-5bb4d62fdf30&pd_rd_w=uhimH&pd_rd_wg=aIcmG&pf_rd_i=desktop-dp-sims&pf_rd_m=AN1VRQENFRJN5&pf_rd_p=cda7018a-662b-401f-9c16-bd4ec317039e&pf_rd_r=CMY0BXR864H44YSETHH0&pf_rd_s=desktop-dp-sims&pf_rd_t=40701&psc=1&refRID=CMY0BXR864H44YSETHH0"
 objIE.Navigate URL
 Do Until objIE.ReadyState = READYSTATE_COMPLETE
     DoEvents
 Loop

' IFrameタグの一番目を抽出し、そのソースコードへ移動(画面上に変化はなし) 
 Set objFrame = objIE.document.getElementsByTagName("iframe")(0)
 objIE.Navigate objFrame.getAttribute("src")
 
' うまく取れているか試すために商品名を抽出
 productTitle = objIE.document.getElementById("productTitle").innerText
 Debug.Print productTitle

' 画像のリンクを保存
 link = objIE.document.getElementById("landingImage").src
 
' ファイル名を取得
Filename = Mid(link, InStrRev(link, "/") + 1)
saveName = "C:\Users\aashi\Pictures" & "\" & Filename

' ダウンロードを実行
result = URLDownloadToFile(0, link, saveName, 0, 0)

End Sub

とれました。

f:id:osashimix:20181029231152p:plain

ここまで書いて判明したことですが、別にこのページに関してはIFrameのsrcを読み込まなくてもDLできました。けど、たぶんIFrameの中に組み込まれている要素もとれるはず(サンプルとなるページが見当たりませんでした)。 調べているとこんなページも見つけました。HTMLIFrameという変数の型があるらしく、そのプロパティやメソッドを使っているらしいです。具体的にどんなものかはまだ調べられていませんが、これを駆使するのも一つの方法かもしれません。