SAPテーブルの項目解説を生成AIに書かせるExcelマクロ

AIによるSAPテーブル項目の解説

Excelワークシート上に表示されたSAPテーブルの項目一覧表に、生成AIを使って「解説文」を追加するためのExcelマクロを紹介する。
本記事は、前の記事「SAPテーブルの項目一覧を取得するExcelマクロ」の続編となっている。

前回の記事では、SAPテーブルの項目の情報をS/4HANAなどのSAPシステムから一括で取得し、Excel上に一覧表示するExcelマクロ(VBA)を紹介した。

今回は、Excel上に一覧表示されているSAPテーブル項目の「解説文」を、生成AIに書いてもらうためのExcelマクロを紹介する。

SAPテーブルの項目一覧表(Excelブックファイル)は、前回の記事で作成したものを使用する。ただし、テーブル項目が一覧表示されているExcelワークシートであれば、本記事で紹介するExcelマクロは基本的に利用可能である。

目次

SAPテーブル項目の解説を生成AIに依頼する

SAPテーブル項目の解説を依頼するプロンプト

以下は、Excelワークシート上に表示されている項目の、解説を生成AI(ChatGPT)に依頼するためのプロンプトである。

解説の依頼は、ワークシート上の表を一括で送るのではなく、項目ごとにひとつずつ行う。その理由は、表の件数が多い場合、生成AIがトークン不足により処理を途中で打ち切ったり、満足のいく解説を返せなくなったりすることがあるからである。

#依頼
あなたはSAP ERPおよびSAP S/4HANAの専門家です。
SAP S/4HANAのテーブル{#テーブル}の項目{#項目}の意味と使い方を解説し、回答として返してください。
{#ルール}は必ず守ってください。

#テーブル
MARA

#項目
MATNR

#ルール
-回答は、項目の解説文のみを出力すること。
-解説文は日本語で、100字以内で書くこと。
-回答は項目の解説文のみを出力すること。
-解説文の主語に、テーブル名や項目目など技術名称は含めないこと。
-解説文は体言止めを意識し、簡潔な文章とすること。
-ハルシネーションは出さないこと。

上記のプロンプトをChatGPTで実行すると、次のような回答を得られる。なお、使用したAIモデルは ChatGPT 4o である。

ChatGPTにSAPテーブル項目の解説をしてもらうためのプロンプト

初心者向けに、生成AI用のプロンプトの書き方を解説した記事は以下。

ExcelからChatGPTを利用するには

OpenAI API

OpenAI APIとは、ChatGPTをプログラムなどチャット以外から利用するためのWeb APIのことである。ChatGPTの運営母体であるOpenAI社が公開している。

機能面で見れば(大雑把に言えば)、

OpenAI API ≒ ChatGPT

ということだ。

OpenAI APIはプログラムから使うことを前提にしている。もちろん、Excelマクロ(VBA)から使うことも可能。

今回は、Excelのワークシートに表示されているSAPテーブルの項目の解説をChatGPTに依頼し、解説文を取得する。それを自動化する方法として、ExcelマクロからOpenAI APIを呼び出す。


ExcelマクロでChatGPT(OpenAI API)を呼び出す方法を解説した記事は以下。マクロを含むExcelファイルはダウンロード可能なので、活用および参考にしていただきたい。

SAPテーブル項目の解説を生成AIに書かせるマクロ

OpenAI APIを利用するための準備

本記事で紹介するExcelでは、OpenAI APIを利用するための設定情報は、ワークシート「Parameter」に設定するようにしている。「Parameter」には以下の設定項目を用意してあるので、あらかじめ設定しておく。

OpenAI APIを利用するためのExcelワークシート「Parrameter」の設定

API Key

OpenAI APIを利用するには、「API Key」が必要だ。APIキーを所有していない場合は、OpenAIの公式サイトから入手する。

API Model

利用するGPTモデルの文字列を入力する。利用可能なモデルについては、OpenAIの公式サイト「Models」で公開されている情報を参照してほしい。

本マクロでは、デフォルトモデルは「GPT 4o mini」(gpt-4o-mini)としている。 GPT 4o miniGPT 4o の軽量モデルであり、GPT 4oよりも料金が安価で応答速度に優れる。今回は項目単位(Excelの行単位)に処理を行い、且つ、文字数を下の「回答の文字数」で制限をかけるため、GPT 4o miniでも十分な結果を得られるはずだ。

GPT 4o GPT 4o mini との比較を、表としてまとめておく。

項目GPT-4oGPT-4o mini
特徴高性能モデル軽量化されたモデル
主な用途複雑なタスクや高度な言語処理に適しているリアルタイム処理やコスト重視のタスクに適している
応答速度高速(GPT-4 Turbo比2倍速)GPT-4oの約2倍速
コスト標準低コスト(約1/30の料金)
多言語対応可能可能(ただしGPT-4oより若干劣る)
マルチモーダル入力対応非対応
料金(参考)未公開(比較的高額)入力100万トークンあたり0.15ドル
出力100万トークンあたり0.60ドル
出力の品質高品質若干劣る

回答の文字数

OpenAIのパラメータではないが、OpenAIが作成する解説文の文字数の上限を設定する。既定値は100字である。

マクロでは、取得した文字数はGPTクラスの 変数 NUM_CHAR_ANS にセットし、外部から参照できるようにしておく。

実装したExcelマクロ(VBA)

上述のプロンプトを、Excelから呼び出すマクロ(VBA)は以下である。

ModuleGPT

メイン処理を行うプロシージャ「GetDescriptionWithGPT」を収めたモジュール。

GetDescriptionWithGPT」は、Excelワークシート「Field List」に表示されているテーブルの項目単位にループ処理を行う。

ループ内では、項目名を変数としてプロンプトにセットし、OpenAI APIに問い合わせを行う。問い合わせの結果、解説文を取得できた場合はExceワークlシート上に表示する、という処理を行単位に繰り返す。

なお、GetDescriptionWithGPTは、「Field List」上に配置されたボタン「OpenAI APIによる項目解説」から呼び出される。

マクロはExcelワークシート上のExボタン「OpenAI APIによる項目解説」より実行される
Option Explicit
Option Compare Text

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

'-------------------------------------------------------------
' SAPシステムのテーブル名と項目名をOpenAIに送信し、解説文をワークシートに表示するプロシージャ
'-------------------------------------------------------------
Public Sub GetDescriptionWithGPT()

    On Error GoTo Err_GetDescriptionWithGPT

    Dim wsFL As Worksheet       'ワークシート
    Dim Row As Integer          'Excelの行番号
    Dim strField As String
    Dim strPromptBase As String   '質問文
    Dim strPrompt As String   '質問文
    Dim strAnswer As String     'GPTの回答
    Dim strMessage As String    'メッセージ
    Dim COL_Description As Integer
    Dim COL_Message As Integer

    '項目名の列番号
    Const COL_FIELD As Integer = 2

    'OpenAIに送る「役割」
    Const strSpecialty As String = "SAP ERPおよびSAP S/4HANAの専門家"

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

    'ワークシート"Field List"を変数に格納
    Set wsFL = Worksheets("Field List")
    
    '解説を表示する列番号
    COL_Description = wsFL.Range("Description").Column
    
    'エラー発生時のメッセージを表示する列番号
    COL_Message = wsFL.Cells(ROW_START, 1).SpecialCells(xlLastCell).Column + 1
    
    'プロンプトの生成
    strPromptBase = PreparePrompt(Trim(wsFL.Range("TABLE_NAME")))

    '最終行まで繰り返し処理(ループ処理)
    For Row = ROW_START To wsFL.Cells(ROW_START, 1).SpecialCells(xlLastCell).Row
        
        '項目名の取得
        strField = Trim(wsFL.Cells(Row, COL_FIELD))
        
        '項目名が空白でない、且つ、".INCLU"以外を処理する
        If strField <> "" And InStr(strField, ".INCLU") = 0 Then
            
            'プロンプトに項目名をセット
            strPrompt = Replace(strPromptBase, "{#項目}", strField)
        
            'GPTのAPIにプロンプトを送信
            If GPT.GptAPI(strSpecialty, strPrompt, strAnswer, strMessage) = 0 Then
                '正常終了、且つエラーメッセージ無しの時
                If strMessage = "" Then
                    'GPTからの解説文を出力
                    wsFL.Cells(Row, COL_Description).Value = strAnswer
                Else
                    'メッセージ有りの時、メッセージを出力
                    wsFL.Cells(Row, COL_Message).Value = strMessage
                End If
            ElseIf strMessage <> "" Then
                'エラーメッセージ有りの時、エラーメッセージを出力
                wsFL.Cells(Row, COL_Message).Value = strMessage
            End If
        End If
    
    Next

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


'エラー発生時
Err_GetDescriptionWithGPT:

    MsgBox Err.Description, vbCritical
    Set GPT = Nothing

End Sub

'-------------------------------------------------------------
' OpenAIに送信するプロンプトの準備
' Table                : テーブル名(技術名称)
'  PreparePrompt(戻り値): プロンプトとなる文字列
'-------------------------------------------------------------
Private Function PreparePrompt(ByVal Table As String) As String

                    PreparePrompt = "#依頼" & vbLf
    'PreparePrompt = PreparePrompt & "あなたはSAP ERPおよびSAP S/4HANAの専門家です。" & vbLf
    PreparePrompt = PreparePrompt & "SAP S/4HANAのテーブル" & Table & "の項目{#項目}の意味と使い方を解説し、回答として返してください。" & vbLf
    PreparePrompt = PreparePrompt & "{#ルール}は必ず守ってください。" & vbLf
    PreparePrompt = PreparePrompt & "#ルール" & vbLf
    PreparePrompt = PreparePrompt & "-解説文は日本語で、" & CStr(GPT.NUM_CHAR_ANS) & "字以内で書くこと。" & vbLf
    PreparePrompt = PreparePrompt & "-専門用語は使わず、ERP初心者でも解りやすい解説をすること。" & vbLf
    PreparePrompt = PreparePrompt & "-解説文は体言止めを意識し、簡潔な文章とすること。" & vbLf
    PreparePrompt = PreparePrompt & "-回答は、項目の解説文のみを出力すること。" & vbLf
    PreparePrompt = PreparePrompt & "-回答の主語にテーブル名、項目名など技術名称は含めないこと。" & vbLf
    PreparePrompt = PreparePrompt & "-ハルシネーションは出さないこと。"

End Function

ClassGPT

OpenAI API を処理するクラスモジュール。本マクロでは、ModuleGPTのプロシージャ「GetDescriptionWithGPT」から、関数「GptAPI」が呼び出される。

Option Explicit
Option Compare Text

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

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

'OpenAI API用のパラメータ
Public OpenAIAPIkey As String       'OpenAI APIキー
Private AIMODEL As String           'AI Model

Public NUM_CHAR_ANS As Integer      '回答の文字数

'このクラスの初期化
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
    
    '回答の文字数
    tmp = Trim(wsParameter.Range("NUM_CHAR_ANS").Value)
    If tmp = "" Then
        NUM_CHAR_ANS = 100
    ElseIf IsNumeric(tmp) Then
        NUM_CHAR_ANS = CInt(tmp)
    Else
        NUM_CHAR_ANS = 100
    End If
    
    Exit Sub
    

'エラー発生時
Err_Class_Initialize:

    MsgBox Err.Description, vbCritical

End Sub

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

'-------------------------------------------------------------
' 指定した質問文字列を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

'-------------------------------------------------------------
' 文字列のエスケープ
' 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

マクロの補足

OpenAI に送信されるJson文字列

本マクロでは、関数GetAPIからOpenAI に送信されるJson文字列は次のようになる。

{
	"model": "gpt-4o-mini",
	"messages": [
		{
			"role": "system",
			"content": "SAP ERPおよびSAP S/4HANAの専門家"
		},
		{
			"role": "user",
			"content": "#依頼\fSAP S/4HANAのテーブルMARAの項目MANDTの意味と使い方を解説し、回答として返してください。\f{#ルール}は必ず守ってください。\f#ルール\f-解説文は日本語で、100字以内で書くこと。\f-専門用語は使わず、ERP初心者でも解りやすい解説をすること。\f-解説文は体言止めを意識し、簡潔な文章とすること。\f-回答は,項目の解説文のみを出力すること。\f-回答の主語にテーブル名、項目名など技術名称は含めないこと。\f-ハルシネーションは出さないこと。"
		}
	],
	"temperature": 0
}
role “system

GPTの「役割」を設定する。この例では、SAPシステムのテーブル項目の解説文を依頼するので、上述のプロンプトにあった「あなたはSAP ERPおよびSAP S/4HANAの専門家です」より、

SAP ERPおよびSAP S/4HANAの専門家

を値としてセットしている。

role “user

依頼となるプロンプト本文をセットする。

temperature

生成されるテキストのランダム性や多様性を調整するためのパラメータ。値は0から2の範囲で設定可能であり、デフォルトは1である。0を設定するとランダム性が無くなるため、毎回同じ回答を返すようになる。したがって、回答の揺らぎを防ぎたい場合は0をセットする。

OpenAI APIによって出力された解説文の例

OpenAI API によって出力された解説文の例が以下である。

OpenAI APIによって出力された解説文の例

解説文が短い・長い・物足りないなど感じた場合は、Excelワークシート「Parameter」にある「回答の文字数」の値を調整し、再度「OpenAI APIによる項目解説」ボタンを押してマクロを実行すればよい。

この記事で紹介したマクロのダウンロード

この記事で紹介したExcelマクロのファイルは、当ブログの「便利ツールと資料」からダウンロード可能だ。

まとめ:生成AIをSAPシステムの解説者として活用しよう

本記事では、生成AI(OpenAI API)を活用してSAP S/4HANAのテーブルや項目の解説を効率的に作成する手法を紹介した。特に、Excelマクロを用いてAPIをコールし、ワークシート上の項目一覧を一括処理する仕組みは生産性向上に非常に効果的である。この方法により、手作業で膨大な時間を要する作業を短時間で自動化できるだけでなく、生成される解説の品質も高い。

SAPシステムの構造や項目の意味は複雑であり、正確に理解し伝えるには時間と労力が必要だ。しかし、生成AIを「解説者」として活用することで、その負担を大幅に軽減し、作業の効率化を実現することが可能である。特にITエンジニアやSAPコンサルタントにとって、この仕組みは実務での大きな助けとなるだろう。

本記事で紹介したアイデアやマクロを、実務に是非活用していただきたい。このアプローチは間違いなく、SAPシステム導入における生産性を上昇させるだろう。

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

コメント

コメントする

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

目次