Excel のVBA(マクロ)から OpenAI の API を使ってみた

ExcelのVBAで作成したマクロから OpenAI の API が使えればいろいろと AI の活用範囲が広がりそうだったので、試してみることにしました。

なお、VBAの作成にあたっては、わちょんさんの以下の Youtubeを参考にさせていただきました。大変ありがとうございました。

ちなみに、この動画自体は3年前のもので、概要欄に書かれているコードをそのまま実行させても今の OpenAIでは動作しないようでしたので、「1.VBAの修正」の通り少し修正させていただきました。

1.VBAの修正

わちょんさんの概要欄に記載されているコードからの主な修正点は”★”の部分です。

Option Explicit
'★Chat Completions APIを使う場合のURLを変更
Const API_URL As String = "https://api.openai.com/v1/chat/completions"

Sub ApplyAddressCorrection()
Dim apiKey As String
Dim text As String
Dim response As String
Dim responseArray() As String
Dim ws As Worksheet
Dim i As Long

Set ws = ActiveSheet
ws.Range("B5").CurrentRegion.ClearContents

'★Windowsの環境変数にAPIキーを保存し、VBAから読み込む方法に変更
apiKey = Environ("OPENAI_API_KEY")

If apiKey = "" Then
MsgBox "OpenAI APIキーが設定されていません。", vbCritical
Exit Sub
End If

'★現行モデル"gpt-5-nano"の利用に変更
'★temperature = ws.Range("D3").Valueを削除
'★"max_tokens": 2000から"max_completion_tokens": 2000に変更
text = ws.Range("B2").Value & ws.Range("B3").Value
text = "{""model"": ""gpt-5-nano"", ""max_completion_tokens"": 2000" & ", ""messages"": [{""role"": ""user"", ""content"": """ & text & """}]}"
response = sendAPIRequest(API_URL, text, apiKey)

'★responseの中身を確認
Debug.Print response

'★extractContentの処理を2回→1回に変更し効率化
response = extractContent(response)
ws.Range("B5").Value = response

response = Replace(response, "\n", vbLf)
If ws.Range("D5").Value = "する" Then response = Replace(response, "。", "。" & vbLf)
responseArray = Split(response, vbLf)
For i = 0 To UBound(responseArray)
ws.Range("B" & 5 + i).Value = responseArray(i)
Next i
End Sub

Function sendAPIRequest(url As String, text As String, apiKey As String) As String
Dim request As Object
Set request = CreateObject("MSXML2.XMLHTTP")
request.Open "POST", url, False
request.setRequestHeader "Content-Type", "application/json"
request.setRequestHeader "Authorization", "Bearer " & apiKey
request.send text
sendAPIRequest = request.responseText
End Function

Function extractContent(response As String) As String
Dim startPos As Integer
Dim endPos As Integer

'★JSONの解析方法を変更
startPos = InStr(1, response, """content"": """)

If startPos = 0 Then
extractContent = response
Exit Function
End If

startPos = startPos + 12

endPos = InStr(startPos, response, """")

If endPos = 0 Then
extractContent = response
Exit Function
End If

extractContent = Mid(response, startPos, endPos - startPos)


End Function

2.Windowsの環境変数にAPIキーを保存

「1.VBAの修正」の中で記載の通り、Windowsの環境変数にAPIキーを保存し、VBAから読み込む方法にVBAを変更していますので、Windows11にて以下の操作を実行しています。

1.スタートボタンをクリック
2.「環境変数」と検索
3.「システム環境変数の編集」を開く
4.「システムのプロパティ」が開いたら、「環境変数」をクリック
5.「ユーザー環境変数」のところで 「新規」をクリック

上記の5.まで実施すると以下のウィンドウが表示されるので、
・変数名:OPENAI_API_KEY
・変数値:OpenAIで取得したAPIキー(sk-… )
を入力し、「OK」ボタンを押します。

Windows11のユーザ環境変数設定画面

この後、コマンドプロンプトを開いて下記のように入力し、APIキーが表示されれば登録成功です。(set コマンドで確認してもOK)

echo %OPENAI_API_KEY%

3.VBAの実行

ExcelにてセルのB2 および B3に OpenAIに質問したい事項を記入後、[ALT]+[F11]にてVBAの編集画面を起動し実行すれば、B5に OpenAIからの回答が出力されました。

ExcelからOpenAIのAPIにアクセスし回答が返ってきたところ

OpenAIのAPI利用条件が非常にわかりづらかった件と利用設定について

普段、私は ChatGPT を無料枠で使っているのですが、ふと OpenAI の APIを使ってみたくなりました。

ところがそのAPIの利用条件を調べてみてもいまいちわかりづらかったのでここで整理しておきます。

結論としては、
・ChatGPTの有料プランを購入しなくても OpenAI の API 利用は可能
・OpenAIのAPI利用はプランではなく完全に従量課金制
ということがわかりました。

また上記踏まえて、OpenAIのAPI利用設定を実施しましたので下記のとおり整理しておきます。

1.OpenAI API Platformにアクセス

下記のURLにアクセスしアカウントを作成後、ログインします。

OpenAI API Platform
https://openai.com/ja-JP/api/

2.API keyの作成

すると以下のような画面が表示されるので Get started のところに表示されている「1. Create an API key」をクリックし、API key を作成します。

OpenAI API Platform

なお、この時に作成したskから始まるAPI key は一度しか表示されないようですので、作成したら安全なところに保管してください。

3.クレジットの登録と支払い上限設定

API key を作成しただけでは API へアクセスできませんでした(自分の場合、無料枠はつきませんでした)ので、API を利用する為にクレジットの登録を行います。

上図の通り最上部のプルダウンから「Manage Projects」を選択後、左ペインの「Billing」を選択すると「Add payment details」のボタンが表示されるので、ここからクレジットカードを登録します。

OpenAI API Platform

なお、クレジットカードを登録した後に、下図の通り最初の購入額が設定できます。
ここで Use auto-reloadを OFF にすると最初の購入額を超えた API利用はできなくなり安心です。

OpenAI API Platform

実際にUse auto-reloadを OFF にするとこうなります。

OpenAI API Platform

最後に下記の画面で支払いの確認をすれば完了です。

OpenAI API Platform

4.支払い設定の確認

「Billing」にて auto-reload が OFF になっていることをあらためて確認します。
なおこの場合、残価が0円になるとAPIが自動的に利用できなくなりますので業務で定期的に利用している場合などは注意が必要ですね。

OpenAI API Platform

OpenAIのAPIを使った最初の PythonプログラムをMacで動かしてみたら意外とてこずった件

AIの本を読んでいて、OpenAIのAPIを使ってみたくなったので、Mac上で環境を用意し、PythonプログラムからOpenAI のAPIを呼び出してみました。

単純なプログラムを動かすだけなのですぐにできるだろうと思いましたが意外と手こずったので、ここにその時の記録を残しておきます。

エラー1.cannot import name ‘OpenAI’ from ‘openai’

まず Mac上で作成した Pythonのプログラム(test.py)を動かそうとして最初に発生したのがこのエラーでした。

% python test.py
Traceback (most recent call last):
File "/Users/XXX/tmp/test.py", line 1, in <module>
from openai import OpenAI
ImportError: cannot import name 'OpenAI' from 'openai' ・・・

原因はどうやら自分のMAC上の openai のライブラリが古いようで、以下のコマンドでバージョンアップしてあげることで解消しました。

% pip install --upgrade openai
Requirement already satisfied: openai in /Users/XXX/.pyenv/versions/3.10.0/lib/python3.10/site-packages (0.27.10)
Collecting openai
Downloading openai-2.52.0-py3-none-any.whl.metadata (40 kB)
 ・・・

エラー2.NameError: name ‘sk’ is not defined

そして次に遭遇したのがこのエラーです。

エラーの理由は単純で、あらかじめ取得しておいた api_keyをプログラム内に設定する際に””で括ってあげていない為でした。

ただしくは以下の通りに記述する必要があります。(本当はプログラム内に直接 APIキーを書かない方がいいですが。)

client = OpenAI(
api_key ="sk・・・・・"
)

エラー3.openai.RateLimitError

そして最後に遭遇したのがこのエラーです。詳しくは以下の通り出力されていました。

openai.RateLimitError: Error code: 429 - {'error': {'message': 'You exceeded your current quota, please check your plan and billing details. For more information on this error, read the docs: https://platform.openai.com/docs/guides/error-codes/api-errors.', 'type': 'insufficient_quota', 'param': None, 'code': 'insufficient_quota'}}

このエラーの原因も単純で、まだこの時点ではOpenAI のWeb上から api_key を入手しただけで、支払い処理(クレジットカードの登録)を実施していなかった為でした。

OpenAI の APIの作成手続きを済ませた直後は無料枠が使えるのかと思っていましたが、そんなに甘くはないようです。(2027.8.1時点)

ついに成功

その後、支払いを済ませて再度プログラムを実行すると、正常動作しました。

% python test.py
こんにちは!元気ですか?何かお手伝いできることはありますか?

たとえばこんなことができます。
- 日本語↔英語の翻訳・添削
- 文章の要約・ブラッシュアップ
- アイデア出しや企画の構成作成
- 技術的な質問・コーディングのサポート
- 日常の相談・学習サポート

話したいトピックを教えてください。最近の話題でもOKです。