目次
URL で指定された CSV ファイルをダウンロードする
この記事では「URL で指定された CSV ファイルをダウンロードする」ために利用可能な DownloadCsvFromUrl というユーザー定義関数について紹介します。
この情報が読者のお役に立てば幸いです。
解決できること
Microsoft Access の中でここで紹介する DownloadCsvFromUrl をマクロの中で呼び出すと入力された URL で指定された CSV ファイルを利用者のダウンロードフォルダにそのままダウンロードします。
読んでほしい方
こうした Microsoft Access VBA を使ったアプリケーションをこれから作ろうと思っている方、今まで VBA によるアプリケーションを作ってきたが、そのツールを第三者に提供する際に、フォルダの保存パス名等の利用者個人に紐づいた環境差分をVBAのプログラムの中にじかに書くのに抵抗がある方。
DownloadCsvFromUrl 関数 の紹介
説明
入力された URL で指定される CSV ファイルを利用者のダウンロードフォルダにそのままダウンロードします。
参照オブジェクト
この関数を利用するためにはこの関数の実行前に
データベースツール > Visual Basic > ツール > 参照設定
の中で
- 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 の URLDownloadToFile、DeleteUrlCacheEntry、Sleep 関数を利用するための準備をします。 |
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 というユーザー定義関数について紹介しました。
この情報が読者のお役に立てば幸いです。