【エクセルVBA】 URLDownloadToFile関数を使って指定ファイルをワンクリックでダウンロードする方法


windowsapi,excel,vba,download,URLDownloadToFile,eyecatch皆様こんにちは、ノグチです。

インターネット上の画像やファイルをダウンロードする必要がある場合、皆様どのようにされていますか?

ファイルやイメージファイルの上で右クリック→名前を付けてファイルを保存?

ダウンロード対象のファイルが一つなら問題ないのですが、複数あると面倒臭いですよね。

「ワンクリックでなんとかならないものか…」

今回はそんな願いを叶える、インターネット上の指定ファイルをVBAとWindows APIを使って任意のフォルダに、任意のファイル名で保存する方法をご紹介します!

スポンサーリンク

URLDownloadToFile関数とは

VBAでファイルダウンロードを実行するには、Windows APIのURLDownloadToFile関数を使います。

これは、指定URLのファイルを、指定パスにダウンロードしてくれるという関数です。

つまり、この関数を使ったマクロをエクセルのコマンドボタンなどにセットしておけば、ワンクリックで指定ファイルがダウンロードできてしまうという寸法です。

URLDownloadToFileの記述方法

ではURLDownloadToFile関数の使い方を見ていきましょう。

Windows APIを使用するには、まずVBAコードの宣言セクションで、「このWindows APIを使います」という宣言が必要であることは前回の記事でご紹介しました。

【エクセルVBA】Windows APIで外部プログラムを呼び出すための第一歩
エクセルVBAからWindows APIを使って外部プログラムを呼び出すために、Declareステートメントをはじめとした基本をご紹介しています。エクセル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

変数もいくつか宣言していますね。

これら変数の名前は任意のものに変えることもできます。

特に値を指定したりするのはszURLszFileNameの2つで、それぞれの役割と型がこちら。

  • szURL ダウンロードしたいファイルのURLを関数に渡すもの。String型。
  • szFileName  ダウンロードしたファイルを保存するパスをAPIに渡すもの。String型。

szURLとszFileName以外3つの変数は”0″を渡すだけなので、このままでも問題ありません。

そしてコード部分でURLDownloadToFile関数を呼び出す際の記述がこちら。

変数 = URLDownloadToFile(0, ファイルのURL, ファイルを保存するパス, 0, 0)

変数に返された値が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のファイルがダウンロードされます。

こんな感じ。

windowsapi,excel,vba,download,URLDownloadToFile

ちなみに、この関数が返してくれる値によってダウンロードできたのかできていないのかが分かりますので、返り値によってメッセージを変えるなどの分岐文を必ず盛り込むようにしましょう。

まとめ

今回は、Windows APIのURLDownloadToFile関数を使った、ファイルのダウンロード方法をご紹介しました。

これを使えば、複数のファイルダウンロードも簡単ですし、ダウンロードしたファイルをどこに保存したかわからなくなる、なんていうことも無くなりますね。

エクセルを開くことすら面倒だ!という方にはこちらの記事にあるVBScripitを使ってマクロを呼び出せば、エクセルを開かずともデスクトップのVBSファイルをダブルクリックするだけで、目的のファイルをダウンロードできますよ!

初心者でも簡単プログラムでWindowsの効率化!VBScriptをやってみよう
特別なアプリケーションのインストール不要。初心者向けのプログラミング言語VBScriptの紹介です。VBScriptの概要から、実際にプログラムをしてメッセージボックスを表示させるところまでの説明です。VBScriptを使うWindowsの業務効率化に役立ちます。

それでは、最後までお読みいただきありがとうございました!

連載目次:エクセルVBAでWindows APIを使いこなす方法

エクセルVBAでは、Windows APIを使用して外部プログラムを呼び出して利用することができます。その簡単な方法と、おすすめの関数についてシリーズでお伝えします。
  1. 【エクセルVBA】Windows APIで外部プログラムを呼び出すための第一歩
  2. 【エクセルVBA】 URLDownloadToFile関数を使って指定ファイルをワンクリックでダウンロードする方法

コメント

  1. waimar より:

    お忙しいところコメント失礼いたします。
    またいつも詳しく解説してくださり、ありがとうごいます。とても参考になります。

    質問なのですが、上記のプログラミングコードを貼り付けて(保存先のパスは自分用に変更済み)実行させていただきましたが、エラーになってしまいます。
    MsgBoxでlngResの返り値を見てみましたが”-2146697208”と表示されました。成功しているなら0と表示されるのですが。。API宣言も上記のとおりにしているのですが、エラーは一向に消えません。

    • ノグチ より:

      waimarさん、こんにちは。
      記事をご覧いただき、ありがとうございます。
      また、参考になると仰っていただけて、うれしい限りです!

      さて、頂いたご質問の情報から思いつく原因として、
      ・VBAコードの指定パスが間違っている
      ・ファイルを保存しようとしているフォルダが存在していない
      のどちらかかかな、と思います。

      上記原因であれば、エラー回避のためにURLDownloadToFileの前に、指定したフォルダが存在するかをチェックするコードを入れておくと安心ですね。

      どうぞよろしくお願い致します!

  2. waimar より:

    ノグチさま
    お忙しい中、コメントありがとうございます。私もご指摘の通り、その原因を疑いましたが、そうではないようです。というのも2台パソコンを持っているのですが、一方では成功して、一方では成功しないということになるからです。パスはどちらも有効に働いているのですが、片方のパソコンでは働きません。そこで、使っているOSとオフィスのバージョンに原因があるのかと勝手に思っています。

    成功する方のパソコン:windows7 32bit / office 32bit
    成功しない方のパソコン:windows7 64bit / office 32bit

    成功しない方は、実行した後、特に何のエラー通知も表示されないのにもかかわらず、実行が終了しフォルダーを開けてみたら画像データが見つかりません。

    他のサイトなどでも調べて解決策を探していますが、今の所、何が起きているのかさっぱりわからないでいます。。

タイトルとURLをコピーしました