ie-excel

エクセル・マクロでie操作

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 "http://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点がポイントです。

-ExcelでIE操作