業務効率最大化!ChatGPTを呼び出すExcelマクロの作成

ChatGPTをExcelから使う

ChatGPTを利用して、業務や日常のさまざまな作業を効率化することができる。通常、ChatGPTはウェブ上のチャット形式で利用することが多いが、Excelから直接呼び出せるようになるとさらに便利である。

たとえば、質問をExcelでリスト化し、ChatGPTへ一括で問い合わせることができれば、ChatGPTとチャットする手間をなくせるので、業務は大幅に効率化できる。

本記事では、Excelマクロ(VBA)を使用して OpenAI の API を呼び出し、ChatGPTをExcelから活用するExcelマクロファイルを公開する。

この記事で得られること
  • ChatGPTをExcelから利用できる、マクロ付きExcelファイルのダウンロード。
  • ChatGPT(OpenAI API)をExcelから利用する、マクロ(VBA)の実装方法の理解。

マクロ付きExcelファイルは、下のリンクからダウンロードして即利用可能である。マクロのVBAコードも解説しているので、マクロを改造したい人や、マクロを学習したい人には参考になるはずだ。

目次

ChatGPTをExcelから使うメリット

ChatGPTをExcelから呼び出すことによって、以下のようなメリットが得られる。

大量のデータを一括処理

Excelで質問をリスト化し、それを一括でChatGPTに送信することができる。これにより、1つ1つの質問を手動でチャットする手間が省け、業務効率が大幅に向上する。これは、大量のデータ解析やテキスト生成を行う際に非常に便利である。

自動化による時間短縮

マクロを使用すれば、定型作業を自動化することが可能である。これにより、同じ作業を繰り返し行う必要がなくなり、作業時間の短縮が期待できる。特に、ルーチンワークでの活用が効果的である。

ChatGPTの力をビジネスに応用

ChatGPTの自然言語処理能力をビジネスで活用できる。たとえば、カスタマーサポートの自動化、マーケティング文書の生成、技術文書の作成補助など、様々な場面で力を発揮する。

ChatGPT(OpenAI API)を呼び出すExcelマクロファイル

このExcelマクロでできること

この記事で紹介するマクロ付Excelファイルは、Excel上の質問リスをChatGPTに一括で問い合わせるという、シンプルなものである。

ChatGPTを利用するマクロ付Excelファイル

マクロファイルは下のダウンロードリンクで公開しているので、マクロ(VBA)そのものを一からコーディングする必要はない。また、マクロ本体のモジュールも非表示にしていないので、適宜アレンジを加え、自分流に使いやすくすることも可能だ。

Excelマクロファイルの利用方法

公開するマクロ付Excelファイルの使い方は以下の通り。

1. ファイルのダウンロード

以下のボタンを押して、マクロ付きのExcelファイル(CallGPT.zip)をダウンロードする。

ダウンロードしたZIPファイルは、任意のフォルダに展開しておく。

2. マクロ実行に必要な準備

OpenAI APIキーの取得

OpenAIの公式サイトからAPIキーを取得する。
APIキーは、ChatGPTにマクロなどプログラムからアクセスするために必要である。

マクロが実行できることの確認

ダウンロードしたExcelファイルを開いた時、「このファイルのソースが信頼できないため、Microsoftによりマクロの実行がブロックされました」というメッセージが表示された場合は、以下の記事を参考に対処する。

Excel VBA環境のセットアップ

この操作は、ダウンロードしたマクロファイルを自分で修正する場合に必要である。
Excelの「開発」タブを有効化し、VBA(Microsoft Visual Basic for Application)エディタにアクセスできるようにする。

3. ファイルの使い方

ダウンロードしたファイルの利用方法は以下。

STEP
パラメータの設定

ダウンロードしたExcelファイルを開き、シート「Parameter」を選択して、次の値を設定する。

OpenAI API Key(必須)

OpenAIの公式サイトから入手したAPIキーを入力する。

AI Model

利用するGPTのモデルを文字列で入力する。利用できるモデルは、OpenAIの公式サイト「Models」で公開されている。省略時のデフォルトは「gpt-4-turbo」(ChatGPT 4 相当)である。

Max Tokens

1回の質疑応答で使用するトークンの最大数を指定する。トークンを増やすと、質問の文字数を増やしたり、より詳細な回答を得ることができる。トークンの上限は利用するAIモデルによって異なり、「Models」に記載がある。また、トークン数の数え方はOpenAIの公式サイト「Managing tokens」で説明されている。省略時のデフォルトは4096トークンとしてある。

STEP
質問リストに質問を記入する

ワークシート「QA」に質問を入力する。入力する列は次の2列。

質問

質問文を入力する。セル内で改行してもよい。

専門家・役割

GPTの「役割」(何の専門家なのか)を入力する。役割を明確に指定することで、GPTはその分野の専門家として振る舞うようになり、的確な回答を得やすくなる。
「役割」の具体的な解説は、以下の記事を参照。

STEP
ChatGPTに質問を一括送信

ワークシート「QA」の1行目にある「GPTに送信」ボタンを押すと、ChatGPTに質問が上から順に送られる。
ChatGPTから得られた回答は、列「GPTの回答」に出力される。
全ての質問と回答の処理が終了すると、ダイアログメッセージ「全ての処理が終了しました」が表示される。

「AI Model」で指定するモデルにもよるが、一つの質問の応答を得るのに数秒~数十秒かかる。質問の件数が多いと処理がなかなか終了しないので、一度に大量の質問を処理しない方がよい。

ChatGPTを呼び出すExcelマクロの作成方法

ChatGPTを呼び出すExcelマクロ(VBAコード)の作成方法について、本記事で紹介しているマクロ付Excelファイル CallGPT.xlsm を例に解説していく。

マクロを作成するためのVBAエディタを開くには、[Alt]+[F11]キーとするか、Excelのメニュータブ「開発」より「Visual Basic」を選択する。

Excelの「開発」タブとVisual Basic

モジュールの構成

CallGPT.xlsm のVBAコードは、2つのモジュール ModuleGPT と ClassGPT に実装されている。

ModuleGPT

メイン処理となるプロシージャ「ExecGPT」が実装されている標準モジュール。

ClassGPT

ChatGPTと通信する関数が実装されているクラスモジュール。

ModuleGPT内のExecGPTから使用される。ChatGPTと通信するコードは今後、他のマクロファイルで再利用することを考えているため、クラスモジュールとした。

モジュールの追加方法

標準モジュールまたはクラスモジュールをマクロに追加するには、次のように操作する。

  • VBAエディタの「プロジェクト」下の「Microsoft Excel Objects」上で右クリックする。
  • メニュー「挿入」より、標準モジュールまたはクラスモジュールを選択する。
マクロにモジュールを挿入する
  1. 追加したモジュールの「プロパティ」ウィンドウの「オブジェクト名」より、オブジェクト名を変更する。
マクロのモジュール名を変更する

ModuleGPT

ExecGPT プロシージャ

ワークシート「QA」上にあるボタン「GPTに送信」に紐付いているプロシージャ。

ワークシート「QA」の質問リストを、上から1行づつ読み取り、値が存在する最終行まで、以下の繰り返し(ループ)処理を行う。

  1. 列「質問」と「専門家・役割」の値を読み取る。
    「質問」が空白でない場合に、以下の処理を続ける。
  2. クラス ClassGTP(変数名GPT) に実装されている関数 GptAPI を呼び出す。
  3. GptAPI から得られた回答をワークシート「QA」に出力する。エラーが発生していた場合はエラーメッセージを出力する。
'--- 定数の定義 ---
'行番号
Private Const ROW_START As Long = 3         'シートQAの開始行

'列番号
Private Const COL_QUESTION As Integer = 1   '質問
Private Const COL_SPECIALTY As Integer = 2  '専門家・役割
Private Const COL_ANSWER As Integer = 3     'GPTの回答

'GPTと通信するクラス
Private GPT As ClassGPT

'-------------------------------------------------------------
' 質問リストの質問をChatGPTに送り、回答を出力するプロシージャ
'-------------------------------------------------------------
Public Sub ExecGPT()

    On Error GoTo Err_ExecGPT

    Dim wsQA As Worksheet       'ワークシート
    Dim lngRow As Long          'Excelの行番号
    Dim strQuestion As String   '質問文
    Dim strSpecialty As String  '役割
    Dim strAnswer As String     'GPTの回答
    Dim strMessage As String    'メッセージ

    'GPTと通信するクラスの生成
    Set GPT = New ClassGPT
    
    If GPT.OpenAIAPIkey = "" Then
        Set GPT = Nothing
        Worksheets("Parameter").Activate
        Worksheets("Parameter").Range("APIKEY").Select
        MsgBox "APIキーを設定してください。", vbExclamation
        Exit Sub
    End If

    'ワークシート"QA"を変数に格納
    Set wsQA = Worksheets("QA")
    
    '質問リストを最終行まで繰り返処理する(ループ処理)
    For lngRow = ROW_START To wsQA.Cells(ROW_START, 1).SpecialCells(xlLastCell).row
        
        '質問文の取得
        strQuestion = Trim(wsQA.Cells(lngRow, COL_QUESTION).Value)
        
        '質問文が空白以外を処理する
        If strQuestion <> "" Then
            
            '役割の取得
            strSpecialty = Trim(wsQA.Cells(lngRow, COL_SPECIALTY).Value)
            
            'GPTのAPIに質問を送信
            If GPT.GptAPI(strSpecialty, strQuestion, strAnswer, strMessage) = 0 Then
                '正常終了、且つエラーメッセージ無しの時
                If strMessage = "" Then
                    'GPTからの回答を出力
                    wsQA.Cells(lngRow, COL_ANSWER).Value = strAnswer
                Else
                    'メッセージ有りの時、メッセージを出力
                    wsQA.Cells(lngRow, COL_ANSWER).Value = strMessage
                End If
            ElseIf strMessage <> "" Then
                'エラーメッセージ有りの時、エラーメッセージを出力
                wsQA.Cells(lngRow, COL_ANSWER).Value = strMessage
            End If
        End If
    
    Next

    'クラスの開放
    Set GPT = Nothing
    
    MsgBox "全ての質問を処理しました。", vbInformation
    
    Exit Sub

'エラー発生時
Err_ExecGPT:

    MsgBox Err.Description, vbCritical
    Set GPT = Nothing

End Sub

ClassGPT

Class_Initialize プロシージャ

ClassGPTを初期化する際に自動的に呼ばれるプロシージャ。他のプロシージャや関数が

Set GPT = New ClassGPT

と、ClassGPTをインスタンシング(オブジェクト生成)する時に自動的に呼び出される。

このプロシージャでは、以下の処理を行っている。

OpenAI APIにHTTPリクエストを行うためのオブジェクト(objHttp)の生成

“MSXML2.XMLHTTP”は、Microsoft XML(MSXML)ライブラリの一部で、HTTPリクエストを行うためのオブジェクトである。これを使用すると、VBAからHTTPプロトコルを介してウェブサーバにリクエストを送信し、応答を取得することができる。

OpenAI APIをコールする時に必要となる、APIキーなどのパラメータの設定

ワークシート「Parameter」のセルから値を読み取り、パラメータ用の変数にセットする。

'OpenAI APIサイトのURL
Private Const strURL As String = "https://api.openai.com/v1/chat/completions"

'HTTPリクエストを行うためのオブジェクト
Private objHttp As Object

'OpenAI API用のパラメータ
Private OpenAIAPIkey As String      'OpenAI APIキー
Private MaxTokens As Long           'Max Tokens
Private AIMODEL As String           'AI Model


'このクラスの初期化
Private Sub Class_Initialize()
    
    On Error GoTo Err_Class_Initialize
    
    Dim wsParameter As Worksheet
    Dim tmp As String
    
    'HTTPリクエストを行うためのオブジェクトを生成
    Set objHttp = CreateObject("MSXML2.XMLHTTP")
    
    '--- ワークシート"Parameter"の値を読み取り、ChatGPTを設定 ---
    
    Set wsParameter = Worksheets("Parameter")
    
    'OpenAI API key(省略不可)
    OpenAIAPIkey = Trim(wsParameter.Range("APIKEY").Value)
    
    'AI Model
    AIMODEL = Trim(wsParameter.Range("AIMODEL").Value)
    If AIMODEL = "" Then
        AIMODEL = "gpt-4-turbo" '省略時のデフォルト
    End If
    
    'Max Tokens
    tmp = Trim(wsParameter.Range("MaxTokens").Value)
    If IsNumeric(tmp) Then
        MaxTokens = CLng(tmp)
    Else
        MaxTokens = 4096        '省略時または無効な数値の時のデフォルト
    End If
    
    Exit Sub

'エラー発生時
Err_Class_Initialize:

    MsgBox Err.Description, vbCritical

End Sub

GptAPI 関数

質問をOpenAI APIにリクエストし、回答を取得する関数。ModuleGPT の ExecGPT プロシージャから呼び出される。

  • OpenAIのAPIのサイトURLは “https://api.openai.com/v1/chat/completions”。ClassGPTの共通ローカル変数として、クラスモジュールの先頭部分で宣言している。
  • HTTPリクエストはJson形式で送信する必要があるため、Json文字列を編集して変数 strRequest にセットしている。
  • OpenAIからの回答もJsonなので、responseTextで受信したJson文字列から、”content:” に続く文字列を探し出し、回答文を抜き出す文字列編集をしている。
'-------------------------------------------------------------
' 指定した質問文字列をChatGPTにリクエストし回答文字列を取得する
' strSystem     : GPTの役割(省略可)
'  Question      : GPTに送信する質問文。
'  Answer(戻り値): GPTからの回答文。エラー発生時はNull。
' ErrMsg(戻り値): エラー発生時、エラーメッセージがセットされる。
'  GptAPI(戻り値): 0 正常終了、0以外 エラー発生時のエラー番号
'-------------------------------------------------------------
Public Function GptAPI(ByVal strSystem As String, _
                       ByVal Question As String, _
                       ByRef Answer As String, _
                       ByRef ErrMsg As String) As Long
    
    '戻り値の初期化
    Answer = ""
    ErrMsg = ""
 
    On Error GoTo Err_GptAPI
 
    Dim strText As String
    Dim strRequest As String, strRspns As String, strTemp As String, strW As String
    Dim p1 As Long, p2 As Long
 
    strText = Question
    
    '文字列内のエスケープ
    strText = PadQuotes(strText)
    
    With objHttp
        
        'ヘッダー設定
        .Open "POST", strURL, False
        .setRequestHeader "Content-Type", "application/json"
        .setRequestHeader "Authorization", "Bearer " & OpenAIAPIkey
        
        'リクエスト
        strRequest = "{"
        strRequest = strRequest & " ""model"":""" & AIMODEL & ""","
        strRequest = strRequest & " ""messages"": ["
        strRequest = strRequest & "{""role"":""system"", ""content"": """ & strSystem & """}, "
        strRequest = strRequest & "{""role"":""user"", ""content"": """ & strText & """}] ,"
        strRequest = strRequest & " ""max_tokens"": " & MaxTokens & ", "
        strRequest = strRequest & " ""temperature"": 0 "
        strRequest = strRequest & "}"
        
        'GPTのAPIに送信
        .send strRequest
        
        'GPTからの応答を取得
        strRspns = .responseText
    
    End With
    
    'Json文字列から回答部分のテキストを取得
    p1 = InStr(strRspns, "content"":") + 11
    p2 = InStr(p1, strRspns, """,") - p1
    strTemp = Mid(strRspns, p1, p2)
    
    '改行のエスケープ
    strTemp = Replace(Replace(strTemp, "\n\n", vbLf), "\n", vbLf)
    
    'バックスラッシュのエスケープ
    strTemp = Replace(Replace(strTemp, "\""", """"), "\\", "\")
    
    '空白文字の除去
    strTemp = Trim(strTemp)
    
    '正常終了時、戻り値をセット
    Answer = strTemp
    GptAPI = 0
 
    Exit Function
        
'エラー発生時
Err_GptAPI:
    
    GptAPI = Err.Number
    ErrMsg = Err.Description
 
End Function

strRequest変数に設定している文字列が、OpenAI APIに送信するJson文字列である。この文法やパラメータの解説は、OpenAIの公式サイト「API reference documentation」で解説されている。英語なので少々難しいかもしれないが、参考にして適宜修正して欲しい。難しければ、無理に修正する必要はない。

PadQuotes 関数

OpenAI API に送信する文字列のエスケープを行う関数。GptAPI関数の中から呼び出される。

OpenAI APIに文字列を送信する際、改行文字やタブ文字はそのままでは送れないので、APIが処理できる文字にエスケープ(文字の無効化)する。この関数では、以下の通りに文字を置換している。

  • スラッシュ(/) → \\
  • 改行(Cr+Lf) → \n
  • 改行(Cr) → \r
  • 改行(Lf) → \f ※Excelのセル内の改行文字
  • タブ → \t
  • ダブルクォート → \”

改行文字のエスケープについて、Excelの場合、セル内の改行文字は「Lf」なので、Lfだけエスケープすれば十分である。しかし、PadQuotes 関数を汎用的に使えるようにするため、他の文字もエスケープ処理している。

'-------------------------------------------------------------
' 文字列のエスケープ
' s                : 変換対象の文字列
'  PadQuotes(戻り値): エスケープ処理された文字列
'-------------------------------------------------------------
Private Function PadQuotes(ByVal s As String) As String

    If InStr(s, "\") > 0 Then
        s = Replace(s, "\", "\\")
    End If

    If InStr(s, vbCrLf) > 0 Then
        s = Replace(s, vbCrLf, "\n")
    End If

    If InStr(s, vbCr) > 0 Then
        s = Replace(s, vbCr, "\r")
    End If

    If InStr(s, vbLf) > 0 Then
        s = Replace(s, vbLf, "\f")
    End If

    If InStr(s, vbTab) > 0 Then
        s = Replace(s, vbTab, "\t")
    End If

    If InStr(s, """") > 0 Then
        PadQuotes = Replace(s, """", "\""")
    Else
        PadQuotes = s
    End If

End Function

Class_Terminate プロシージャ

ClassGPTを廃棄する時に自動的に呼ばれるプロシージャ。他のプロシージャや関数が

Set GPT = Nothing

と、ClassGPTを廃棄した直後に自動的に呼び出される。

通常、このプロシージャの中には、メモリに滞留しそうなオブジェクトを廃棄するためのコードを記述する。

このマクロでは “MSXML2.XMLHTTP” で生成したオブジェクトを廃棄しているが、必須ではない。

'このクラスの廃棄
Private Sub Class_Terminate()
    Set objHttp = Nothing
End Sub

まとめ:ChatGPTをExcelから呼び出すマクロ

ChatGPTをExcelから利用すれば、業務の効率化が期待できる。OpenAI APIをVBAから呼び出すことで、大量のデータを一括処理したり、定型作業を自動化することが可能になる。ExcelとChatGPTの組み合わせにより、さまざまなビジネスシーンでの活用が広がるだろう。

今回紹介したマクロは、OpenAI APIをVBAから呼び出すための基本的なVBAコードである。ChatGPT への質問を一括処理するなら、そのまま利用することが可能だ。マクロの知識を持つ人であれば、応用・発展させることもできる。

是非、今回紹介したマクロを利活用し、Excel + ChatGPT での作業をさらにパワフルに進めてほしい。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

コメント

コメントする

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください

目次