ExcelにChatGPTの回答を出力する方法!VBAでAPI連携!

ExcelにChatGPTの回答を出力する方法!VBAでAPI連携!

ExcelにChatGPTの回答を出力したいときはないでしょうか。

けど、そんな中で悩むことは、

・ExcelにChatGPTの回答を出力したいが方法がよくわからない
・Excel VBAを使いChatGPT APIと連携する方法が知りたいがどこにもない

ですよね。

今回はそんなお悩みを解決する

・ExcelにChatGPTの回答を出力する方法
・Excel VBAを使いChatGPT APIと連携する方法

についてまとめます!

ExcelにChatGPTの回答を出力するイメージ

ExcelにChatGPTの回答を出力するイメージについて説明をします。

まず、Excelを用意します。

B1セルに質問内容を入れ、マクロを実行すると、ChatGPTが呼び出され、その結果をB3セル以降に出力していきます。

使いたい関数をわすれてしまったり、ちょっと調べものをしてExcelにまとめたいときなどに便利ですね!

それでは早速実装して、使ってみましょう。

タカヒロ
タカヒロ
なお、今回ExcelでChatGPTを使うにあたり、何かを追加インストールしたり、拡張機能を追加したりすることはありません。今お使いのExcelだけあればOKです!

ChatGPTについて

ChatGPTについて説明をします。

ChatGPTとは、自然言語処理(NLP)を活用したチャットボットの一種です。

ChatGPTは、言葉を入力すると、それに対応する自然な文章を出力することができます。

ChatGPTは、ユーザーの質問に自動的に回答することができるため、質問に対応した回答を迅速に行うことが可能です。また、ChatGPTを用いることで、ユーザーとの会話を楽しむこともできます。

タカヒロ
タカヒロ
ちなみに説明文は、ChatGPT本人にきいたほうが確実であろうということで、回答文を引用した形となります。

ExcelにChatGPTの回答を出力する方法

ChatGPT連携元のExcelファイルを用意

まずは、ChatGPTの連携元となるExcelファイルを用意しましょう。

B1セルに質問内容を入れる枠を用意します。

ChatGPTの結果はB3セル以降に出力していきます。

タカヒロ
タカヒロ
アイコンなど添えるとかっこよくなりますので、好みでいれてみてください。

ChatGPTのAPIキーを取得

今回使うChatGPTのAPIキーを取得しましょう。

API keys発行ページへアクセスします。

タカヒロ
タカヒロ
初回ログインの場合はアカウントを登録してください。

「Create new secret key」をクリックし、出力されたAPIキーをメモします。

タカヒロ
タカヒロ
発行されたAPIキーは画面を閉じた後は見られなくなりますので、しっかり記録するようにしましょう。また、外部に漏れないよう注意しましょう。

ChatGPTのAPIを使う上での注意点

ChatGPTのAPIを使う上での注意点を先にお伝えします。

ChatGPTのAPIは利用していくと料金が発生する仕組みになっています。ですので、発行したAPIを数多く使ったり、第三者に共有し、不特定多数の人達に利用されたりすると知らぬ間に費用が多額になってしまっている可能性がありますので、十分注意してください。

ただ、初回登録時は18ドルの無料枠がありますので、それを超えない分量であれば料金は発生することはありません。

今どれぐらい使っているかを確認する方法はUsageページから確認することができますので、随時確認するようにしましょう。

ChatGPT APIと連携するサンプルVBAコード

ChatGPT APIと連携するVBAコードは以下の通りです。

Sub 質問をChatGPTのAPIへ送る()
 
    Dim objhttp As Object
    Dim APIKey As String
    Dim strTextToPredict As String
    Dim strRequestBody As String
    Dim strResponse As String
    Dim strModel As String
    Dim temp As Variant
    Dim temp2 As Variant
    Dim i As Integer
    Dim intMaxTokens As Integer
    Dim apiUrl As String
    Dim intCount As Integer
 
    'APIキーを入力します。
    APIKey = "sk-****************************************************"
    
    'ChatGPTのAPIから出力される最大文字数を指定します。
    intMaxTokens = 1000
    
    'ChatGPT APIのモデルを指定します。
    strModel = "text-davinci-003"
 
    'ChatGPTへの質問内容を取得します。
    strTextToPredict = Range("B1").Text
 
    'リクエスト先のURLを設定します。
    apiUrl = "https://api.openai.com/v1/completions"
    
    'XMLHTTPオブジェクトをセットします。
    Set objhttp = CreateObject("MSXML2.XMLHTTP")
    
    With objhttp

        'リクエストのヘッダーを設定します。
        .Open "POST", apiUrl, False
        .setRequestHeader "Content-Type", "application/json"
        .setRequestHeader "Authorization", "Bearer " & APIKey
     
        ' リクエスト文を作成します。
        strRequestBody = "{""model"":""" & strModel & """, ""prompt"":""" & strTextToPredict & """, ""max_tokens"":" & intMaxTokens & ", ""temperature"":0.5, ""top_p"":1}"
        
        'リクエストを送信します。
        .send strRequestBody
        
        'APIからのレスポンスが返るまで待ちます。
        Do While .readyState <> 4
            DoEvents
        Loop

        'レスポンス情報をデバッグします。不要であれば削除してください。
        Debug.Print .responseText
     
        'レスポンスのテキスト情報をExcel出力用変数に代入します。
        strResponse = .responseText
    
    End With
    
    'Json形式のデータの内回答テキストがある位置から分割します。
    temp = Split(strResponse, "\n\n")
    
    '配列数を取得します。
    intCount = UBound(temp)

    '配列分処理を繰り返します。
    For i = 1 To intCount
        
        If i = intCount Then
            '最後の回答をセルに出力します。
            temp2 = Split(temp(i), """,""")
            Cells(i + 2, 2) = Replace(Replace(temp2(0), "\n", Chr(10)), "\", "")
        Else
            '最後の回答以外をセルに出力します。
            Cells(i + 2, 2) = Replace(Replace(temp(i), "\n", Chr(10)), "\", "")
        End If
        
    Next i
 
End Sub

タカヒロ
タカヒロ
出力処理のところがパターン拾えていない可能性あり、不具合があればコメントいただければと存じます。
また、コードを別メディアなどで再公開する場合はこのページのリンクを張ってもらえると嬉しいです。

VBAを設定する

VBAを設定していきましょう。

先ほどメモしたAPIキーを入力します。

APIKey = "sk-****************************************************"

ChatGPTのAPIから出力される最大文字数を指定します。指定文字数が少ないと回答が途中で切れてしまう場合がありますので、注意してください。

intMaxTokens = 1000

ChatGPT APIのモデルを指定します。今回はGPT-3を対象にしています。新しいモデルが出た場合はこちらを変更してください。

strModel = "text-davinci-003"

VBAの実装

VBAの実装方法については
VBAの実装手順
をご参照ください。

VBAからChatGPTを実行する

アメリカ合衆国の歴代大統領をきいてみる

まずはかんたんなアメリカ合衆国の歴代大統領をきいてみましょう。

質問内容はこちらです。

アメリカ合衆国の歴代大統領を在籍年付きで教えてください。

大統領名の他に年号も含めるよう質問してみました。

結果です。

はい、しっかり回答ができていますね!

ちょっと考えてもらう質問をしてみる

次はちょっと考えてもらうパターンの質問をしてみましょう。

おすすめのExcel関数を説明付きで5個教えてください。

おすすめの基準はChatGPTにお任せしています。

はい、こちらもどことなく合っている回答ができていますね!

タカヒロ
タカヒロ
ちなみに、同じ質問を繰り返すと回答は毎回異なりますので、回答は内容をメモしておくとよいでしょう。

コードを作ってもらう

ChatGPTはコードを書くことができます。
コードを書いてもらう質問をしてみました。

1から10までを合計した値をメッセージで出力するVBAコードをください。

出てきたコードはこちらです。

Sub test()
    MsgBox "合計値は" & WorksheetFunction.Sum(1, 2, 3, 4, 5, 6, 7, 8, 9, 10) & "です。"
End Sub

実行してみましょう。

はい!しっかり機能していますね!!

タカヒロ
タカヒロ
いつもお使いのワークシート関数でセルにChatGPTの回答を出す方法についても別記事でまとめましたので、よろしければ併せてご参照ください。
Excelワークシート関数を使いChatGPTの回答を出力する方法!

ChatGPT APIと連携するVBAコードの説明

ChatGPT APIと連携するVBAコードについて説明をします。

ChatGPTへの質問内容を取得します。

strTextToPredict = Range("B1").Text

リクエスト先のURLを設定します。

apiUrl = "https://api.openai.com/v1/completions"

XMLHTTPオブジェクトをセットします。

Set objhttp = CreateObject("MSXML2.XMLHTTP")

リクエストのヘッダーを設定します。

.Open "POST", apiUrl, False
.setRequestHeader "Content-Type", "application/json"
.setRequestHeader "Authorization", "Bearer " & APIKey

リクエスト文を作成します。

strRequestBody = "{""model"":""" & strModel & """, ""prompt"":""" & strTextToPredict & """, ""max_tokens"":" & intMaxTokens & ", ""temperature"":0.5, ""top_p"":1}"

リクエストを送信します。

.send strRequestBody

APIからのレスポンスが返るまで待ちます。

Do While .readyState <> 4 DoEvents Loop

レスポンス情報をデバッグします。不要であれば削除してください。

Debug.Print .responseText

レスポンスのテキスト情報をExcel出力用変数に代入します。

strResponse = .responseText

Json形式のデータの内回答テキストがある位置から分割します。

temp = Split(strResponse, "\n\n")

配列数を取得します。

intCount = UBound(temp)

配列分処理を繰り返します。

For i = 1 To intCount Next i

最後の回答をセルに出力します。”\n”をセル内改行コードに変換し、”\”は追加されてしまうので除外しています。

temp2 = Split(temp(i), """,""")
Cells(i + 2, 2) = Replace(Replace(temp2(0), "\n", Chr(10)), "\", "")

最後の回答以外をセルに出力します。

Cells(i + 2, 2) = Replace(Replace(temp(i), "\n", Chr(10)), "\", "")

<追加>質問文に改行があると処理されない不具合を修正

以下のように質問文に改行があるとChatGPTへ渡されたときに処理されない不具合があることが判明しました。

そこで、以下のように修正し、質問内容に改行が含まれていても処理がされるようにしました。

■変更前

'ChatGPTへの質問内容を取得します。
strTextToPredict = Range("B1").Text

■変更後

'ChatGPTへの質問内容を取得します。
strTextToPredict = Replace(Range("B1").Text, Chr(10), "\n")

タカヒロ
タカヒロ
セル内改行コードを”\n”に置き換える処理を加えています。

コード全体です。

Sub 質問をChatGPTのAPIへ送るv1()
 
    Dim objhttp As Object
    Dim APIKey As String
    Dim strTextToPredict As String
    Dim strRequestBody As String
    Dim strResponse As String
    Dim strModel As String
    Dim temp As Variant
    Dim temp2 As Variant
    Dim i As Integer
    Dim intMaxTokens As Integer
    Dim apiUrl As String
    Dim intCount As Integer
 
    'APIキーを入力します。
    APIKey = "sk-***********************************************"
    
    'ChatGPTのAPIから出力される最大文字数を指定します。
    intMaxTokens = 1000
    
    'ChatGPT APIのモデルを指定します。
    strModel = "text-davinci-003"
 
    'ChatGPTへの質問内容を取得します。
    'strTextToPredict = Range("B1").Text
    strTextToPredict = Replace(Range("B1").Text, Chr(10), "\n")

    'リクエスト先のURLを設定します。
    apiUrl = "https://api.openai.com/v1/completions"
    
    'XMLHTTPオブジェクトをセットします。
    Set objhttp = CreateObject("MSXML2.XMLHTTP")
    
    With objhttp

        'リクエストのヘッダーを設定します。
        .Open "POST", apiUrl, False
        .setRequestHeader "Content-Type", "application/json"
        .setRequestHeader "Authorization", "Bearer " & APIKey
     
        ' リクエスト文を作成します。
        strRequestBody = "{""model"":""" & strModel & """, ""prompt"":""" & strTextToPredict & """, ""max_tokens"":" & intMaxTokens & ", ""temperature"":0.5, ""top_p"":1}"
        
        'リクエストを送信します。
        .send strRequestBody
        
        'APIからのレスポンスが返るまで待ちます。
        Do While .readyState <> 4
            DoEvents
        Loop

        'レスポンス情報をデバッグします。不要であれば削除してください。
        Debug.Print .responseText
     
        'レスポンスのテキスト情報をExcel出力用変数に代入します。
        strResponse = .responseText
    
    End With
    
    'Json形式のデータの内回答テキストがある位置から分割します。
    temp = Split(strResponse, "\n\n")
    
    '配列数を取得します。
    intCount = UBound(temp)

    '配列分処理を繰り返します。
    For i = 1 To intCount
        
        If i = intCount Then
            '最後の回答をセルに出力します。
            temp2 = Split(temp(i), """,""")
            Cells(i + 2, 2) = Replace(Replace(temp2(0), "\n", Chr(10)), "\", "")
        Else
            '最後の回答以外をセルに出力します。
            Cells(i + 2, 2) = Replace(Replace(temp(i), "\n", Chr(10)), "\", "")
        End If
        
    Next i
 
End Sub

実行してみましょう。

はい、問題ありませんね!

<追加>「GPT-3.5」版でExcelにChatGPTの回答を出力する

モデル「GPT-3.5」版でExcelにChatGPTの回答を出力する方法について追記します。

旧モデルと「GPT-3.5」版の違い

上記のモデルは、「text-davinci-003」というモデルで、品質が安定した最も有用なモデルといわれています。
ただしその分「GPT-3.5」よりはコストがかかるというディメリットがありました。

そこで、より気楽にコストが安く、さらに高機能に開発されたのが「GPT-3.5」です。
コストは「text-davinci-003」の10分の一で最も高性能で費用対効果の高いモデルとなっています。

タカヒロ
タカヒロ
※GPTのバージョンアップのスピードはほんと速いですね。。。がんばってついていきたいと思います!

モデル「GPT-3.5」のコード

モデル「GPT-3.5」のコードは以下の通りです。
Jsonで送るパラメータの形式がかなり変わっているのと、ユーザ指定が可能な構造になっていることがわかりますね。

Sub 質問をChatGPTのAPIへ送るv3_5T()
 
    Dim objhttp As Object
    Dim APIKey As String
    Dim strTextToPredict As String
    Dim strRequestBody As String
    Dim strResponse As String
    Dim strModel As String
    Dim temp As Variant
    Dim temp2 As Variant
    Dim i As Integer
    Dim intMaxTokens As Integer
    Dim apiUrl As String
    Dim intCount As Integer
    Dim StrMessages As String
 
    'APIキーを入力します。
    APIKey = "sk-****************************************"
    
    'ChatGPTのAPIから出力される最大文字数を指定します。
    intMaxTokens = 1000
    
    'ChatGPT APIのモデルを指定します。
    strModel = "gpt-3.5-turbo"
 
    'ChatGPTへの質問内容を取得します。
    strTextToPredict = Replace(Range("B1").Text, Chr(10), "\n")
    
    StrMessages = "[{""role"": ""user"", ""content"":""" & strTextToPredict & """}]"
    
    Debug.Print StrMessages
    

    'リクエスト先のURLを設定します。
    apiUrl = "https://api.openai.com/v1/chat/completions"
    
    'XMLHTTPオブジェクトをセットします。
    Set objhttp = CreateObject("MSXML2.XMLHTTP")
    
    With objhttp

        'リクエストのヘッダーを設定します。
        .Open "POST", apiUrl, False
        .setRequestHeader "Content-Type", "application/json"
        .setRequestHeader "Authorization", "Bearer " & APIKey
     
        ' リクエスト文を作成します。
        strRequestBody = "{""model"":""" & strModel & """, ""messages"":" & StrMessages & "}"

        'リクエストを送信します。
        .send strRequestBody
        
        'APIからのレスポンスが返るまで待ちます。
        Do While .readyState <> 4
            DoEvents
        Loop

        'レスポンス情報をデバッグします。不要であれば削除してください。
        Debug.Print .responseText
     
        'レスポンスのテキスト情報をExcel出力用変数に代入します。
        strResponse = .responseText
    
    End With
    
    'Json形式のデータの内回答テキストがある位置から分割します。
    temp = Split(strResponse, "content"":""")
    
    '配列数を取得します。
    intCount = UBound(temp)

    '配列分処理を繰り返します。
    For i = 1 To intCount
        
        If i = intCount Then
            '最後の回答を代入します。
            temp2 = Split(temp(i), """},")
             Cells(i + 2, 2) = Replace(Replace(temp2(0), "\n", Chr(10)), "\", "")
        Else
            '最後の回答以外を代入します。
             Cells(i + 2, 2) = Replace(Replace(temp(i), "\n", Chr(10)), "\", "")
        End If
        
    Next i

End Sub

VBAの実装手順

実装手順は以下の通りです。

Excel側にVBAを実装していきます。

①Excelを新規に開き、「開発」タブをクリックし、「VisualBasic」をクリックします。
もしくはショートカットキー「Alt」+「F11」でもOKです。

②標準モジュールを追加します。
左ペインのVBAProjectを右クリックし、「挿入」、「標準モジュール」を選択します。

③右ペインのウインドウに上記のVBAを入力します。

こちらで完了です。

VBAを実行する

では早速VBAの実行をしてみましょう。

①「開発」タブの「VBA」をクリックし実行したいマクロを選択し、「実行」をクリックします。

②処理がされたことが確認できれば完了です。

PythonでChatGPTの回答をExcelへ出力する方法

PythonでChatGPTの回答をExcelへ出力する方法について別記事にまとめました。
実はこちらの方がコードが短く済みます。
ご参考ください。

さいごに

いかがでしょうか。

今回は、

・ExcelにChatGPTの回答を出力する方法
・Excel VBAを使いChatGPT APIと連携する方法

についてまとめました。

また、他にも便利な方法がありますので、よろしければご参照頂ければと思います。



この記事の関連キーワード

こちらの記事の関連キーワード一覧です。クリックするとキーワードに関連する記事一覧が閲覧できます。









8 件のコメント

  • 「返信する」が動かないので、この形で書き込ませていただきます。
    Excel VBA: 問題なし
    VB.Netフォームアプリ:エラー。CreateObjectがうまく動かない。
    VB.Netフォームアプリケーション:問題なし。
    ということで解決しました。お騒がせしてすみませんでした。

    タカミザカさんの質問ですが、改行キーかもしれません。

    • 解消されたようでよかったです。

      またアドバイスありがとうございます。
      こちらでも検証をしてみたいと思います。

  • こんにちは。
    .Open(“POST”, apiUrl, False) の場所でエラーが出ます。
    System.MissingMemberException: ‘Public member ‘Open’ on type ‘IServerXMLHTTPRequest2′ not found.’
    よろしかったら、原因を教えてください。

    • ご質問ありがとうございます。

      エラーメッセージは、IServerXMLHTTPRequest2インターフェイスのOpenメソッドが見つからなかったという内容ですので、
      MSXMLライブラリがないか古いバージョンである可能性があります。
      まずは、Windows10以降の環境で検証いただきたくお願いいたします。
      なお、Macの場合はサポート外となりますことご了承ください。

  • マクロ動かしても反応がないので、帰ってきてるものを除くと↓
    We could not parse the JSON body of your request. (HINT: This likely means you aren’t using your HTTP library correctly. The OpenAI API expects a JSON payload, but what was sent was not valid JSON. If you have trouble.
    調べてみても「”」が違うとかいくつか説はあったものの、解決には至らず。
    知見をお借りしたいです

    • いつもご利用ありがとうございます。

      APIからのレスポンスがうまくいかない件ですが、メッセージの内容からJSON本文が解析できないとありますので、
      正しいJSONフォーマットで送信されていない可能性があります。
      その要因としては日本語が文字化けを起こしている、特殊記号が使われている、Macなど文字コードがwindowsと異なるなど考えられます。
      一度英文などで日本語を外した最小限の質問文にし、strRequestBodyの中身をご確認いただけますでしょうか。

  • お世話になります。
    本件、最新の技術に簡単に触れられてめっちゃためになります。

    ところで「apiUrl」の変数定義が無いようですがあえてですか?
    大した問題ではありませんが。

    • いつもご利用ありがとうございます。

      すみません、「apiUrl」の変数定義は単純に抜け漏れです…
      記事のコードも修正させていただきました。

      Excel&ChatGPTネタは他にもあり、また今後も追加する予定ですので、
      ご参考いただければと存じます。

  • コメントを残す

    メールアドレスが公開されることはありません。 * が付いている欄は必須項目です