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