VBAを用いてインターネットのデータをダウンロードする方法にはいくつかありますが、一番簡単な方法を紹介したいと思います。

Windows APIのURLDownloadToFile関数を使います。

まず、 URLDownloadToFile関数の宣言。

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 LongURLDownloadToFile

注意:64ビットExcelの場合、下記エラーが出ます。

コンパイルエラー:

このプロジェクトのコードは、64ビットシステムで使用するために更新する必要があります。Declareステートメントの確認および更新を行い、次にDeclareステートメントにPtrSafe属性を設定してください。

エラー内容通り、Declareの後ろにPreSafeと追加します。

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

URLDownloadToFile関数を呼び出せばファイルをインターネットからダウンロード出来ます。

Sub DownloadFileFromURL()
    Ret = URLDownloadToFile(0, "www.it-view.net/wp-content/uploads/2019/12/sample.jpg", "c:¥別名.jpg", 0, 0)
End Sub

複数ファイルをダウンロードしたい場合

Excelシートに下記のような内容を作ります。

B列URLファイルをA列で定義した名前で保存する。C列にダウンロード結果を出力する。

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

Dim Ret As Long

'保存フォルダー
Const FolderName As String = "c:\test\"

Sub DownloadFileFromURL2()
    Dim ws As Worksheet
    Dim LastRow As Long, i As Long
    Dim strPath As String

    'シート名
    Set ws = Sheets("Sheet1")
    
    '最終行
    LastRow = ws.Range("A" & Rows.Count).End(xlUp).Row

    For i = 2 To LastRow '2行目から
        strPath = FolderName & ws.Range("A" & i).Value

        Ret = URLDownloadToFile(0, ws.Range("B" & i).Value, strPath, 0, 0)

        If Ret = 0 Then
            ws.Range("C" & i).Value = "成功"
        Else
            ws.Range("C" & i).Value = "失敗"
        End If
    Next i
End Sub

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です