ウェブからデータを取得する
2021-08-08 00:00:00
ウェブからデータを取得する方法を2種類、MSXML2.ServerXMLHTTP オブジェクトを使う方法と、Windows APIのURLDownloadToFileA関数を使う方法を紹介します。サンプルでは「統計で見る日本(https://www.e-stat.go.jp/)」のサービスを利用しました。使うには利用者登録(appIdの取得)が必要です。
下のコードを実行すると、URLで指定したデータが取得されイミディエイトウィンドウに出力されます。
Dim req As Object 'MSXML2.ServerXMLHTTP60 Dim url As String url = "http://api.e-stat.go.jp/rest/3.0/app/getSimpleStatsData?" & _ "appId=********" & _ "&lang=J" & _ "&statsDataId=0003425734" & _ "&metaGetFlg=Y" & _ "&cntGetFlg=N" & _ "&explanationGetFlg=Y" & _ "&annotationGetFlg=Y" & _ "§ionHeaderFlg=2" & _ "&replaceSpChars=0" Set req = CreateObject("MSXML2.ServerXMLHTTP") req.Open "GET", url, False req.send Debug.Print req.responseText Set req = Nothing
req.Openの3番目の引数をTrueにした場合は、非同期処理となり下のようにステータスを確認して処理を行います。タイムアウト処理などを行いたい場合はこちらを使うといいと思います。
req.Open "GET", url, True req.send If req.readyState <> 4 Then req.waitForResponse 10 End If If req.readyState = 4 Then Debug.Print req.responseText End If
URLDownloadToFileA関数 は下のように宣言します。指定したURLのデータをファイルに保存します。
Public Declare PtrSafe Function URLDownloadToFileA Lib "urlmon" (ByVal pCaller As Long, _ ByVal szURL As String, _ByVal szFileName As String, ByVal dwReserved As Long, _ ByVal lpfnCB As Long) As Long
下のサンプルコードでデータの取得ができます。
Dim url As String Dim filePath As String Dim ret As Long url = "http://api.e-stat.go.jp/..." filePath = "C:\workarea\test.csv" ret = URLDownloadToFileA(0, url, filePath, 0, 0) If ret <> 0 Then ConvUtf8WithBom filePath '※文字化け回避のため Workbooks.Open filePath End If
※サンプルではダウンロードデータがBOMなしのUTF-8で保存されるため、そのままだとExcelでは文字化けするので、下のサブプロシージャを作って対応しました。
Sub ConvUtf8WithBom(filePath As String) Dim st As Object ' ADODB.Stream Dim dat As String Set st = CreateObject("ADODB.Stream") st.Charset = "UTF-8" st.Open st.LoadFromFile filePath dat = st.ReadText st.Close st.Open st.WriteText dat, 0 st.SaveToFile filePath, 2 st.Close End Sub