2
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

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

Last updated at Posted at 2022-11-12

はじめに

こんな感じで作ってみた
image.png

ソースコード

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

2
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?