ChatGPTのAPIを使い、質問に対しての返答を得る関数のマクロです。関数にすれば、他のプロシージャでAI回答を使用したり、ワークシート上でも活用ができます。*API使用のためにはアカウント登録とAPI使用するための課金が必要です。
コード
➤ChatGPTの返答を得る関数
Option Explicit
Function GetGPTres(strQuestion As Variant) As Variant
Dim APIKey As String
Dim strModel As String
Dim Url As String
Dim http As Object
Dim strMessages As String
Dim strResponse As String
'*** 初期値設定 *****
If Len(ThisWorkbook.Worksheets(ThisWorkbook.Worksheets.count).Range("D3").value) < 70 Then
GetGPTres = "【【【【APIキーが無いためChatGPTを使用できませんでした。】】】】"
MsgBox "APIキーが無いためAPIを使用できません。"
Exit Function
Else
APIKey = ThisWorkbook.Worksheets(ThisWorkbook.Worksheets.count).Range("D3").value
End If
strModel = "gpt-3.5-turbo" 'モデル名
'strQuestion = Application.InputBox("質問") '**質問を変数にセット
If strQuestion = False Or strQuestion = "" Then
Exit Function
End If
'*** API処理 ****
Url = "https://api.openai.com/v1/chat/completions"
Set http = CreateObject("MSXML2.XMLHTTP")
'リクエストヘッダー
http.Open "POST", Url, False
http.setRequestHeader "Content-Type", "application/json"
http.setRequestHeader "Authorization", "Bearer " & APIKey
'メッセージ作成
strMessages = "{""model"": """ & strModel & """," & _
"""messages"": [{""role"": ""user"", ""content"": """ & strQuestion & """}]}"
'リクエスト送信
http.Send strMessages
strResponse = http.responseText '結果を変数に代入
'MsgBox strResponse
If InStr(1, strResponse, "invalid_request", vbTextCompare) > 0 Then
GetGPTres = "APIキーが無いためChatGPTを使用できませんでした。"
MsgBox "【【【【APIキーが無いためAPIを使用できません。】】】】"
Exit Function
End If
Dim JSON As Object
Set JSON = JsonConverter.ParseJson(strResponse)
' contentを取得
On Error Resume Next ' エラーを無視して処理を続ける
strResponse = JSON("choices")(1)("message")("content")
On Error GoTo 0 ' エラー無視を解除
GetGPTres = strResponse
End Function
APIを使用し返答を得るには、JSONConverterを使用する必要があります。VBAように用意されているため、下記からダウンロードしてください。インポート後は、参照設定のツールメニューの参照設定から、Microsoft Scripting Runtimeをチェックして追加しておきます。
ダウンロードリンク先:https://github.com/VBA-tools/VBA-JSON


また、API利用のためには、課金して取得できるAPIキーが必要です。

APIKeyという変数に、直接キーを代入するか、ワークシート上のセルに記載することで設定してください。
ポイント機能
・API使用準備設定
・エラー処理
API使用準備設定
モデルはいくつかありますが、最も料金が安いモデル3.5turboを使用しています。これは現状2025年7月時点では旧版のモデルとなりますが、安価で且つ性能もよいため、標準的なモデルとなっています。業務で使用する場合の要約などではほとんど申し分ない性能です。

API使用のためには、Keyの他、その他プロパティの設定が必要です。まず、http変数に作成したXMLHTTPオブジェクト格納します。これは、ウェブ上での検索等のリクエストを送るために必要になります。

その後、ChatGPTのAPI利用のためにUrlを送信します。ChatGPTAPIのURLは上記画像の通りです。

その後、指定URLにてPOSTリクエストします。Falseでは同期通信を指定し、返答があるまで待つように処理されます。
2行目では、リクエスト本文がJSON形式であるよう指定します。これにより、のちのConverterで返答部分のみを抽出することができます。
3行目は、APIキーを使用して、認証が行われAPI使用が可能となります。

その後質問のリクエストを送信します。strMessagesにて、上記で指定した通りJSON形式で質問を含めたリクエストを送ります。
APIキーがない場合等エラー処理

APIキーが正しくない、利用可能なトークン数が足りないなどの場合は、JSON形式でエラーが返されます。ここではそのエラー文に含まれるinvalid request=非有効なリクエストという文字が含まれているかどうかで、エラー判断をしています。ただし、リクエストで送った文章にこの文字列が完全に一致してしまう場合はエラーとなります。その場合は適宜エラー判断条件変更をしてください。
Converterによる返答の抽出
取得した返答はJSON形式で、ChatGPTによる質問への返答以外の要素も含んでいます。これらから返答のみ抽出するためにはConverterという関数を使います。

ダウンロードしたVBAJSONConverterは、引数を入れた関数として使用することで、その後のJSON形式文字列操作ができます。

APIによる返答では、Contentという部分をキーとして、質問に対する返答が含まれています。ContentはChoices、message要素を親として持っている為、特定のために2つの要素を指定し、Contentを取得しています。
簡単に説明すると、下記返答があり、contentを取得するための処理です。Choicesという配列があり、その一つ目の要素の中にあるmessageの要素にcontentが存在しています。