Excel VBAでIEを操作 ファイルをPCにダウンロード
2016/10/17
Excelで目的のページにたどり着く方法。
そして、そこにあるテーブルをエクセルにコピーする方法を例示してきました。
今回は該当ページのイメージデータ(画像)を自動的にダウンロードするやり方をを例示したいと思います。
そこで今回のお題は
・Yahoo!JAPANを表示
・サイトにある全イメージデータをCドライブにコピー
を実践。
上記お題は、以下の操作をすることにより可能となります。
・エクセルを起動
・(バージョンによっては)マクロを有効にする
・マクロの編集画面で、以下のコードをコピー&ペースト
・マクロを実行
コピペするコード
Dim ObjIE As Object '変数を定義 Dim Obj As Object '変数を定義 Dim Rtn_Down As Integer '変数を定義 Dim Rtn_del As Integer '変数を定義 'Sleepを使用する場合のお約束 Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long) 'URLDownloadToFileを使用する場合のお約束 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 'DeleteUrlCacheEntryを使用する場合のお約束 Declare Function DeleteUrlCacheEntry Lib "wininet" _ Alias "DeleteUrlCacheEntryA" (ByVal lpszUrlName As String) As Long Sub IE_open() Set ObjIE = CreateObject("InternetExplorer.Application") 'IEを開く際のお約束 ObjIE.Visible = True 'IEを開く際のお約束 ObjIE.Navigate "https://www.yahoo.co.jp/" '開きたいサイトのURLを指定 Sleep (1000) Do While ObjIE.ReadyState <> 4 'サイトが開かれるまで待つ(お約束) Do While ObjIE.Busy = True 'サイトが開かれるまで待つ(お約束) Loop Loop For Each Obj In ObjIE.document.images '表示されているサイトのイメージタグを一つずつを変数objにセット Rtn_del = DeleteUrlCacheEntry(Obj.href) 'ダウンロード対象のキャッシュをクリア Rtn_Down = URLDownloadToFile(0, Obj.href, "c:\" + Obj.Nameprop, 0, 0) 'ファイルをダウンロード(URLとダウンロード先(Cドライブ直下)を指定) Next '次のタグを処理 End Sub
Cドライブの直下にたくさんのイメージファイルがダウンロードされていませんか?
ではソースの解説です。
赤字箇所のみに限定して説明します。
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
ファイルダウンロード用のAPI「URLDownloadToFile」を使用するための宣言です。
あまり難しいことを考えずに、URLDownloadToFileを使用する場合、「お約束」で記述すると覚えておきましょう。
続いてのコードです。
Declare Function DeleteUrlCacheEntry Lib "wininet" _ Alias "DeleteUrlCacheEntryA" (ByVal lpszUrlName As String) As Long
ダウンロードするファイルのキャッシュを念のために消しておく処理です。
キャッシュをクリアする処理がないと、キャッシュされた古いデータがダウンロードされる場合もあります。
キャッシュクリア用のAPI「DeleteUrlCacheEntry」を使用するための「お約束」と覚えておきましょう
続いてのコードです。
For Each Obj In ObjIE.document.images ・・・ Next
前回までは、
・document.all : 全タグが検索対象
・document.all.getElementsByTagName("タグ名") : 指定されたタグのみ検索対象
を紹介してきましたが、同様の処理で「images」があります。
これは、getElementsByTagName("img")と同等の処理となり、イメージタグのみを抽出する処理です。
続いてのコードです。
Rtn_del = DeleteUrlCacheEntry(Obj.href)
ダウンロード対象のURLのキャッシュをクリアしています。
obj.href
イメージタグの画像の(絶対パス付き)ファイル名は自体は「href」に設定されています。
DeleteUrlCacheEntry(URL名)
キャッシュのクリアをするAPIです。
パラメータはURLのみです。
リターンコード「Rtn_del」に値を入れていますが、このリターン値を対象とした処理は特にしていません。
続いてのコードです。
Rtn = URLDownloadToFile(0, Obj.href, "c:\" + Obj.Nameprop, 0, 0)
ファイルダウンロード用API「URLDownloadToFile」を呼び出しています。
URLDownloadToFile
ファイルをダウンロードするAPIです。
パラメーターは以下の通り
パラメータ | 設定値 |
---|---|
pCaller | 0 |
szURL | ダウンロードするURL |
szFileName | ダウンロードする場所 |
dwReserved | 0(固定) |
lpfnCB | 0 ダイアログの出力有無 |
Obj.Nameprop
イメージタグ上、ファイル名はNamepropに設定されています。
今回のポイントの整理です。
・イメージのみを検索したい場合「document.image」でも検索可能
・ファイルのダウンロードするにはAPI「」を使用
・ファイルのダウンロード前に、キャッシュのクリアが必要(API使用)
・イメージタグに設定される絶対パス付きファイル名は「href」に収録
・イメージタグに設定されるパスなしファイル名は「Nameprop」に収録
といった5点がポイントです。