残業を減らす!Officeテクニック

ExcelでChatGPTを呼び出す関数を徹底解説 ~使い方から仕組みまで

ユーザー定義関数「ChatGPT」を作成して、ChatGPTからの回答を呼び出した

 以前の記事で、GoogleスプレッドシートにChatGPTの回答を表示させる操作を紹介しました。Excelにも同様のアドインがあれば手軽に使えるのですが、本稿執筆時点で公開されていません。

 そんな折、こちらのWebサイトにて「ChatGPT3.5をExcelワークシート関数として使用する」という記事を紹介していただいたので試してみました。

デジィEXP氏の運営するWebサイト。Excelのマクロを公開している

 VBAで「ユーザー定義関数」を作成して、ワークシートから呼び出すことで、一般的な関数を入力する手軽さで、ChatGPTの回答をワークシート上に表示可能になります。デジィEXP氏の記事には、コピペOKのコードが掲載されていますが、VBAに馴染みがないと試しにくいでしょう。今回は、注意したいポイントを補足して、操作手順を紹介したいと思います。

APIキーの取得

 まずはExcelからChatGPTへアクセスするためのAPIキーを取得しますが、ChatGPTを利用するためのOpenAIアカウントは作成済みとして話を進めます。未作成の方は以前の記事を参考に作成しておいてください。

 なお、APIの無料枠上限に達していたり、有効期限が切れていたりする場合は、これから作成するユーザー定義関数の結果がエラーとなります。usageのページを確認してみましょう。

 今後もAPIを利用するなら従量課金の有料プランを検討してもいいと思います。本稿執筆時点で最新の「gpt-3.5-turbo」でも、1,000トークンあたり0.002米ドルです。

APIの無料枠が期限切れになっている場合は、これから作成するユーザー定義関数が動作しない

 API Keysのページに自分のOpenAIアカウントでログインした状態で操作します。生成したAPIキーはメモ帳などにコピー&ペーストしておきます。ただし、APIキーが漏洩すると、無断で利用されて料金発生の原因になるので厳重に管理してください。

APIキーはAPI Keysのページから取得可能。自分のOpenAIアカウントでログインしておこう。[Create new secret key]をクリックする
生成されたAPIキーをコピーする。いったんメモ帳などにコピー&ペーストしておく

Excelの準備

 VBAのコードを記述するため、Excelで新規ファイルを作成して任意のファイル名を指定し、[Excelマクロ有効ブック(*.xlsm)]で保存しておきます。また、[Excelのオプション]から[開発]タブを表示しておくと便利です。

任意のファイル名を指定して[Excelマクロ有効ブック(*.xlsm)]で保存しておく。ここでは「ChatGPT_test.xlsm」とした
[ファイル]タブにある[オプション]をクリックして[Excelのオプション]を開く。[リボンのユーザー設定]画面を表示し、[開発]にチェックを付けておく

 文章で質問することとChatGPTからの回答文を踏まえて、セルを広げて[折り返して全体を表示する]を有効にしておきます。また、これから作成するユーザー定義関数をワークシートに入力して確定すると、その都度リクエストとレスポンスが発生します。[計算方法]を[手動]にしておくことをおすすめします。

質問と回答に利用するセルを広げて[折り返して全体を表示する]を有効にしておく
[数式]タブから[計算方法]を[手動]にしておく

VBAコードの入力

 [開発]タブから「Visual Basic Editor」(VBE)の画面を起動して、標準モジュールを追加します。混乱を避けるために作業中のExcelのウィンドウ以外は閉じておくといいでしょう。

[開発]タブの[Visual Basic]をクリックする
VBEの画面が起動した。作業中のファイルを選択して、[挿入]-[標準モジュール]の順にクリックする
標準モジュール(Module1)が追加された。ウィンドウのサイズは適宜調整しておく。最大化してもいい

 あとは「ChatGPT3.5をExcelワークシート関数として使用する」からコードをコピー&ペーストし、「strAPIKey = ""」の2つある「"」の間に用意しておいたAPIキーを入力して上書き保存するだけです。前後の「"」を消去しないように注意してください。

上記のコードをコピー&ペーストし、「strAPIKey = ""」の2つある「"」の間に用意しておいたAPIキーを入力して上書き保存する。VBEの画面は閉じて構わない

コードの意味

 コードの意味を簡単に説明します。「Function ChatGPT(strText As String, Optional strSystem As String) As String」は「ChatGPT」という名前のユーザー定義関数を定義するという意味。ワークシートに表示される(ユーザー)関数名が連動することを覚えておきましょう。

 ワークシートに「ChatGPT」関数を入力する際、引数として指定する値が変数「strText」と「strSystem」にセットされます。「strSystem」はオプション扱いなので省略可能。「Dim~As」はここで利用する変数の宣言です。

「Function ChatGPT(strText~」はユーザー定義関数の定義。「Dim~As」は利用する変数の宣言

 「'ChatGPTの設定」以降の5行は、ChatGPTへ渡すパラメーターの値の設定です。ここでは、トークン数「1000」、モデル「gpt-3.5-turbo」、ポスト先「https://api.openai.com/v1/chat/completions」、厳密さ「1」とセットしています。

「'ChatGPTの設定」以降の5行はChatGPTへ渡すパラメーターの値の設定

 「'文字列内の改行削除」の下2行で質問文に含まれる改行を削除します。「Set objHttp = CreateObject("MSXML2.XMLHTTP")」は、VBAでHTMLページを参照する際の定型句と考えてください。

「'文字列内の改行削除」の下2行で質問文に含まれる改行を削除。「Set objHttp = CreateObject("MSXML2.XMLHTTP")」は、VBAでHTMLページを参照する際の定型句

 「'ヘッダー設定」と「'リクエスト」に続くコードは既定の形式をVBAの様式に当てはめています。

「'ヘッダー設定」と「'リクエスト」は既定の形式をVBAの様式に当てはめている

 リクエストやパラメーターなどについて詳しく知りたい場合は、ChatGPTのAPIのリファレンスに掲載の情報を参照してください。

リクエストやパラメーターなどについて詳しく調べたいときは、ChatGPTのAPIのリファレンスを参照しよう

 「Debug.Print strRequest」と「Debug.Print .ResponseText」はなくても動作しますが、リクエストとレスポンスの確認に利用できます。興味がある方は、ChatGPT関数の利用後に、VBEの画面で[表示]-[イミディエイトウィンドウ]を選択して、イミディエイトウィンドウを表示してみてください。例えば、以下のようなレスポンスの結果が出力されます。

{"id":"chatcmpl-74QiBvf964OGq0VxaQOaxP8MabXCc","object":"chat.completion","created":1681290347,"model":"gpt-3.5-turbo-0301","usage":{"prompt_tokens":28,"completion_tokens":478,"total_tokens":506},"choices":[{"message":{"role":"assistant","content":"VLOOKUP関数は、Excelの関数の1つで、指定した値を検索して、対応する行または列から指定されたセルの値を取得するために使用されます。\n\nVLOOKUP関数の構文は以下の通りです。\n```\n=VLOOKUP(検索値, テーブル範囲, 列番号, [一致型])\n```\n\n・検索値:検索したい値(文字列、数値、セル参照)を指定します。\n・テーブル範囲:検索対象となる範囲を指定します。\n・列番号:テーブル範囲内の取得したい列の番号を指定します。\n・一致型:オプションです。検索値と一致する値の取得方法(近似値、完全一致など)を指定します。\n\n例えば、「商品コード」と「商品名」が書かれた表から、ある商品コードに対応する商品名を取得したい場合、以下のようにVLOOKUP関数を使用します。\n\n```\n=VLOOKUP(A2, B2:C10, 2, FALSE)\n```\n\nこの場合、「A2」には検索したい商品コードが入力されており、「B2:C10」には商品コードと商品名が書かれた表が指定されています。そして、「2」と指定することで、商品名の列を指定しています。「FALSE」と指定することで、完全一致の検索を行います。\n\nVLOOKUP関数は、Excel上でよく使用される関数の1つであり、大量のデータを処理する場合などで効果的に活用できます。"},"finish_reason":"stop","index":0}]}

 「'Jsonからテキストを取得」以降で、回答文だけを取り出す処理の内容を理解しやすくなります。

「'Jsonからテキストを取得」でレスポンスから回答分だけを取り出している

ユーザー定義関数「ChatGPT」の利用

 作成したユーザー定義関数「ChatGPT」を使ってみましょう。一般的な関数と同じように「=ChatGPT(」と入力して、質問を入力したセルを参照します。まずは質問だけ指定してオプションの役割は省略してみます。

セルA1には質問を入力しておく。セルA2に「=ChatGPT(A1)」を入力する
ChatGPTからの回答が表示された。実行するたびに回答は変わる

 役割を指定すると回答の雰囲気は変わります。以下は微妙な回答ですが、ChatGPTもこれから成長していくのでしょう。

セルA1の質問は変えずに、セルB1に役割を指定する。セルA2に「=ChatGPT(A1,B1)」を入力する
先ほどとは異なる雰囲気の回答が表示された