EXCEL VBAからAzure OpenAI ServiceのAPIを呼びだすサンプルコードを紹介します。
事前準備
VBA-JSONのインストール
VBAでJSONを解析する、VBA-JSONというライブラリを使用します。
以下の手順でインポートします。
- VBA-JSON のページにアクセスし、「Code」ボタンをクリックし、「Download ZIP」を選択してファイルをダウンロードします。
- ZIPファイルを解凍し、
JsonConverter.bas
ファイルを取得します。 - ExcelのVBAエディタを開き、「ファイル」メニューから「ファイルのインポート」を選択し、
JsonConverter.bas
ファイルをインポートします。
参照設定の追加
VBA-JSONライブラリで使用されている Dictionary
型を使えるようにするため、以下の手順で参照設定を追加します。
- VBAエディタを開く
- ExcelでAlt + F11キーを押してVBAエディタを開きます。
- 参照設定を開く
- VBAエディタで、「ツール」メニューをクリックし、「参照設定」を選択します。
- Microsoft Scripting Runtimeの参照を追加
- 「参照設定」ダイアログボックスが開きます。
- 下にスクロールし、「Microsoft Scripting Runtime」にチェックを入れて、「OK」をクリックします。
サンプルコード
シート上にボタンを配置し、クリックしたらAPIが呼び出されるようにするためのVBAコードを記載します。
最初に呼び出す関数を ButtonClick() として定義しています。
A1セルの内容をプロンプトとしてAzure OpenAI Serviceに送信し、応答がB1セルに表示されるようにしています。
Option Explicit
Sub ButtonClick()
' ボタンがクリックされたときに呼び出されるサブルーチン
Dim prompt As String
Dim resText As String
' セルA1の値をプロンプトとして取得
prompt = Range("A1").Value
' CallGPT関数を呼び出して、プロンプトに対する応答を取得
resText = CallGPT(prompt)
' セルB1に応答を設定
Range("B1").Value = resText
End Sub
Function CallGPT(prompt As String) As String
' Azure OpenAI ServiceのAPIキー
Const API_KEY As String = "[YOUR_API_KEY]"
' エンドポイントとデプロイ名を入力
Const API_ENDPOINT As String = "https://[YOUR_ENDPOINT]/openai/deployments/[YOUR_DEPLOYMENT]/chat/completions?api-version=2023-05-15"
Dim maxTokens As Long
Dim temperature As Double
Dim httpObj As Object
Dim dictReq As New Scripting.Dictionary
Dim messages As New Collection
Dim requestBody As String
Dim response As Object
' 応答の最大トークン数を設定
maxTokens = 2000
' 応答の温度(創造性の度合い)を設定
temperature = 0
' システムメッセージとユーザープロンプトをメッセージリストに追加
messages.Add Message("system", "You are a helpful personal assistant")
messages.Add Message("user", prompt)
' リクエストデータを設定
dictReq.Add "messages", messages
dictReq.Add "max_tokens", maxTokens
dictReq.Add "temperature", temperature
' リクエストデータをJSON形式に変換
requestBody = JsonConverter.ConvertToJson(dictReq, 2)
Debug.Print requestBody
' HTTPオブジェクトを作成
Set httpObj = CreateObject("MSXML2.XMLHTTP")
' APIリクエストを送信
httpObj.Open "POST", API_ENDPOINT, False
httpObj.setRequestHeader "Content-Type", "application/json"
httpObj.setRequestHeader "api-key", API_KEY
httpObj.send requestBody
' APIの応答をデバッグプリント
Debug.Print httpObj.responseText
' 応答をJSON形式で解析
Set response = JsonConverter.ParseJson(httpObj.responseText)
' 応答に"choices"が含まれている場合、最初の応答メッセージを返す
If response.Exists("choices") Then
CallGPT = response("choices")(1)("message")("content")
Else
CallGPT = "no response!"
End If
End Function
Function Message(role As String, prompt As String) As Scripting.Dictionary
' メッセージの役割と内容を設定する関数
Set Message = CreateObject("scripting.dictionary")
Message.Add "role", role
Message.Add "content", prompt
End Function
[YOUR_API_KEY]、[YOUR_ENDPOINT]、[YOUR_DEPLOYMENT] は、使用するAzure OpenAI Serviceの環境にあわせて変更してください。
AIPバージョン(2023-05-15)も、必要に応じて変更してください。
コマンドボタンの追加
コマンドボタンの追加方法を記載します。
- 開発ツールの表示
- Excelを開きます。
- メニューの「ファイル」タブをクリックし、「オプション」を選択します。
- 「Excelのオプション」ウィンドウで「リボンのユーザー設定」を選択し、「開発」タブにチェックを入れます。これでリボンに「開発」タブが表示されます。
- コマンドボタンの追加
- 「開発」タブをクリックします。
- 「挿入」ボタンをクリックし、フォームコントロールの中から「ボタン(フォームコントロール)」を選択します。
- シート上の任意の場所をクリックしてドラッグし、ボタンを配置します。
- ボタンのプロパティ設定
- ボタンを配置すると、「マクロの登録」ダイアログボックスが表示されます。
- サンプルコードで作成した、
ButtonClick
を選択し「OK」をクリックします。
おわりに
EXCELで行われている業務にGPTを適用するには、EXCEL VBAでのAPI呼び出しが便利です。