こんにちは、blueです。
前回は取得したJSON形式のデータの読み方について説明しました。
前回の記事はこちら
なお前回までに取得したJSONデータはweb上で取得したものでした。
そこで今回からはこのデータをVBAで取得することとします。
VBAでHTTPリクエストと聞くと難しく感じるかもしれません。
ただ実際のコード自体は短く、専用のオブジェクトとメソッドを理解すれば簡単にできます。
VBAの使用範囲が広がりますのでぜひ勉強していってください。
なお今回の記事は以下の書籍を参考にしています。
pythonですが会話形式で非常にわかりやすく書かれている書籍です。webAPIやスクレイピングを一から理解できる内容になっています。
HTTPリクエストの方法
まず最初に参考にしたサイトの紹介です。
エクセルVBAでHTTPリクエストをする最も簡単なプログラム
HTTPリクエストでチャットワークAPIを利用する記事ですが、GETやPOSTについても書かれています。
この記事を見ればVBAでHTTPリクエストができるようになると思いますので是非見てみてください。
さて、VBAでHTTPリクエストを行う方法は以下になります。
- HTTPリクエストできる環境を整える
- HTTPリクエストを行う
- HTTPレスポンスから文字列を取り出す
です。まずは実コードを紹介したうえで以降で詳しく説明します。
実コード
以下はCurrentWeatherMapから現在の天気予報を取得してイミディエイトウィンドウに出力するコードになります。
なお今回はCurrentWeatherDataプロシージャを呼び出して処理するようにしています(Private Sub CurrentWeatherData())。
APIキーは前々回で取得したキーを入れるようにしてください。
Public Sub 現在天気取得()
Call CurrentWeatherData
End Sub
Private Sub CurrentWeatherData()
Const key As String = "APIキー" 'APIキーを入れてください
Const lat As String = "35.6812405"
Const lon As String = "139.7649361"
Dim http As MSXML2.XMLHTTP60
Set http = New MSXML2.XMLHTTP60
With http
Call .Open("GET", "https://api.openweathermap.org/data/2.5/weather?lat=” & lat & "&lon=" & lon & "&units=metric&lang=ja&appid=" & key)
Call .send
Do
If .readyState = 4 Then
Exit Do
End If
DoEvents
Loop
'JSONを一行で出力
Debug.Print .responseText
End Sub
今回のコードにはMSXML2.XMLHTTP60という見慣れないオブジェクトがあります。
これは「HTTPリクエストをする為のオブジェクト」で、HTTPリクエストをする際にはなくてはならないものです。
ただこのままでは使用することができませんのでまずは環境設定について説明します。
HTTPリクエストできる環境を整える
Microsoft XML, v6.0の参照設定
Microsoft XMLとはMicrosoftでXMLベースのアプリケーションを構築するためのライブラリです。
簡単に言うとMicrosoftでXMLファイルを操作するためのソフトです。
以下参照
MSXMLとは|「分かりそう」で「分からない」でも「分かった」気になれるIT用語辞典
なお、VBAで扱う場合の参照設定の方法は以下です。
- メニューバーの「ツール」-「参照設定」から「Microsoft XML, v6.0」にチェックを入れる
これだけです。
HTTPリクエストを行う
IXMLHTTPRequestオブジェクトの生成
VBAでHTTPリクエストをする場合はIXMLHTTPRequestオブジェクトを生成させます。
コードは以下になります。
Dim http As MSXML2.XMLHTTP60
Set http = New MSXML2.XMLHTTP60
変数を定義した後、MSXML2.XMLHTTP60型のオブジェクトを生成しています。
OpenメソッドでHTTPリクエストの設定
OpenメソッドはMSXML2.XMLHTTPリクエストを初期化し、リクエストのメソッド、URL,および認証情報を指定します。
構文は以下になります。
IXMLHTTPRequestオブジェクト.Open メソッド, URL
今回IXMLHTTPRequestオブジェクトは変数名をhttpとしましたのでコードはhttp.Open~になります。
今回はGet方式を用いて行いますのでメソッドは”Get”になります。一方Post方式の際は”Post”になります。
Sendメソッドで送信
SendメソッドはHTTPリクエストをサーバーに送り、レスポンスを受け取ります。
構文は以下になります。
IXMLHTTP Requestオブジェクト.Send
先ほどと同様でコードはhttp.Sendになります。これで送信ができます。
ここまでがHTTPリクエストの重要な部分です。
少し難しく思ったかもしれませんがやっていることはオブジェクトを生成して、OpenメソッドとSendメソッドを使っているだけです。
ReadyStateプロパティで読み込み待ち
ReadyStateプロパティはリクエストの状態を表すプロパティです。
リクエスト後のレスポンスには時間を要します。
その為以下のコードで読み込み完了まで待つことにします。
ReadyStateプロパティの値が4になれば読み込みは完了しループを抜けます。
Do
If .readyState = 4 Then
Exit Do
End If
DoEvents
Loop
HTTPレスポンスから文字列を取り出す
responseTextプロパティで文字列の表示
responseTextプロパティは応答した内容を文字列として表します。
構文は以下になります。
IXMLHTTP Requestオブジェクト.responseText
Debug.Printで出力された文字列はこれまでと同様以下になります。
{“coord”:{“lon”:139.6917,”lat”:35.6895},”weather”:[{“id”:802,”main”:”Clouds”,”description”:”雲”,”icon”:”03d”}],”base”:”stations”,”main”:{“temp”:15.95,”feels_like”:15.66,”temp_min”:13.58,”temp_max”:17.02,”pressure”:1020,”humidity”:79},”visibility”:9000,”wind”:{“speed”:3.6,”deg”:200},”clouds”:{“all”:40},”dt”:1649622858,”sys”:{“type”:2,”id”:2038398,”country”:”JP”,”sunrise”:1649621664,”sunset”:1649668199},”timezone”:32400,”id”:1850144,”name”:”東京都”,”cod”:200}
レスポンスを受け取るときはオブジェクトに対してresponseTextプロパティを使用するだけです。
これでJSON形式のデータが取得できました。
まとめ
今回VBAを用いてHTTPリクエストとレスポンスを実行しました。
少し難しく感じたかもしれませんがやっていることは
- リクエスト・・・オブジェクトを生成して、OpenメソッドとSendメソッドを使う
- レスポンス・・・オブジェクトに対してresponseTextプロパティを使用する
だけです。
この方法でWebサーバーから必要なデータ一式を取得することは可能になりました。
ただし、このままだとこの中の任意のデータを取り出すことは困難です。
その為次回はJSON形式で書かれた文字列をJavaScriptオブジェクトとして利用するJSONパースについて説明します。
pythonですが会話形式で非常にわかりやすく書かれている書籍です。webAPIやスクレイピングを一から理解できる内容になっています。
Selenium-VBAでのWebスクレイピングに関する記事はこちらをどうぞ
【ExcelVBA‐Selenium】【永久保存版】スクレイピングに必要なSeleniumのインストール方法教えます
【Selenium-VBA】Yahooメールへのログイン方法をわかりやすく説明する
ChromeでのWebスレイピングをできる限りわかりやすく説明する(Excel VBA)
【ExcelVBA‐Selenium】Chrome driverのバージョンエラーが出た時の対処法(2021/10/7更新)
【Selenium-VBA】Seleniumを用いたスクレイピングでテーブル情報を取得する1
【Selenium-VBA】スクレイピングをするのに必要なHTMLについて説明します1
【Selenim-VBA】起動済みのChromeを用いてSeleniumによるスクレイピングを行う
【Selenium-VBA】JavaScriptを使ってスクレイピングをしてみる1
【VBA】SeleniumBasicにおけるクラス、メソッド、プロパティ一覧(日本語版)
Web-APIを用いたデータ取得に関する記事はこちらをどうぞ
【VBA】Web APIを使ってデータを取得する(OpenWeatherMap)1
【VBA】Web APIを使って時間別天気予報を取得する(気象庁API)
【VBA】Web APIを使ってLINE通知を行う(LINE Notify)1
コメント