[ChatGPT] Excel関数でChatGPTを呼び出す

OpenAI API

今回は、取得したAPIキーを使って、ExcelからChatGPTを呼び出して使ってみたいと思います。
VBAのコードもすべて載せているので、最後まで見ていってください。

APIキーの取得方法はコチラから↓↓

API利用料金はコチラから↓↓

Excel VBAの下準備

APIが取得できたので、外部サービスからChatGPTを使ってみようと思います。
今回はExcel VBAを使ってアクセスしてみます。

Excel側のコードは、ChatGPTに出力してもらいましょう。

上記に従ってVBE(Visual Basic Editor)を開きます。

開発タブが無い場合は、リボンに追加すると出すことができます。

[開発] タブを表示する - Microsoft サポート
必要に応じ、 タブをリボンに追加します。

ここで一旦、ファイルを保存しておきます。
マクロ有効ブック( *.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を関数化してみました。
使い方次第で、チャットボットとして使ったり、お客様ごとのメール文面を作成したり、
便利に使えると思います。
うまくいかない現象があれば、気軽にコメントいただければと思います。

コメント

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