皆様こんにちは、ノグチです。
インターネット上の画像やファイルをダウンロードする必要がある場合、皆様どのようにされていますか?
ファイルやイメージファイルの上で右クリック→名前を付けてファイルを保存?
ダウンロード対象のファイルが一つなら問題ないのですが、複数あると面倒臭いですよね。
「ワンクリックでなんとかならないものか…」
今回はそんな願いを叶える、インターネット上の指定ファイルをVBAとWindows APIを使って任意のフォルダに、任意のファイル名で保存する方法をご紹介します!
URLDownloadToFile関数とは
VBAでファイルダウンロードを実行するには、Windows APIのURLDownloadToFile関数を使います。
これは、指定URLのファイルを、指定パスにダウンロードしてくれるという関数です。
つまり、この関数を使ったマクロをエクセルのコマンドボタンなどにセットしておけば、ワンクリックで指定ファイルがダウンロードできてしまうという寸法です。
URLDownloadToFileの記述方法
ではURLDownloadToFile関数の使い方を見ていきましょう。
Windows APIを使用するには、まずVBAコードの宣言セクションで、「このWindows APIを使います」という宣言が必要であることは前回の記事でご紹介しました。
なのでまずは宣言セクションでURLDownloadToFileの宣言をしましょう。
URLDownloadToFile関数はurlmonというDLLに含まれていますので、API名にはURLDownloadToFileを、DLL名にはurlmonを指定します。
そしてこの関数はLong型の返り値を返してくれますので、Long型で宣言しておきましょう。
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
変数もいくつか宣言していますね。
これら変数の名前は任意のものに変えることもできます。
特に値を指定したりするのはszURLとszFileNameの2つで、それぞれの役割と型がこちら。
- szURL ダウンロードしたいファイルのURLを関数に渡すもの。String型。
- szFileName ダウンロードしたファイルを保存するパスをAPIに渡すもの。String型。
szURLとszFileName以外3つの変数は”0″を渡すだけなので、このままでも問題ありません。
そしてコード部分でURLDownloadToFile関数を呼び出す際の記述がこちら。
変数に返された値が0ならファイルダウンロード完了、それ以外ならダウンロードできていないということになります。
URLDownloadToFileでファイル取得するコードの例
では、さっそくこのWindows APIでファイルをダウンロードしてみましょう。
サンプルとして、Googleのトップページのアイコンの画像ファイルをダウンロードするコードを用意しました。
Option Explicit 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 Sub Download_File() Dim lngRes As Long Dim strURL As String Dim strPath As String strPath = "C:\Users\users\Desktop\File\画像.png" strURL = "https://www.google.co.jp/images/branding/googlelogo/1x/googlelogo_color_272x92dp.png"; lngRes = URLDownloadToFile(0, strURL, strPath, 0, 0) If lngRes = 0 Then MsgBox "ダウンロード完了!" Else MsgBox "ファイルをダウンロードできませんでした" End If End Sub
このコードを実行してみると、引数の”strPath”に指定したパスに、strURLで指定したURLのファイルがダウンロードされます。
こんな感じ。
ちなみに、この関数が返してくれる値によってダウンロードできたのかできていないのかが分かりますので、返り値によってメッセージを変えるなどの分岐文を必ず盛り込むようにしましょう。
まとめ
今回は、Windows APIのURLDownloadToFile関数を使った、ファイルのダウンロード方法をご紹介しました。
これを使えば、複数のファイルダウンロードも簡単ですし、ダウンロードしたファイルをどこに保存したかわからなくなる、なんていうことも無くなりますね。
エクセルを開くことすら面倒だ!という方にはこちらの記事にあるVBScripitを使ってマクロを呼び出せば、エクセルを開かずともデスクトップのVBSファイルをダブルクリックするだけで、目的のファイルをダウンロードできますよ!
それでは、最後までお読みいただきありがとうございました!
コメント
お忙しいところコメント失礼いたします。
またいつも詳しく解説してくださり、ありがとうごいます。とても参考になります。
質問なのですが、上記のプログラミングコードを貼り付けて(保存先のパスは自分用に変更済み)実行させていただきましたが、エラーになってしまいます。
MsgBoxでlngResの返り値を見てみましたが”-2146697208”と表示されました。成功しているなら0と表示されるのですが。。API宣言も上記のとおりにしているのですが、エラーは一向に消えません。
waimarさん、こんにちは。
記事をご覧いただき、ありがとうございます。
また、参考になると仰っていただけて、うれしい限りです!
さて、頂いたご質問の情報から思いつく原因として、
・VBAコードの指定パスが間違っている
・ファイルを保存しようとしているフォルダが存在していない
のどちらかかかな、と思います。
上記原因であれば、エラー回避のためにURLDownloadToFileの前に、指定したフォルダが存在するかをチェックするコードを入れておくと安心ですね。
どうぞよろしくお願い致します!
ノグチさま
お忙しい中、コメントありがとうございます。私もご指摘の通り、その原因を疑いましたが、そうではないようです。というのも2台パソコンを持っているのですが、一方では成功して、一方では成功しないということになるからです。パスはどちらも有効に働いているのですが、片方のパソコンでは働きません。そこで、使っているOSとオフィスのバージョンに原因があるのかと勝手に思っています。
成功する方のパソコン:windows7 32bit / office 32bit
成功しない方のパソコン:windows7 64bit / office 32bit
成功しない方は、実行した後、特に何のエラー通知も表示されないのにもかかわらず、実行が終了しフォルダーを開けてみたら画像データが見つかりません。
他のサイトなどでも調べて解決策を探していますが、今の所、何が起きているのかさっぱりわからないでいます。。