VBAでインターネット上の画像ファイルをダウンロードする方法【URLDownloadToFile関数(API)】

今回はWindows APIの「URLDownloadToFile関数」を利用してインターネット上にあるファイルをダウンロード(名前をつけて保存)する方法を紹介していきます。

本ページで学べる内容は以下の通りです。

icon-check-square Windows APIについて
icon-check-square URLDownloadToFile関数を使ってファイルをダウンロードする方法
icon-check-square Webサイトから画像のURLを調べる方法

この関数を使いこなせると、VBAでとインターネット上の画像をまとめてダウンロードする(いわゆるWebスクレイピング)といったようなことも可能になります。

 

URLDownloadToFile関数とは

URLDownloadToFile関数とは指定したファイルをダウンロードすることのできる関数です。
本ページでは画像ファイルのダウンロード方法を紹介していきますが、この関数を使うことでPDFやZipファイルなど画像ファイル以外のさまざまなファイルをダウンロードすることができます

ファイルの種類が違ってもコード内容はどれも同じなのでご安心ください!

 
URLDownloadToFile関数はVBAで用意されているものではなくWindows API(Application Programming Interface)の中にある関数です。Windows APIとは簡単にいえばWindowsに用意されている機能がまとまっているセットのようなものです。

VBAを使ってこのWindows APIを呼び出すことで、Windowsに用意されている様々な機能を使用することができます。(たとえばWindowsのシステム効果音を鳴らしたり、キーボードの入力を取得したりすることができます)

Windows APIをよく知らない方は「なんか難しそう」と感じると思いますがコードの内容はあまり難しいものではないので、VBAがある程度理解できている方であればすぐに理解することができます。

ちなみに名前からわかると思いますが、Windows APIではWindowsの機能を呼び出しているだけので基本的にはWindows以外のOSでは使用することはできません

 

URLDownloadToFile関数の使い方

URLDownloadToFile関数を使うにははじめに
「Windows APIのURLDownloadToFile関数を使うよ」と宣言する必要があります。
※宣言をしないとURLDownloadToFile関数は使えずエラーになるので書き忘れに注意しましょう。

使用しているWindowsが32bitか64bitかによって宣言時に書く内容が変わってきます。
以下のどちらかをコードの一番初め(Option Explicitの次の行あたり)に書いておくことで、そのモジュール内でURLDownloadToFile関数を使うことができるようになります。

 icon-code 64bit 

Private Declare PtrSafe 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

 icon-code 32bit 

Private 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

※操作環境のbitと構文があっていないとエラーになるので注意しましょう。

上記のどちらを書けばいいかわからない場合は以下のコードをコピペして、モジュールの最上部に書いておきましょう。この構文を書いておくことで自動的に使うことのできる方の構文が使用されます。

 

URLDownloadToFile関数の構文

URLDownloadToFile関数の構文は下記のとおりです。

icon-code キー別関数の作成

Dim res As Integer
res = URLDownloadToFile(0, URL, SavePath, 0, 0)

引数として5つ設定する場所がありますが、基本的にはURL, SavePathの部分だけ入力します。
(それ以外はすべて「0」でOKです)

URLにはダウンロードするファイルのURLを入力します。
例えば本サイトのロゴ画像のURLは
https://liclog.net/wp-content/uploads/2019/01/logo.png」です。
(ブラウザ上部の検索バーに入力するとロゴ画像のみのページに飛ぶことが確認できます)

SavePathには保存するファイル名を含めたファイルのフルパスを入力します。
例えばデスクトップ上の「Download」というフォルダに「Sample.png」というファイル名で保存する場合は「C:¥Users¥user¥Desktop¥Download¥sample.png」と入力します。
指定したパスのファイルが既に存在する場合は上書きされるので注意しましょう。

返り値(上記コードでいう「res」)はファイルの保存が成功した場合は「0」、保存できなかった場合は「0以外の値」が返されます。
 

引数としてダウンロードするファイルのURLを入力する必要がありますが、そもそも保存したい画像のURLを知らない場合の方が多いです。ここでは手動で画像のURLを調べる方法を解説していきます。(VBAを使い自動で画像URLを取得する方法もあります)
以下は「Google」のトップページのGoogleのロゴ画像のURLを調べる方法です。
使用ブラウザは「Google Chrome」ですが「IE」でも「FireFox」でもこれに対応する機能が存在するので同じような方法で調べることができます。(詳しくは)
 
① Chromeデベロッパーツールの起動
 ブラウザ上で右クリックをして「検証」をクリックします。
 (ショートカットキー[Ctrl]+[Shift]+[I]でも可)

 

 ② デベロッパーツールの左上のアイコンクリック
 デベロッパツールが開いたら左上のカーソルのアイコンをクリックします。
 ([Select an elements in the page to inspect it]というコマンド)
 これによりブラウザ内の要素のコードを簡単に見つけることが可能になります。

 

③ ブラウザ上の画像をクリック
 最後にブラウザ上の画像をクリックします。
 するとクリックした要素の書かれた部分をハイライトしてくれます。
 このうち「src=」の後に続いている部分が画像のURLとなります。(画像クリックで拡大)
 

 
上画像の場合「/images/branding/googlelogo/2x/googlelogo_color_272x92dp.png」と前半部分がありませんが、この場合はトップページの「https://www.google.com/」が付くと考えてください。

 

URLDownloadToFile関数サンプルコード

最後にURLDownloadToFile関数を使ったサンプルコードを紹介します。
コードの処理内容は「Googleのトップページのロゴ画像をダウンロードする」です。

DownloadImageという関数を作成し、その中でURLDownloadToFile関数を使っています。
DownloadImage関数では引数は「保存する画像のURL」と「保存先のフォルダのパス」の2つです。

保存するファイル名は「保存する画像のURL」から取得します。サンプルコードの場合は「https://www.google.com//images/branding/googlelogo/2x/googlelogo_color_272x92dp.png」なので「googlelogo_color_272x92dp.png」の部分を抜き出してファイル名としています。

下記コードの「URL」に中身を変更すれば任意のファイルをダウンロードすることができます。
(イミディエイトウィンドウにダウンロード結果を表示させるようになっています)

 

まとめ

今回はWindows APIの「URLDownloadToFile関数」を使い、画像ファイルをダウンロードする方法についての内容でした。

VBAではインターネットエクスプローラー(IE)を操作したり、HTML情報を取得することもできます。
今回のURLDownloadToFile関数とこれら機能を合わせることで、画像検索結果の上位100枚を全て自動でダウンロードしたりすることもできます。

サンプルコードのようにURLDownloadToFile関数のみで使う事はあまりありませんが、Webスクレイピングの機能として利用することは多くあるのでこの関数は覚えておいて損はないと思います。
 

icon-book VBAで他のWindows APIを使うなら

CATIAマクロ, Excel, VBA, Windows API

Posted by Lic