~Excel上で利用できるAI関数の自作と業務効率化~
はじめに
この記事では、Excelから直接Geminiを呼び出してAI関数を自作する方法を解説します。
分類・要約などをExcel関数として使えるようにすることで、業務の効率化が狙えます。
今回は、LLM活用に必要なAPIキーを外部ファイル(INI形式)で管理します。
これにより、AI関数を含むExcelブックを安全に社内共有できるようになります。
INIファイルの読み込みに関しては、以下の記事を参考にしています:
https://qiita.com/kenichik0304/items/a1a9dad821ebc9cb46e3
全体像・仕組み
基本構成は以下の2ステップで構築します。
1.INI設定ファイルの作成
2.生成AIへのリクエスト関数を含むエクセルファイル作成
構築手順・設定
- APIキー発行:今回はGoogle AI StudioでGeminiのAPIキーを作成・保管
-
INIファイル準備:
iniファイルに APIKEYやDESCRIPTION など定義し、ブックと同階層へ配置 - Excelブック設定:VBAプロジェクトにJsonConverter(BAS)を追加、さらに参照設定を有効化
- LLM関数実装:VBAでINI読込→Gemini呼び出し→レスポンス抽出→セルに反映
各論1:Gemini APIキーの取得手順(Google AI Studio)
GeminiをExcelなど外部アプリから利用するためには、まず Google AI Studio でAPIキーを発行します。
※無料枠があり、個人アカウント(Gmail)でも作成可能です。
手順
-
AI Studioへアクセスし、Googleアカウントでログイン
👉 https://aistudio.google.com/ -
左メニューで「API keys」 を選択
-
「Get API key」ボタン をクリック
-
初回アクセス時は「プロジェクト作成」確認が出るが、クリックで自動作成される
-
「Create API key」ボタン を押す
-
APIキーが生成される
各論2:INI構成例
APIキーなどを外部ファイルで安全に管理します。
共通設定と個別設定をセクションで分けておくと便利です。
※ APIキーは実際に取得したコードに差し替えてください
[default]
description=""
[common]
; 共有で使うベースフォルダ(相対参照にすると配布が楽)
URL = "C:\Users\%USERNAME%\Downloads\AI関数テスト\ "
[GoogleGemini]
; 対象エクセルに設定するキー(下記は例)
APIKEY=AIzaSy-REPLACE_WITH_YOUR_KEY
description="INIファイルで読み込んで複数ファイルでAPI接続を共有するためのもの"
各論3:エクセルブックの準備
参照設定
- VBAエディタ→「ツール」→「参照設定」で Microsoft Scripting Runtime を有効化。
JsonConverter導入
-
VBA-JSON から、
JsonConverter.basをダウンロード - エクセルの標準モジュールにインポート。
各論4:LLM関数の準備
以下のコードを標準モジュールに貼り付けてください。
活用LLMモデルなどは、適宜変更してください
Option Explicit
Dim GEMINI_APIKEY As String
'■■■■■■■■■ 必要に応じて変更する定数など
'Private Const MODEL_NAME As String = "gemini-2.0-flash"
Private Const MODEL_NAME As String = "gemini-2.0-flash-lite"
Private Const MAX_TOKENS As Long = 10000
Private Const RESPONSE_TIMEOUT_SEC As Long = 60 ' タイムアウト初期値
'=====================================
'【パブリック関数】
'=====================================
'
' Gemini_ChatCompletion
'
' 機能:システムメッセージとユーザーメッセージを引数として受け取り、
' APIリクエストを作成・送信し、レスポンスを解析して結果を返す
'
Public Function Gemini関数(systemMessage As String, userMessage As String) As String
Dim requestBody As String
Dim responseText As String
Dim parsedResponse As Object
Dim JsonString As String
Dim Gemini_SystemString As String
'APIキーの取得
GEMINI_APIKEY = Worksheets("設定読込").Range("c2").Value
'Geminiはコードを返しがちなので、コードを含めないことをプロンプトに明記する
Gemini_SystemString = "コードは返さず、指定された形式の結果値のみ返す"
' JSONリクエストの作成(修正済み)
requestBody = CreateRequestBody(systemMessage & vbCrLf & Gemini_SystemString & vbCrLf & "プロンプトの指示対象となる値は" & vbCrLf & userMessage)
' APIリクエストの送信
responseText = SendHttpRequest(requestBody)
' レスポンスの解析
Set parsedResponse = ParseJsonResponse(responseText)
' デバッグ出力
JsonString = ConvertJsonToString(parsedResponse)
Debug.Print "API Response: " & responseText
Debug.Print "Parsed JSON: " & JsonString
' 応答メッセージを返す
Gemini関数 = ExtractResponse(parsedResponse)
End Function
'=====================================
'【プライベート関数】
'=====================================
'
' JSONリクエスト作成関数(修正済み)
Private Function CreateRequestBody(userMessage As String) As String
CreateRequestBody = "{""contents"": [{""role"": ""user"", ""parts"": [{""text"": """ & userMessage & """}]}]}"
End Function
' APIリクエスト送信関数
Private Function SendHttpRequest(requestBody As String) As String
Dim http As Object
Dim apiUrl As String
Set http = CreateObject("MSXML2.XMLHTTP")
apiUrl = "https://generativelanguage.googleapis.com/v1/models/" & MODEL_NAME & ":generateContent?key=" & GEMINI_APIKEY
http.Open "POST", apiUrl, False
http.setRequestHeader "Content-Type", "application/json"
http.Send requestBody
' デバッグ出力
Debug.Print "Request Sent to: " & apiUrl
Debug.Print "Request Body: " & requestBody
Debug.Print "HTTP Status: " & http.Status
SendHttpRequest = http.responseText
End Function
' JSONレスポンス解析関数
Private Function ParseJsonResponse(responseText As String) As Object
Dim JSON As Object
Set JSON = JsonConverter.ParseJson(responseText)
Set ParseJsonResponse = JSON
End Function
' 応答メッセージ抽出関数
Private Function ExtractResponse(parsedResponse As Object) As String
Dim content As Object
If parsedResponse.Exists("candidates") Then
If parsedResponse("candidates").Count > 0 Then
If parsedResponse("candidates")(1).Exists("content") Then
If parsedResponse("candidates")(1)("content").Exists("parts") Then
If parsedResponse("candidates")(1)("content")("parts").Count > 0 Then
ExtractResponse = parsedResponse("candidates")(1)("content")("parts")(1)("text")
Exit Function
End If
End If
End If
End If
End If
' エラー時のデフォルトメッセージ
ExtractResponse = "API Error: No response"
End Function
' JSONオブジェクトを文字列に変換
Private Function ConvertJsonToString(jsonObj As Object) As String
On Error Resume Next
Dim jsonText As String
jsonText = JsonConverter.ConvertToJson(jsonObj)
If Err.Number <> 0 Then
jsonText = "Error converting JSON to string"
End If
ConvertJsonToString = jsonText
On Error GoTo 0
End Function
注意点
- Excelファイルを配布する場合は、APIキーをファイル内に残さない構成が理想的です。
- 参照設定はブック単位で保存されるため、新しいブックを作る際は再設定が必要です。
- APIレスポンスを確認できる仕組み(例:ログ出力やステータス表示)を追加しておくと便利です。
-
Gemini関数はセル関数内でも利用可能ですが、再計算時に再実行される点に注意してください。 - Google AI Studioで作成したAPIキーには利用上限(リクエスト数など)があります。
まとめ・応用
- 普段使いのExcel上ですぐに生成AIを利用可能
- INIによる外部管理でAPIキーを安全に扱える構成
- VBA+JsonConverterでシンプルなコード構成を実現
応用例:
- ChatGPT/Claudeなど他モデルへの切替
- Excel関数を使った文章要約・翻訳・分類
- 社内テンプレートや日報の自動生成