Excel VBAで会話するChatGPT

第2回

ChatGPT APIへリクエスト実行してレスポンスを取得しよう

 この記事はインプレス刊『生成AIをWord&Excel&PowerPoint&Outlookで自在に操る超実用VBAプログラミング術』(近田伸矢 著/古川渉一 監修)の一部を編集・転載しています(編集部)

『生成AIをWord&Excel&PowerPoint&Outlookで自在に操る超実用VBAプログラミング術』

 ChatGPTやDALL-Eなどの生成AIを身近に感じる機会がグッと増えていると感じる方は多いのではないでしょうか? 中でもマイクロソフト社の「Copilot Pro」や「Copilot for Microsoft 365」など、生成AIをWordやExcel、PowerPoint、Outlookなどで活用できるサービスが大きな注目を集めているようです。

 Officeアプリ上で生成AIを活用する方法は、こうしたサービスだけではありません。それが各生成AIをVBAプログラミングでコントロールする方法です。書籍『生成AIをWord&Excel&PowerPoint&Outlookで自在に操る超実用VBAプログラミング術』では、そんなプログラミング術を余すことなく解説しています。ここではその可能性を感じてもらうべく、ExcelとChatGPTを連携するプログラミング方法を紹介しましょう。

サンプルファイル(ZIP形式:47KB)


※右クリックメニューからダウンロードしてください

ChatGPT API へのリクエストとレスポンス取得

 構築したリクエストボディを使用してChatGPT APIをコール、リクエストを送信します。この処理には、MSXML2.XMLHTTPを使用します。MSXML2.XMLHTTPはMicrosoft XML Core Services (MSXML)の一部として提供されるオブジェクトで、HTTPを経由してデータを送受信することができます。XMLデータの取得やWebサービス、APIへのリクエストにおいて用いられることが多く、今回のようにVBAを用いてWebAPIを呼び出すシーンで重宝します。

 XMLHTTPオブジェクトは、非同期または同期モードで動作することができます。非同期モードでは、リクエストがバックグラウンドで送信され、VBAの実行が待機することなく進行します。一方、同期モードでは、リクエストのレスポンスが返ってくるまでVBAの実行が一時停止します。これらは引数(非同期:True、同期:False)で指定しますが、引数を省略すると、非同期(True)として実行されます。

サンプル03-09.txt
【Column】ChatGPT APIの応答処理に注意

 ChatGPTの応答が時折、数分~数十分遅れることがあります。その際、同期でPOSTしていた場合は、Excelは操作不能となり、フリーズしたかのような画面となります。この問題を解決するため、非同期でPOSTを実行し、レスポンス待ちの間にDo Loopで待機するようにしています。指定された秒数以上レスポンスが遅れた場合には、リクエストを自動的に再送する仕組みを実装することで無駄な待ち時間の解消を図っています。さらに、待機ループ中にDo Eventsを使って一時的にOSに制御を渡すことで、[Esc]キーを押してマクロを簡単に停止させることも可能にしています。

待機中に[Esc]キーを押すことで、マクロの実行を停止することができる

JSON 形式データから回答を抽出する

  • リクエスト(質問):こんにちは
  • レスポンス(回答):こんにちは! 何かご用件はありますか?

 このようなやり取りを行った際、ChatGPTのAPIからの返答は“Response.Text”という形で、JSON形式の文字列として返されます。取得したい情報は回答部分ですが、この回答部分は、「content": "」と「"改行 },」に挟まれています。この2つの目印を使用して、回答テキストをJSONから抽出することができます。

Response.Text の例
{"model":"gpt-4-1106-preview","messages":[{"role":"user","content":"こんにちは"}],"max_tokens":2000,"temperature":0.2,"top_p":1}
{
    "id": "chatcmpl-8JW1IfTozKgVTHjYymSoY6qjUgUiD",
    "object": "chat.completion",
    "created": 1699662008,
    "model": "gpt-4-1106-preview",
    "choices": [
        {
            "index": 0,
            "message": {
            "role": "assistant",
            "content": "em|s|こんにちは! 何かご用件はありますか"
    },
    "finish_reason": "stop"
    }
]

 また、エラーが返ってきた場合も想定する必要があります。エラーの場合は次のようなレスポンステキストが返ってきます。まず、「"error": {」の有無を確認し、エラーの場合は、「"message": "」と「",」の間にあるメッセージを抽出するようにします。

エラーで帰ってきたResponse.Text の例
{
    "error": {
        "message": "em|s|The model `gpt-1` does not exist or you do not have access to it. Learn more: https://help.openai.com/en/articles/7102672-how-can-i-access-gpt-4.",
        "type": "invalid_request_error",
        "param": null,
        "code": "model_not_found"
    }
}

 JSON形式のレスポンスデータを解析します。回答(またはエラー)内容を取得するため、目印となる文字列を探し出し、それ基点としたテキストを抽出します。

サンプル03-10.txt

SetGPTmodel プロシージャの作成

 ChatGPTモデルの設定に使用するプロシージャです。このプロシージャで設定されたモデルは、ChatGPT関数呼び出し時にモデルが指定されていない場合のデフォルト値として機能します。モデル名を格納する変数「GPTmodel」は、GPTモジュールの最初にPublic変数として宣言されているため、プロシージャの実行後もその値は保持されます。これにより、ChatGPT関数の各呼び出しで毎回モデルを指定する必要がなくなり、効率的にコードを記述することができます。

サンプル03-11.txt
生成AIをWord&Excel&PowerPoint&Outlookで自在に操る超実用VBAプログラミング術

    書籍目次
  • 【価格】2,530円(本体2,300円+税)
  • 【発売日】2024年2月7日(水)
  • 【ページ数】336ページ
  • 【著者】近田伸矢/監修】古川渉一
  • 【サイズ】A5判
  • 【目次】
     第1章:生成AIを操るVBAの基礎知識
     第2章:知っておきたい生成AIの基本
     第3章:VBAで会話する(ChatGPT)
     第4章:VBAで画像を生成する(DALL-E)
     第5章:VBAで自然言語処理を行う(Embeddings)
     第6章:生成AIのAPIをユーザー定義関数として使用する
     第7章:すぐ使える! PowerPointマクロと生成AIの連携レシピ
     第8章:すぐ使える! Wordマクロと生成AIの連携レシピ
     第9章:すぐ使える! Outlookマクロと生成AIの連携レシピ
     第10章:すぐ使える! Excelマクロと生成AIの連携レシピ