今回は、取得したAPIキーを使って、ExcelからChatGPTを呼び出して使ってみたいと思います。
VBAのコードもすべて載せているので、最後まで見ていってください。
APIキーの取得方法はコチラから↓↓
API利用料金はコチラから↓↓
Excel VBAの下準備
APIが取得できたので、外部サービスからChatGPTを使ってみようと思います。
今回はExcel VBAを使ってアクセスしてみます。
Excel側のコードは、ChatGPTに出力してもらいましょう。
上記に従ってVBE(Visual Basic Editor)を開きます。
開発タブが無い場合は、リボンに追加すると出すことができます。
ここで一旦、ファイルを保存しておきます。
マクロ有効ブック( *.xlsm )で保存しないと、VBAが保存されません。
参照設定
次に、VBEから参照設定を行います。
これは、他の言語で言うところのライブラリのインポートにあたります。
今回使うライブラリは、以下の2つです。
- Microsoft WinHTTP Services, version 5.1
WindowsOSに含まれるAPIであり、HTTP通信を行うためのライブラリ。
HTTPリクエストの送信・レスポンスの取得に使用する。 - Microsoft Scripting Runtime
ファイル操作やテキスト処理など、スクリプトの基本的な機能を提供するライブラリ。
今回はログファイルの作成・保存に使用する。
上記のライブラリを探してチェックを入れます。
量が多くて大変ですが、ABC順に並んでいるので見つけられるはずです。
コードを書く場所として、標準モジュールを作成します。
VBAのコードを書く
上記の操作で、右クリックした箇所にmodule1という項目ができるので、そこに以下のコードを記載します。
Option Explicit
' ChatGPT API のエンドポイント
Private Const API_ENDPOINT As String = "https://api.openai.com/v1/chat/completions"
' ChatGPT API に必要なキー
Private Const API_KEY As String = "your API key"
' ChatGPT API のパラメータ
Private Const API_PARAMS As String = "{""model"":""gpt-3.5-turbo"",""messages"": [{ ""role"": ""system"",""content"": ""[CHARACTOR]""},{ ""role"": ""user"",""content"": ""[PROMPT]""}],""max_tokens"":1000,""temperature"":0.5}"
' WinHTTP リクエストオブジェクト
Private oHttpReq As Object
' FileSystemObject オブジェクト
Private oFSO As Object
' ログ出力ファイルパス
Private Const LOG_FILE_PATH As String = "C:\ChatGPT.log"
Public Function ChatGPT(ByVal prompt As String, ByVal charactor As String) As String
' API パラメータの作成
Dim params As String
Dim requestBytes() As Byte
' 改行の削除
prompt = Replace(prompt, vbLf, "")
charactor = Replace(charactor, vbLf, "")
' 要求パラメータの入力
params = Replace(API_PARAMS, "[PROMPT]", prompt)
params = Replace(params, "[CHARACTOR]", charactor)
' WinHTTP リクエストの作成
If oHttpReq Is Nothing Then
Set oHttpReq = CreateObject("MSXML2.XMLHTTP")
End If
oHttpReq.Open "POST", API_ENDPOINT, False
oHttpReq.SetRequestHeader "Content-Type", "application/json; charset=UTF-8"
oHttpReq.SetRequestHeader "Authorization", "Bearer " & API_KEY
oHttpReq.Send params
' レスポンスの取得
Dim response As String
response = oHttpReq.ResponseText
' JSONから本文を抽出
response = GetContentFromJSON(response)
' ログの出力
If oFSO Is Nothing Then
Set oFSO = CreateObject("Scripting.FileSystemObject")
End If
Dim oLogFile As Object
Set oLogFile = oFSO.OpenTextFile(LOG_FILE_PATH, 8, True)
oLogFile.WriteLine "Prompt: " & prompt
oLogFile.WriteLine "Response: " & response
oLogFile.WriteLine "--------"
oLogFile.Close
' レスポンスを返す
ChatGPT = response
End Function
Private Function GetContentFromJSON(response As String) As String
Dim startpos, endpos, msglen As Integer
' "content":" から
startpos = InStr(response, """content"":""") + Len("""content"":""")
' "},""finish_reason":" までの間の文章を抜き出す
endpos = InStr(response, """},""finish_reason"":""")
msglen = endpos - startpos
' Contentを抽出
GetContentFromJSON = Mid(response, startpos, msglen)
End Function
上記のコードに対して、各々のAPIキーをセットします。
APIキーはコード8行目の”your API key”の部分に置き換えてください。
Private Const API_KEY As String = "your API key"
また、logの出力箇所を変更する場合は、コード23行目の”C:\ChatGPT.log”を好きな場所に置き換えてください。
Private Const LOG_FILE_PATH As String = "C:\ChatGPT.log"
以上でChatGPTの関数化は完了です!
ExcelのシートからChatGPTを呼び出すことができるようになりました。
ExcelのシートからChatGPTを呼び出す
早速実際に使ってみましょう。
関数を呼び出す際には、「引数1:要求文」と「引数2:役割」を設定する必要があります。
要求文は、自分からChatGPTへのメッセージを書きます。
役割は、この会話におけるChatGPTの役割を書きます。
例えば、こんな感じで使えます。
コツとしては、役割をできるだけ明確に書いておくと、思った通りの返事が得られるでしょう。
ただし、文字数が多くなるとAPI利用料金が高くなるので気をつけてください。
API利用料金を抑えるために
ChatGPT関数をExcel関数としてシートに記載すると、
要求文を書き直したり、セルを選択した際に自動で更新されてしまいます。
そうなると、なんどもHTTPリクエストを送ってしまい、API使用量がかさんでしまいます。
これを避けるためには、計算方法を手動に設定しておきましょう。
手動計算の場合、数式タブの「再計算実行」を行うか、「F9」キーを押すと再計算が行われます。
上記のケースでは、複数のセルに計算式があった場合、全て同時に計算されます。
セルを個別に計算したい場合、計算実行用のマクロをボタンに設定する方法があります。
再計算マクロ
再計算ボタンに設定するマクロは以下のとおりです。
Public Sub StartCalcurate()
Dim ws As Worksheet
Dim RowId, ColId As Integer
Set ws= ActiveSheet
RowId = ws.Shapes(Application.Caller).TopLeftCell.Row
ColId = ws.Shapes(Application.Caller).TopLeftCell.Column
ws.Cells(RowId, ColId - 1).Calculate
End Sub
ボタンの挿入は下記から。
ボタンにマクロを登録して完了です。
更新したいセルの右側にボタンを配置してください。
まとめ
今回は、ExcelVBAを使って、ChatGPTを関数化してみました。
使い方次第で、チャットボットとして使ったり、お客様ごとのメール文面を作成したり、
便利に使えると思います。
うまくいかない現象があれば、気軽にコメントいただければと思います。
コメント