
はじめに
以前に作成したカレンダーの祝日は、内閣府のホームページからダウンロードして利用するようになっております。
ボタンを押して取り込めれば非常に簡単になるので作ってみました。
ダウンロード
※ZIP圧縮形式なのでどこかに解凍してご利用ください。
ちょこっと解説
メインシート
ダウンロードするファイルのURIと貼り付け先のシート名&針付け位置の開始アドレスを指定できます。
処理開始ボタンを押すと「Sheet2」の「A1」からデータを貼り付けます。
Sheet2の初期状態
処理完了後のSheet2
VBA
ファイルのダウンロードは、WindowsAPIを利用します。Excel32bit版と64bit版の両方を定義してあります。
Private Sub cmdCsvSet_Click() は処理開始ボタンを押したときのイベントです。
Private Sub SetCSVtoSheet(fileName As String, sheetName As String, startAddr As String) はダウンロードしたCSVファイルをシートに貼り付ける処理を行っております。
#If Win64 Then
' 指定URLファイルのダウンロード
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
' 指定URLファイルのダウンロード
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
Private Sub cmdCsvSet_Click()
Dim fileURL As String
Dim fileName As String
Dim sheetName As String
Dim startAddr As String
Dim ret
On Error GoTo DownloadErr
' ファイルダウンロード
' ダウンロードファイル
fileURL = Sheet1.Cells(4, 2).Value
fileName = ThisWorkbook.Path & "\" & "work.csv"
' 貼り付け先シート&アドレス
sheetName = Sheet1.Cells(6, 2).Value
startAddr = Sheet1.Cells(7, 2).Value
' キャッシュクリア
Call DeleteUrlCacheEntry(fileURL)
' ダウンロード
ret = URLDownloadToFile(0, fileURL, fileName, 0, 0)
'// 1秒スリープ
Call Sleep(1000)
' ダウンロード結果
If ret = 0 Then
'MsgBox "ダウンロード完了"
Else
GoTo DownloadErr
End If
' CSV取り込み
Call SetCSVtoSheet(fileName, sheetName, startAddr)
MsgBox "完了しました。"
Exit Sub
DownloadErr:
MsgBox "ダウンロード:" & Err.Description
End Sub
Private Sub SetCSVtoSheet(fileName As String, sheetName As String, startAddr As String)
Dim f As Integer
Dim i As Integer
Dim str(2) As String
Dim sRow As Integer
Dim sCol As Integer
If Dir(fileName) = "" Then
MsgBox "ファイルが存在しません"
Exit Sub
End If
' ファイルオープン
f = FreeFile
Open fileName For Input As #f
On Error GoTo ErrHandler
' 出力開始アドレス
sRow = Range(startAddr).Row
sCol = Range(startAddr).Column
' データ出力
i = 0
Do While Not EOF(f)
Input #f, str(1), str(2)
With Sheets(sheetName)
.Cells(sRow + i, sCol).Value = str(1)
.Cells(sRow + i, sCol + 1).Value = str(2)
End With
i = i + 1
Loop
' ファイルクローズ
Close #f
Exit Sub
ErrHandler:
On Error Resume Next
' ファイルクローズ
Close #f
MsgBox Err.Description
End Sub
ポイント
貼り付け開始位置は、A1などと指定していますが、Cellsではそのまま利用できませんので、Range("A1").RowとRange("A1").Columnで数値に変換しています。
おわりに
カレンダーマクロの祝日シートにボタンを配置することで便利になると思います。その際には元のカレンダーをクリアすることや、ヘッダの設定にも気をつける必要があります。
