スポンサーリンク

【VBA】Web APIを使ってデータを取得する(OpenWeatherMap)5 全コード

VBAスクレイピング

こんにちは、blueです。

前回は取得したJSON形式のデータに対するJSONパースの方法について説明しました。

前回の記事はこちら

今回はまとめとしてOpenWeatherMapのWeb APIを使った天気情報取得の全コードを紹介します。

コードは長いですが、これまでの内容も振り返っていますので一通り読んでいただいて理解していただければと思います。

pythonですが会話形式で非常にわかりやすく書かれている書籍です。webAPIやスクレイピングを一から理解できる内容になっています。

スポンサーリンク

実コード

コードは以下になります。

Public Sub 現在天気取得_緯度経度()

  Call CurrentWeatherData
 
End Sub

Private Sub CurrentWeatherData()

    Const key As String = "API key" 'OpenWeatherMapから取得したものを入れること
    Const lat As String = "35.6809704" '東京駅の緯度 GoogleMapから取得
    Const lon As String = "139.7678007" '東京駅の経度 GoogleMapから取得
   
   
    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
        
        'JSONパース
        Dim jsonObj As Object
        Set jsonObj = JsonConverter.ParseJson(.responseText)
        
        'JSON整形
        Debug.Print JsonConverter.ConvertToJson(jsonObj, " ")
        
        'JSON出力
        Debug.Print "都市=" & jsonObj("name")
        Debug.Print "天気=" & jsonObj("weather")(1)("main")
        Debug.Print "天気詳細=" & jsonObj("weather")(1)("description")
        Debug.Print "平均気温=" & jsonObj("main")("temp")
        Debug.Print "最低気温=" & jsonObj("main")("temp_min")
        Debug.Print "最高気温=" & jsonObj("main")("temp_max")
        Debug.Print "風速=" & jsonObj("wind")("speed")
        
    End With
End Sub
    

各コードの説明

コードのサブルーチン化

Public Sub 現在天気取得_緯度経度()

 Call CurrentWeatherData
 
End Sub

今回のコードは汎用性を考慮してCurrentWeatherDataとしてサブルーチン化しています。

不要な方は以降のPrivate~のコードのみでもOKです。

    Const key As String = "API key" 'OpenWeatherMapから取得したものを入れること
    Const lat As String = "35.6809704" '東京駅の緯度 GoogleMapから取得
    Const lon As String = "139.7678007" '東京駅の経度 GoogleMapから取得

まず今回の定数をセットします。

keyはOpenWeatherMapのアカウントから取得したもの、緯度(lat),経度(lon)はGoogleMapから取得したものを入れるようにします。

詳しい記事はこちら。

HTTPリクエストとレスポンス

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

HTTPリクエストして得られたデータをイミディエイトウィンドウに出力しています。

HTTPリクエストする際のURLはOpenWeatherMapのAPIを指定しています。

詳しい記事はこちら

VBAでのHTTPリクエストはIXMLHTTPRequestオブジェクトを生成することから始めます。

手順としては

  • Microsoft XML, v6.0の参照設定
  • IXMLHTTPRequestオブジェクトの生成
  • Open,Sendメソッドを使いリクエストを行う
  • responseTextプロパティでレスポンスを受け取る

になります。

詳しい記事はこちら

得られたデータはJSON形式の1行テキストになっています。

{}や[]が多くて難しそうに思えますが、Excelの表で考えればすぐに理解できると思います。

詳しい記事はこちら

JSONパースとJSON出力

    'JSONパース
    Dim jsonObj As Object
    Set jsonObj = JsonConverter.ParseJson(.responseText)

    'JSON整形
    Debug.Print JsonConverter.ConvertToJson(jsonObj, " ")

    'JSON出力
    Debug.Print "都市=" & jsonObj("name")
    Debug.Print "天気=" & jsonObj("weather")(1)("main")
    Debug.Print "天気詳細=" & jsonObj("weather")(1)("description")
    Debug.Print "平均気温=" & jsonObj("main")("temp")
    Debug.Print "最低気温=" & jsonObj("main")("temp_min")
    Debug.Print "最高気温=" & jsonObj("main")("temp_max")
    Debug.Print "風速=" & jsonObj("wind")("speed")

responseTextプロパティで受け取ったJSONデータをJSONパースし、イミディエイトウィンドウに出力しています。

出力データはJSON整形したものと特定のデータ両方になります。

JSONパースに関する記事はこちら

出力結果

今回はイミディエイトウィンドウに出力しましたが、ここには199行までしか出力できません。JSONパースすると多くのデータが改行されますのでそれ以上を出力する場合はエクセルに出力するなど考慮ください。

{"coord":{"lon":139.6917,"lat":35.6895},"weather":[{"id":802,"main":"Clouds","description":"雲","icon":"03n"}],"base":"stations","main":{"temp":20.82,"feels_like":21.07,"temp_min":18.7,"temp_max":23.08,"pressure":1012,"humidity":81},"visibility":10000,"wind":{"speed":3.6,"deg":180},"clouds":{"all":40},"dt":1649854241,"sys":{"type":2,"id":2038398,"country":"JP","sunrise":1649794302,"sunset":1649841098},"timezone":32400,"id":1850144,"name":"東京都","cod":200}

{
 "coord": {
  "lon": 139.6917,
  "lat": 35.6895
 },
 "weather": [
  {
   "id": 802,
   "main": "Clouds",
   "description": "\u96F2",
   "icon": "03n"
  }
 ],
 "base": "stations",
 "main": {
  "temp": 20.82,
  "feels_like": 21.07,
  "temp_min": 18.7,
  "temp_max": 23.08,
  "pressure": 1012,
  "humidity": 81
 },
 "visibility": 10000,
 "wind": {
  "speed": 3.6,
  "deg": 180
 },
 "clouds": {
  "all": 40
 },
 "dt": 1649854241,
 "sys": {
  "type": 2,
  "id": 2038398,
  "country": "JP",
  "sunrise": 1649794302,
  "sunset": 1649841098
 },
 "timezone": 32400,
 "id": 1850144,
 "name": "\u6771\u4EAC\u90FD",
 "cod": 200
}
都市=東京都
天気=Clouds
天気詳細=雲
平均気温=20.82
最低気温=18.7
最高気温=23.08
風速=3.6




まとめ

今回までの記事でOpenWeatherMapのWeb APIを使ったVBAでのHTTPリクエストについて説明しました。

Web APIはAPI keyの取得に始まりHTTPリクエストやJSONパースなど難しいものが多かったと思います

ただこれらの記事を通して少しでも内容を理解していただければ嬉しく思います。

また別でWeb APIの記事も上げますのでまたみていってください。

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

コメント

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