VBAでファイルダウンロード

# はじめに
こんな感じで作ってみた
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/88262/f4eede48-4d9b-3e7e-f449-8ec869dccb28.png)

# ソースコード
```vb:fileDownload.vb
' Windows API定義
#If Win64 Then
    ' Office 64bitアプリケーション用
    Private Declare PtrSafe Function URLDownloadToFile Lib "urlmon" Alias "URLDownloadToFileW" ( _
        ByVal pCaller As Long, _
        ByVal szURL As Long, _
        ByVal szFileName As Long, _
        ByVal dwReserved As Long, _
        ByVal lpfnCB As Long) As Long
     
    Private Declare PtrSafe Function DeleteUrlCacheEntry Lib "wininet" Alias "DeleteUrlCacheEntryW" ( _
        ByVal lpszUrlName As Long) As Long
     
    Private Declare PtrSafe Sub Sleep Lib "kernel32" ( _
        ByVal dwMilliseconds As Long)
 
#Else
    ' Office 32bitアプリケーション用
    Private Declare Function URLDownloadToFile Lib "urlmon" Alias "URLDownloadToFileW" ( _
        ByVal pCaller As Long, _
        ByVal szURL As Long, _
        ByVal szFileName As Long, _
        ByVal dwReserved As Long, _
        ByVal lpfnCB As Long) As Long
     
    Private Declare Function DeleteUrlCacheEntry Lib "wininet" Alias "DeleteUrlCacheEntryW" ( _
        ByVal lpszUrlName As Long) As Long
     
    Private Declare Sub Sleep Lib "kernel32" ( _
        ByVal dwMilliseconds As Long)
    
#End If



Sub ファイルダウンロード_Click()

    Dim result As Long          '実行結果
    Dim strSaveDir As String    'ダウンロードディレクトリ
    Dim strSaveFile As String   'ダウンロードファイル
    Dim ws As Worksheet
    
    strSaveDir = ThisWorkbook.Path & "\downloadFiles" & Application.PathSeparator
    
    ' フォルダがなければ作成する
    If Dir(strSaveDir, vbDirectory) = "" Then
        MkDir strSaveDir
    Else
        FilesExist = Dir(strSaveDir & "*")
        If FilesExist = "" Then
            ' MsgBox "フォルダにファイルがありません。"
        Else
            Kill strSaveDir & "*"
        End If
    End If
    
    'シート名
    Set ws = Sheets("Sheet1")
    
    '最終行
    LastRow = ws.Range("C" & Rows.Count).End(xlUp).Row

    For I = 3 To LastRow    '3行目からダウンロード
        ws.Range("B1").Value = (I - 2) & "/" & (LastRow - 2) & "ダウンロード中..." 'ダウンロード状況
        result = 0
               
        strSaveFile = strSaveDir & ws.Range("D" & I).Value

        Do
            ' 5秒待機してからファイルをダウンロード(失敗時リトライするため＆連続ダウンロードは失敗した実績有)
            Call Sleep(5000)
            
            ' キャッシュクリア
            DeleteUrlCacheEntry (StrPtr(ws.Range("C" & I).Value))
            
            ' ファイルダウンロード
            result = URLDownloadToFile(0, StrPtr(ws.Range("C" & I).Value), StrPtr(strSaveFile), 0, 0)
        Loop While result <> 0

        ' 実行結果記載
        If FileLen(strSaveFile) > 0 Then
            ws.Range("E" & I).Value = "成功"
        Else
            ws.Range("E" & I).Value = "失敗(ファイルサイズが0)"
        End If
        
    Next I
    ws.Range("B1").Value = ""

    MsgBox "ダウンロードが完了しました！！" & vbCrLf & "下記フォルダをzip圧縮して配布願います。" & vbCrLf & strSaveDir

End Sub
```

# セル設定
## D列(URL→ダウンロードファイル名抽出)
=RIGHT(SUBSTITUTE(C4,"/"," ",LEN(C4)-LEN(SUBSTITUTE(C4,"/",""))),LEN(SUBSTITUTE(C4,"/"," ",LEN(C4)-LEN(SUBSTITUTE(C4,"/",""))))-FIND(" ",SUBSTITUTE(C4,"/"," ",LEN(C4)-LEN(SUBSTITUTE(C4,"/","")))))

## B列(パッケージ名抽出→"-"分割で先頭を抽出)
="Selenium依存関係パッケージ(" & LEFT(D5,FIND("-",D5)-1) & ")"

## F列(ライセンス情報)
※pip-licenseのパッケージをインストールして、【pip-licenses】コマンド実行
　もしくは、pip show [パッケージ名]

# ダウンロード情報
| No | ダウンロードファイル | ダウンロードURL　　　　　　　　　　　　　　　　　 | ダウンロードファイル |
|:-:|:--|:--|:--|
| 1 | Microsoft Visual Studio Team Foundation Server 2015 Power Tools | https://marketplace.visualstudio.com/_apis/public/gallery/publishers/TFSPowerToolsTeam/vsextensions/MicrosoftVisualStudioTeamFoundationServer2015Power/14.0.23206.0/vspackage | tfpt.msi | 
| 2 | git-filter-repo | https://raw.githubusercontent.com/newren/git-filter-repo/main/git-filter-repo | git-filter-repo | 
| 3 | PyInstaller依存関係パッケージ(altgraph) | https://files.pythonhosted.org/packages/cc/ff/88d277ba936d226b0f6dbd6711145f90fcfeed3aa9455c1c2f62c8ffec5b/altgraph-0.17.3-py2.py3-none-any.whl | altgraph-0.17.3-py2.py3-none-any.whl | 
| 4 | PyInstaller依存関係パッケージ(pefile) | https://files.pythonhosted.org/packages/55/26/d0ad8b448476d0a1e8d3ea5622dc77b916db84c6aa3cb1e1c0965af948fc/pefile-2023.2.7-py3-none-any.whl | pefile-2023.2.7-py3-none-any.whl | 
| 5 | PyInstaller依存関係パッケージ(pyinstaller_hooks_contrib) | https://files.pythonhosted.org/packages/17/4a/e188d305fbea3c9095ba4f5eb684cefc174973ca67ccf980eebe0f9d82c6/pyinstaller_hooks_contrib-2023.2-py2.py3-none-any.whl | pyinstaller_hooks_contrib-2023.2-py2.py3-none-any.whl | 
| 6 | PyInstaller依存関係パッケージ(pyinstaller) | https://files.pythonhosted.org/packages/9e/90/9f48abfcc936c3bb869e4164c12fb365a64a7272a230d4f8950109edf76e/pyinstaller-5.10.1-py3-none-win_amd64.whl | pyinstaller-5.10.1-py3-none-win_amd64.whl | 
| 7 | PyInstaller依存関係パッケージ(pywin32_ctypes) | https://files.pythonhosted.org/packages/9e/4b/3ab2720f1fa4b4bc924ef1932b842edf10007e4547ea8157b0b9fc78599a/pywin32_ctypes-0.2.0-py2.py3-none-any.whl | pywin32_ctypes-0.2.0-py2.py3-none-any.whl | 
| 8 | PyInstaller依存関係パッケージ(setuptools) | https://files.pythonhosted.org/packages/2f/8c/f336a966d4097c7cef6fc699b2ecb83b5fb63fd698198c1b5c7905a74f0f/setuptools-67.7.2-py3-none-any.whl | setuptools-67.7.2-py3-none-any.whl | 
| 9 | nugetパッケージ(EntityFramework) | https://www.nuget.org/api/v2/package/Npgsql/7.0.4 | npgsql.7.0.4.nupkg | 
| 10 | nugetパッケージ(EntityFramework6.Npgsql) | https://www.nuget.org/api/v2/package/EntityFramework6.Npgsql/6.4.3 | entityframework6.npgsql.6.4.3.nupkg | 
| 11 | nugetパッケージ(EntityFramework) | https://www.nuget.org/api/v2/package/EntityFramework/6.4.4 | entityframework.6.4.4.nupkg | 










# 参考サイト
◆ExcelVBAでファイルをダウンロードする方法
　https://errormaker.blog.fc2.com/blog-entry-66.html
◆VBAからUnicode版のWindows API を使う
　https://codezine.jp/article/detail/1718
◆VBAで指定URLからファイルをダウンロード
　http://www.it-view.net/vba%E3%81%A7%E6%8C%87%E5%AE%9Aurl%E3%81%8B%E3%82%89%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%82%92%E3%83%80%E3%82%A6%E3%83%B3%E3%83%AD%E3%83%BC%E3%83%89-364.html
◆VBAでインターネット上のファイルをダウンロードする方法をまとめてみました。
　https://www.ka-net.org/blog/?p=4855
◆（Excel）URLからファイル名を取得する
　https://www.officeisyours.com/entry/2020/11/09/011542
◆URLからファイル名を取得（一番右の指定文字以降を抽出）解答
　https://excel-ubara.com/excel-answer/EXCEL706A.html
◆【VBA】ファイル/フォルダをZIP形式で圧縮する
　https://excel-vba.work/2021/12/10/%E3%80%90vba%E3%80%91%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB-%E3%83%95%E3%82%A9%E3%83%AB%E3%83%80%E3%82%92zip%E5%BD%A2%E5%BC%8F%E3%81%A7%E5%9C%A7%E7%B8%AE%E3%81%99%E3%82%8B/
◆VBAでZIP圧縮と解凍を行う
　https://vbabeginner.net/zip-comp-decomp/
◆保存先フォルダが存在しない場合はフォルダを作成してブックを保存する
　https://www.moug.net/tech/exvba/0060035.html
◆VBA共通:Access、ExcelのVBAでWindowsの環境変数を取得するサンプルプログラム
　https://selifelog.com/blog-entry-52.html