VBA

CSVファイルをダウンロードしてシートにセットする

投稿日:

はじめに

以前に作成したカレンダーの祝日は、内閣府のホームページからダウンロードして利用するようになっております。

ボタンを押して取り込めれば非常に簡単になるので作ってみました。

 

ダウンロード

※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で数値に変換しています。

 

 

おわりに

カレンダーマクロの祝日シートにボタンを配置することで便利になると思います。その際には元のカレンダーをクリアすることや、ヘッダの設定にも気をつける必要があります。

 

スポンサードリンク

スポンサードリンク

-VBA
-, ,

Copyright© あきらちんの技術メモ , 2024 All Rights Reserved Powered by STINGER.