ExcelVBAで日本銀行WEBサイトから統計データをクローリングする

ExcelVBAで全ファイル削除ExcelVBA

はじめに

世の中、クローリングやスクレイピング処理が増えてきたとはいえ、官公庁の公表データ等はまだまだExcelファイルが多いと思います。

Pythonでもライブラリーを使えばExcelファイルの処理もお手の物らしいですが、どうしても相性の事を考えるとVBAで処理させた方が無難かな?と思ってしまう今日この頃です。

【実務サンプル】日本銀行サイトから統計データをクローリングする

今回は日本銀行のWEBサイトから公表されているデータ(Excelファイル)を取得してみます。

日銀のホームページでは様々な統計資料が公表されており、ExcelファイルやPDFファイル等でアップされています。このような貴重なデータをVBAで取得するサンプルプログラムを作ってみました。

日銀に限らず、財務省のWEBサイトからでもURLを変更すればクローリングできますので、ご参考になれば幸いです。

わかりやすいように標準モジュール内にWindows API定義やソースコードを記載しましたが、実際実務でプログラムを作る際は別々のモジュールにしておいた方が運用上よろしいかと思います。

以下、サンプルプログラムです。

Option Explicit

'*************************************************************
'インターネットサービスのオープン
'*************************************************************
''Office 32 bit用
'Public Declare Function InternetOpen Lib "wininet.dll" Alias "InternetOpenA" _
'(ByVal lpszAgent As String, ByVal dwAccessType As Long, ByVal lpszProxyName As String, _
'ByVal lpszProxyBypass As String, ByVal dwFlags As Long) As Long

'Office 64 bit用
Public Declare PtrSafe Function InternetOpen Lib "wininet.dll" Alias "InternetOpenA" _
(ByVal lpszAgent As String, ByVal dwAccessType As Long, ByVal lpszProxyName As String, _
ByVal lpszProxyBypass As String, ByVal dwFlags As Long) As Long

'*************************************************************
'インターネットサービスのクローズ
'*************************************************************
'Office 32 bit用
'Public Declare Function InternetCloseHandle Lib "wininet.dll" _
'(ByVal HINTERNET As Long) As Integer

'Office 64 bit用
Public Declare PtrSafe Function InternetCloseHandle Lib "wininet.dll" _
(ByVal HINTERNET As Long) As Integer

'*************************************************************
'ダウンロード用定義
'*************************************************************
'Office 32 bit用
'Public 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

'Office 64 bit用
Public 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

'*************************************************************
'sleep関数用API宣言
'*************************************************************
'Office 32 bit用
'Public Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)

'Office 64 bit用
Public Declare PtrSafe Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)

Sub Download()
    '***********************************************************
    ' ファイル・ダウンロード処理
    '***********************************************************
    '問い合せダイアログの表示をOFFにします
    Application.DisplayAlerts = False
        
    On Error Resume Next
    MsgBox "ファイルをダウンロードします。"
        
    'ダウンロードURLを指定
    Dim download_url As String
    download_url = "http://www.boj.or.jp/statistics/boj/fm/juqf/juqf01.xlsx"
        
    '保存先の指定
    Dim save_path As String
    save_path = ThisWorkbook.Path & "\" & "juqf01.xlsx"
        
    Dim result As Long
    Dim cnt As Integer
    Dim dl_failed_flag As Integer
        
    'ループ回数
    Dim LOOP_MAX_COUNT As Integer
    LOOP_MAX_COUNT = 5
        
    'スリープ時間(ミリ秒)
    Dim SLEEP_TIME As Integer
    SLEEP_TIME = 1000
        
    cnt = 1
    dl_failed_flag = 0
    Do
        'ファイルをダウンロード
        result = URLDownloadToFile(0, download_url, save_path, 0, 0)
    
        If (result = 0) Then
            MsgBox "ダウンロード成功!"
        End If
    
        '判定
        If (cnt >= LOOP_MAX_COUNT) Then
            MsgBox "ファイルの取得に失敗しました(ループ回数オーバー)。処理を終了します。"
            dl_failed_flag = 1
            Exit Do
        End If
        
        'カウントアップ
        cnt = cnt + 1
          
        '再取得時にsleepを入れます。
        Sleep SLEEP_TIME
    Loop Until result = 0
        
    'DLが失敗したのでマクロを終了させます。
    If dl_failed_flag = 1 Then
        End
    End If
        
    MsgBox "当マクロの処理を終了します。"
End Sub

マクロと同じ階層にクローリングしたファイルが保存されていれば成功です!

URLを変更したり、ループ回数やスリープ時間も調整してみるといいと思います。

コメント

  1. It?s difficult to find experienced people in this particular subject, but you sound like you know what you?re talking about!

    Thanks

タイトルとURLをコピーしました