こんにちは、くのへです!
先日、エクセルVBAで生成AIのGeminiにWebAPIアクセスし、癒しのお姉さんと対話できるエクセルを作ったところ、結構反響があったので、その作り方を解説したいと思います。
この解説をYouTubeにアップしました。良ければこれも見てみて下さい。
この記事は上記の内容をより詳しく解説します。
準備するもの
まず、ExcelとVBAが使える環境があればOKです。
コピペして使う、天気予報APIのリクエストのコード
以下のコードをそのままコピーして、Excel VBAエディターに貼り付けてみてください。
A1セルに東京の天気予報概要が表示されます(Json形式で返ってきます)。
Sub GetRequestSample()
Dim http As Object
Set http = CreateObject("MSXML2.XMLHTTP.6.0")
' ここでアクセスするAPIのURLを指定します
Dim url As String
url = "https://www.jma.go.jp/bosai/forecast/data/overview_forecast/130000.json" ' 天気予報API
' GETリクエストを送信
http.Open "GET", url, False
http.Send
' 応答を取得し、Excelのシートに表示します
If http.Status = 200 Then
' レスポンスを取得してシートに表示
Dim jsonResponse As String
jsonResponse = http.responseText
Sheets("Sheet1").Range("A1").Value = jsonResponse
Else
' エラーメッセージを表示
MsgBox "リクエストに失敗しました。ステータスコード: " & http.Status
End If
Set http = Nothing
End Sub
こちらが実行結果です。
なんか読みにくいけど、しかし天気予報のデータが返ってきているのが分かりますね!!
お住いの住所が東京以外の方は、コードの次の部分の最後の130000と書いている番号を次のように変更してください。
url = "https://www.jma.go.jp/bosai/forecast/data/overview_forecast/130000.json" ' 天気予報API
茨城県:080000
埼玉県:110000
千葉県:120000
神奈川県:140000
愛知県:230000
京都府:260000
大阪府:270000
兵庫県:280000
広島県:340000
福岡県:400000
詳しくは、あんこエデュケーション様のHPで詳しく解説されていますので、自分のお住いの地域が上記の都道府県に含まれていなければ、あんこエデュケーション様のHPも参考にして下さい。
コードの解説
まず、一番最初の次のコードを見ましょう。
Dim http As Object
Set http = CreateObject("MSXML2.XMLHTTP.6.0")
Excel VBAにはHTTPリクエストを送る機能(:つまりWebAPIを使う機能)はデフォルトでは付いていません。
そのため、HTTPリクエストを送るために、MSXML2.XMLHTTP.6.0
というライブラリを使います。このライブラリをhttp
というオブジェクトを作成してセットしています。
全く分からん!!という方は、「この呪文を書くことで変数http
を起点にWebAPIを操るプログラムを書けるようになる」と丸暗記する感じでも良いと思います。
次に次のコードです。
' ここでアクセスするAPIのURLを指定します
Dim url As String
url = "https://www.jma.go.jp/bosai/forecast/data/overview_forecast/130000.json" ' 天気予報API
ここで、WebAPIにアクセスするための基本的なURLを設定しています。
このWebAPIを動かすための基本的なURLのことを「エンドポイント」と言います。WebAPI界の専門用語です。WebAPIを動かすための最初の入口と思ってOKです(入口なのに「エンド」とは、もうわかんねーなw)。
次に以下が、VBAでWebAPIを使うための一番重要な部分です。
変数httpを起点に.Openと書き、さらに.Sendと書くと、Httpリクエストを送る!!という意味になります。
http.Open "GET", url, False
http.Send
このOpenの後ろの第1引数はMethodと呼ばれ、HTTPリクエストの中でも「Getリクエスト」とか「Postリクエスト」という種類があり、この種類を書きます。
第2引数にはエンドポイント(WebAPIの入口のURL)を書きます。
第3引数には、WebAPIからのレスポンスを待つかどうかの設定を記載します。ここをFalseにすると「待つ」という仕組みとなり、.Sendを送った後にレスポンスが来るまでプログラムは一時停止するようになります。
(Trueにすると.Sendの次にどんどんプログラムが進んでしまいます)
ということで、このプログラムを記載することで、所定のWebAPIに「データを頂戴!!」ってリクエストすることが出来ます。
そして、リクエストした後で返ってくるレスポンスは、http.responseTextというプロパティの中に格納される仕組みになっています。
あとは、次のコードでそのレスポンスをA1セルに書いているだけです。
一応、リクエストの返答はhttp.responseTextだけではなく、http.Statusというプロパティにも返ってきて、成功であれば200という数字が返ってきます。これを使ってIf文でWebAPI通信の成功・失敗で分岐させているわけです。
' 応答を取得し、Excelのシートに表示します
If http.Status = 200 Then
' レスポンスを取得してシートに表示
Dim jsonResponse As String
jsonResponse = http.responseText
Sheets("Sheet1").Range("A1").Value = jsonResponse
Else
' エラーメッセージを表示
MsgBox "リクエストに失敗しました。ステータスコード: " & http.Status
End If
最後の1文ですが、ExcelVBA以外の機能を呼び出した場合は、そのオブジェクトをNothingしておいた方が残データを残さないので無難です。今回は「MSXML2.XMLHTTP60」という外部ライブラリを呼び出しているので、念のためnothingしておきましょう。
Set http = Nothing
ちなみに
エクセルでWebAPIを使うためには、「MSXML2.XMLHTTP60」というライブラリを使う必要があるため、プログラムの最初でCreate Objectを使って「MSXML2.XMLHTTP60」というライブラリを呼び出し、変数「http」にセットしました。
この「MSXML2.XMLHTTP60」というライブラリはHTTP通信を行うことが出来るようになるライブラリです。
CreateObjectで呼び出す方法の他に、参照設定を行って呼び出す方法があります。
ツール⇒参照設定をクリックし、次の図のように「Microsoft XML v6.0」ライブラリにチェックを付けましょう。
この設定をした上で、今回のコードの3行目を次のように変更します(ハイライト部)。これでも全く同じ動きをします。
Sub GetRequestSample()
Dim http As Object
Set http = New MSXML2.XMLHTTP60
' ここでアクセスするAPIのURLを指定します
Dim url As String
url = "https://www.jma.go.jp/bosai/forecast/data/overview_forecast/130000.json" ' 天気予報API
' GETリクエストを送信
http.Open "GET", url, False
http.Send
' 応答を取得し、Excelのシートに表示します
If http.Status = 200 Then
' レスポンスを取得してシートに表示
Dim jsonResponse As String
jsonResponse = http.responseText
Sheets("Sheet1").Range("A1").Value = jsonResponse
Else
' エラーメッセージを表示
MsgBox "リクエストに失敗しました。ステータスコード: " & http.Status
End If
Set http = Nothing
End Sub
どちらを使ってもOKですが、他のサイト様の記事で参照設定を使う方法で記載されていたり、CreateObjectを使う方法で解説されていたりして、混乱が生じやすいように思います。
ExcelVBAでOutlookVBAを使う時もこのような参照設定を行うことがありますが、参照設定を行うと、ライブラリ内の定数(OutlookVBAの場合はolXXXXXシリーズ)をExcelVBA内でも使えるようになるというメリットがあります。
ただし、「MSXML2.XMLHTTP60」を使う場合では、あまりライブラリ内定数を使うことはないように思いますので、「MSXML2.XMLHTTP60」を使う場合は、参照設定を使ってもCreateObjectを使ってもどちらでも良いと思います。
おわりに
この記事はVBAでWebAPIを使う方法の最も基本的な部分を解説しました。
これが、ExcelVBAで生成AIのAPIを呼び出すための第一歩になります!
是非、ご自身のExcelでこのコードをコピペしてWebAPIを動かしてみて下さい!