VBAでインターネット上の画像ファイルをダウンロードする方法【URLDownloadToFile関数(API)】
今回はWindows APIの「URLDownloadToFile関数」を利用してインターネット上にあるファイルをダウンロード(名前をつけて保存)する方法を紹介していきます。
本ページで学べる内容は以下の通りです。
URLDownloadToFile関数を使ってファイルをダウンロードする方法
Webサイトから画像のURLを調べる方法
この関数を使いこなせると、VBAでとインターネット上の画像をまとめてダウンロードする(いわゆるWebスクレイピング)といったようなことも可能になります。
URLDownloadToFile関数とは
URLDownloadToFile関数とは指定したファイルをダウンロードすることのできる関数です。
URLDownloadToFile function (Windows) – Microsoft Learn
本ページでは画像ファイルのダウンロード方法を紹介していきますが、この関数を使うことで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関数を使うことができるようになります。
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
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と構文があっていないとエラーになるので注意しましょう。
上記のどちらを書けばいいかわからない場合は以下のコードをコピペして、モジュールの最上部に書いておきましょう。この構文を書いておくことで自動的に使うことのできる方の構文が使用されます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
#If Win64 Then 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 #Else 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 #End If |
URLDownloadToFile関数の構文
URLDownloadToFile関数の構文は下記のとおりです。
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以外の値」が返されます。
使用ブラウザは「Google Chrome」ですが「IE」でも「FireFox」でもこれに対応する機能が存在するので同じような方法で調べることができます。(詳しくは)
ブラウザ上で右クリックをして「検証」をクリックします。
(ショートカットキー[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」に中身を変更すれば任意のファイルをダウンロードすることができます。
(イミディエイトウィンドウにダウンロード結果を表示させるようになっています)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 |
Option Explicit #If Win64 Then 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 #Else 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 #End If '---------------------------------------------------------------------------------------------' Sub sample() Dim URL As String Dim SaveDir As String SaveDir = "C:\Users\user\Desktop\Download" URL = "https://www.google.com//images/branding/googlelogo/2x/googlelogo_color_272x92dp.png" Call DownloadImage(URL, SaveDir) End Sub '---------------------------------------------------------------------------------------------' Function DownloadImage(ByRef URL As String, ByRef SaveDir As String) Dim FileName Dim SavePath As String Dim res As Integer FileName = Right(URL, InStr(StrReverse(URL), "/") - 1) SavePath = SaveDir & "\" & FileName '"' res = URLDownloadToFile(0, URL, SavePath, 0, 0) If res = 0 Then Debug.Print "保存完了 : " & FileName Else Debug.Print "保存エラー: " & FileName End If End Function |
まとめ
今回はWindows APIの「URLDownloadToFile関数」を使い、画像ファイルをダウンロードする方法についての内容でした。
VBAではインターネットエクスプローラー(IE)を操作したり、HTML情報を取得することもできます。
今回のURLDownloadToFile関数とこれら機能を合わせることで、画像検索結果の上位100枚を全て自動でダウンロードしたりすることもできます。
サンプルコードのようにURLDownloadToFile関数のみで使う事はあまりありませんが、Webスクレイピングの機能として利用することは多くあるのでこの関数は覚えておいて損はないと思います。