【Access VBA】URL で指定された CSV ファイルをダウンロードする

【Access VBA】URL で指定された CSV ファイルをダウンロードする

URL で指定された CSV ファイルをダウンロードする

この記事では「URL で指定された CSV ファイルをダウンロードする」ために利用可能な DownloadCsvFromUrl というユーザー定義関数について紹介します。

この情報が読者のお役に立てば幸いです。

解決できること

Microsoft Access の中でここで紹介する DownloadCsvFromUrl をマクロの中で呼び出すと入力された URL で指定された CSV ファイルを利用者のダウンロードフォルダにそのままダウンロードします。

読んでほしい方

こうした Microsoft Access VBA を使ったアプリケーションをこれから作ろうと思っている方、今まで VBA によるアプリケーションを作ってきたが、そのツールを第三者に提供する際に、フォルダの保存パス名等の利用者個人に紐づいた環境差分をVBAのプログラムの中にじかに書くのに抵抗がある方。

DownloadCsvFromUrl 関数 の紹介

説明

入力された URL で指定される CSV ファイルを利用者のダウンロードフォルダにそのままダウンロードします。

参照オブジェクト

この関数を利用するためにはこの関数の実行前に

データベースツール > Visual Basic > ツール > 参照設定

 

【Access VBA】URL で指定された CSV ファイルをダウンロードする

の中で

  • Microsoft Office 16.0 Access Database engine
  • Microsoft Excel 16.0 Object Library

にチェックを入れる必要があります。

利用例

Access のマクロ定義例えば “autoexec” の中で



If DownloadCsvFromUrl("https://stopcovid19.metro.tokyo.lg.jp/data/130001_tokyo_covid19_patients.csv")>0
IF 文の最後

のように DownloadCsvFromUrl を “https://stopcovid19.metro.tokyo.lg.jp/data/130001_tokyo_covid19_patients.csv” のようなパラメータを付けて呼び出します。

 この “autoexec” のデザインビューを閉じ、この ”autoexec” マクロをダブルクリックすると、 このマクロの中の  DownloadCsvFromUrl が実行され、指定された “https://stopcovid19.metro.tokyo.lg.jp/data/130001_tokyo_covid19_patients.csv”を利用者のダウンロードフォルダに”130001_tokyo_covid19_patients.csv”といいファイル名でダウンロードします。

引数

引数 属性 意味
CSVファイルのURL名 文字型 インターネット上のCSVファイルをURLで指定します。

戻り値

意味
0 正常終了
1 異常終了

VBAコード


#If Win64 Then

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

Private Declare PtrSafe Function DeleteUrlCacheEntry _
    Lib "wininet" Alias "DeleteUrlCacheEntryA" _
    (ByVal lpszUrlName As String) As Long
    
Private Declare PtrSafe Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)

#Else

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 Long

Private Declare Function DeleteUrlCacheEntry _
    Lib "wininet" Alias "DeleteUrlCacheEntryA" _
    (ByVal lpszUrlName As String) As Long
    
Private Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)

#End If


Function DownloadCsvFromUrl(target_url_of_file As String) As Integer

    Const C_SUCCESS As Integer = 0
    Const C_FAILURE As Integer = 1
    Const C_WAIT_TIME As Integer = 5000 ' 5 seconds
    
    Dim result As Long
    Dim fileName As String
    Dim fullPathName As String
    Dim returnCode As Integer

    fileName = target_url_of_file
    While InStr(fileName, "/") > 0
    fileName = Mid(fileName, InStr(fileName, "/") + 1)
    Wend

    fullPathName = Environ("UserProfile") & "\Downloads\" & fileName
   
    Call DeleteUrlCacheEntry(target_url_of_file)

    On Error GoTo exitWithFailure

    SysCmd acSysCmdSetStatus, fileName & " をダウンロード中..."

    returnCode = URLDownloadToFile(0, target_url_of_file, fullPathName, 0, 0)

    If returnCode <> 0 Then
        GoTo exitWithFailure
    End If
    
    SysCmd acSysCmdSetStatus, fullPathName & " に保存しました..."
    Call Sleep(C_WAIT_TIME)

    DownloadFileFromUrl = C_SUCCESS
    Exit Function

exitWithFailure:

    SysCmd acSysCmdSetStatus, target_url_of_file & " のダウンロードに失敗しました..."
    Call Sleep(C_WAIT_TIME)

    DownloadFileFromUrl = C_FAILURE

End Function

VBAコードの簡単な説明

行番号 説明
1-33 Windows API の URLDownloadToFileDeleteUrlCacheEntrySleep 関数を利用するための準備をします。
36 関数名と関数の戻り値の型(Integer:整数型)、入力パラメータ target_url_of_file  の名前、型(String:文字列型)を定義しています。
38-40 このプログラムの中で利用する定数C_SUCCESS(0:成功)、C_FAILURE(1:失敗)を定義しています。ここでは71行目、79行目ででこの関数の戻り値が C_SUCCESS(0:成功)、C_FAILURE(1:失敗)であることが明確にわかるようなコーディングの仕方になります。また処理の中で待ち時間(5秒)を利用するための定数 C_WAIT_TIME も合わせて定義します。
42-45 result 、 fileName、fullPathName、 returnCode を定義します。
48-52 target_url_of_file からダウンロードするファイル名 fileName を求め environ関数を使用して利用者の %USERPROFILE%を求め、これらをあわせてそのフルパス名 fullPathName を求めます。
54 DeleteUrlCacheEntry を使ってこれからダウンロードするURL用のキャッシュをクリアします。
56 この関数の実行中にエラーが発生したときの例外処理として、exitWithFailure にジャンプします。
58 ステータスバーに fileName  がダウンロード中であることを表示します。
60-64

URLDownloadToFile を使って target_url_of_file  で指定したURLからファイルをダウンロードし、fullPathName に保存します。そして処理が失敗した場合はexitWithFailure にジャンプします。

66-67 ステータスバーに fullPathName へのダウンロードが終了したことを表示し、Windows API による sleep 関数を起動して5秒間待ち、その後Excelを終了します。
69-70 この関数の戻り値に C_SUCCESS(0:成功) を設定して関数を終わります。
72-79 ステータスバーに ダウンロードが失敗したことを表示し、Windows API による sleep 関数を起動して5秒間待ち、その後この関数の戻り値に C_FAILURE (1:失敗) を設定して関数を終わります。

まとめ

この記事では「URL で指定された CSV ファイルをダウンロードする」ために利用可能な DownloadCsvFromUrl というユーザー定義関数について紹介しました。

この情報が読者のお役に立てば幸いです。


ライブラリ一覧