<p><!--META
{
"title": "VBAでREST API連携とJSON処理",
"primary_category": "Office自動化",
"secondary_categories": ["VBA", "Excel", "Access"],
"tags": ["VBA", "REST API", "JSON", "MSXML2.XMLHTTP", "WinHttpRequest", "Excel", "Access", "API連携"],
"summary": "VBAでREST API連携とJSON処理を外部ライブラリなしで実現する方法を解説。MSXML2.XMLHTTPとWinHttpRequestを使ったHTTPリクエスト、Scripting.Dictionaryを用いたJSON解析、そして性能最適化について具体的なコード例を交えて詳述。",
"mermaid": true,
"verify_level": "L0",
"tweet_hint": {"text":"VBAでREST APIとJSONを外部ライブラリなしで処理する方法を解説。MSXML2.XMLHTTPやWinHttpRequestでのAPI連携、JSONパースの基本、性能チューニングまでを網羅。Excel/Access業務自動化に必須知識です。
#VBA #RESTAPI
#JSON #Office自動化","hashtags":["#VBA","#RESTAPI","#JSON","#Office自動化"]},
"link_hints": [
"https://learn.microsoft.com/ja-jp/windows/win32/msxml/xmlhttprequest",
"https://learn.microsoft.com/ja-jp/windows/win32/winhttp/about-winhttp",
"https://learn.microsoft.com/ja-jp/office/vba/excel/concepts/working-with-excel/excel-vba-performance-tips"
]
}
-->
本記事は<strong>Geminiの出力をプロンプト工学で整理した業務ドラフト(未検証)</strong>です。</p>
<h1 class="wp-block-heading">VBAでREST API連携とJSON処理</h1>
<h2 class="wp-block-heading">背景と要件</h2>
<p>Microsoft Office製品(Excel, Accessなど)におけるVBAは、長らくビジネスプロセス自動化の中核を担ってきました。現代のシステム連携において、REST APIとJSONはデファクトスタンダードとなっており、VBAアプリケーションが外部のWebサービスやクラウドサービスと連携するニーズはますます高まっています。しかし、多くの企業環境ではセキュリティや保守性の観点から、VBAに外部DLLやActiveXコントロールを追加することが厳しく制限される場合があります。
、このような制約下でVBAを用いてREST API連携とJSON処理を実現するための実践的な方法論を解説します。具体的には、<strong>外部ライブラリに一切依存せず</strong>、Windows標準で提供されるCOMオブジェクト(<code>MSXML2.XMLHTTP</code>や<code>WinHttpRequest</code>)と、VBAの組み込み機能(<code>Scripting.Dictionary</code>、<code>Collection</code>、文字列操作、正規表現)のみを用いて、HTTPリクエストの送信、JSONデータの送受信、そしてその解析を行う手法に焦点を当てます。また、ExcelやAccessでの利用を想定し、実務レベルで再現可能なコード例と、性能チューニングの重要性についても述べます。</p>
<h2 class="wp-block-heading">設計</h2>
<h3 class="wp-block-heading">全体アーキテクチャ</h3>
<p>VBAアプリケーションがREST APIと連携する際の基本的なアーキテクチャは、以下の要素で構成されます。</p>
<ol class="wp-block-list">
<li><p><strong>HTTPクライアント</strong>: WebサーバーへのHTTPリクエストを送信し、レスポンスを受信する役割を担います。VBAでは<code>MSXML2.XMLHTTP</code>または<code>WinHttpRequest</code>オブジェクトを利用します。</p></li>
<li><p><strong>JSONデータ生成/解析</strong>: 受信したJSON文字列をVBAのデータ構造(<code>Scripting.Dictionary</code>や<code>Collection</code>)に変換したり、VBAのデータをJSON文字列に変換したりする部分です。外部ライブラリを使用しない場合、この部分は手動の文字列操作や専用のクラスモジュールで実装します。</p></li>
<li><p><strong>データ処理</strong>: JSONから抽出したデータをExcelシートに書き込んだり、Accessのテーブルに挿入したりする処理です。</p></li>
</ol>
<h3 class="wp-block-heading">処理フロー(Mermaid)</h3>
<p>API連携の一般的な処理フローを以下に示します。</p>
<div class="wp-block-merpress-mermaidjs diagram-source-mermaid"><pre class="mermaid">
graph TD
A["VBAアプリケーション"] --> B{"APIリクエストの準備"};
B --> C{"HTTPクライアント選択"};
C -- MSXML2.XMLHTTP60| --> D["HTTPリクエスト送信"];
C -- WinHttpRequest| --> D;
D --> E{"HTTPレスポンス受信"};
E -- 成功 (Status 2xx)| --> F["JSON文字列取得"];
F --> G{"JSON解析"};
G --> H["VBAデータ構造への変換"];
H --> I["ビジネスロジック (Excel/Accessでのデータ処理)"];
E -- 失敗 (Status 4xx/5xx)| --> J["エラーハンドリング"];
J --> K["処理終了"];
I --> K;
</pre></div>
<h3 class="wp-block-heading">HTTPクライアントの選択</h3>
<p>VBAでHTTP通信を行う主要なCOMオブジェクトは以下の2つです。</p>
<ul class="wp-block-list">
<li><p><strong><code>MSXML2.XMLHTTP</code> (または <code>MSXML2.XMLHTTP60</code>)</strong>:</p>
<ul>
<li><p>古くから利用されており、広く互換性があります。</p></li>
<li><p><code>Microsoft XML, vX.0</code> 参照設定が必要です。</p></li>
<li><p>同期/非同期通信の両方に対応。</p></li>
<li><p>基本的なGET/POSTリクエストには十分です。</p></li>
<li><p>Microsoft社のドキュメントでは2023年10月27日時点でも詳細が提供されています[1]。</p></li>
</ul></li>
<li><p><strong><code>WinHttpRequest</code></strong>:</p>
<ul>
<li><p><code>MSXML2.XMLHTTP</code>よりも新しく、一部でより高度な機能(プロキシ設定の柔軟性、SSL/TLS設定など)を提供します。</p></li>
<li><p><code>Microsoft WinHTTP Services, version X.0</code> 参照設定が必要です。</p></li>
<li><p>Microsoft社のドキュメントでは2023年9月18日時点でも詳細が提供されています[2]。</p></li>
</ul></li>
</ul>
<p>どちらも基本的なAPI連携には使用可能ですが、より新しいWindows環境でセキュリティやプロキシに関する要件がある場合は<code>WinHttpRequest</code>が推奨されることがあります。本記事では両方の使用例を示します。</p>
<h3 class="wp-block-heading">JSON処理の基本構造</h3>
<p>外部ライブラリが使用できない場合、JSONの解析は以下の方法を組み合わせます。</p>
<ol class="wp-block-list">
<li><p><strong><code>Scripting.Dictionary</code>と<code>Collection</code></strong>: JSONオブジェクトは<code>Dictionary</code>、JSON配列は<code>Collection</code>に対応させます。これにより、VBA内部でJSONの階層構造を表現できます。</p></li>
<li><p><strong>文字列操作</strong>: <code>InStr</code>, <code>Mid</code>, <code>Replace</code>, <code>Split</code>などを駆使して、JSON文字列からキーと値を抽出します。</p></li>
<li><p><strong>正規表現</strong>: <code>VBScript.RegExp</code>オブジェクトを利用して、複雑なパターンマッチングを行い、効率的にキーと値を特定します。</p></li>
</ol>
<p>完全なJSONパーサーを自作するのは非常に複雑なため、実務では<strong>必要なデータ項目のみを抽出する簡易パーサー</strong>を実装するか、またはオープンソースのVBA向けJSONパーサークラス(例: <code>VBA-JSON</code>プロジェクト[3])のロジックを参考に、内部利用に限定して移植・改変する方法が考えられます。本記事では、簡易的なJSON文字列からのデータ抽出例を示し、より高度な対応については概念的な説明に留めます。</p>
<h2 class="wp-block-heading">実装</h2>
<p>以下のコードは、Excel VBAを想定していますが、Access VBAでも同様に動作します。</p>
<h3 class="wp-block-heading">参照設定</h3>
<p>VBAエディタ (<code>Alt + F11</code>) を開き、<code>ツール</code> -> <code>参照設定</code> から以下のライブラリにチェックを入れてください。</p>
<ul class="wp-block-list">
<li><p><code>Microsoft XML, v6.0</code> (または v3.0) – <code>MSXML2.XMLHTTP</code>用</p></li>
<li><p><code>Microsoft WinHTTP Services, version 5.1</code> – <code>WinHttpRequest</code>用</p></li>
<li><p><code>Microsoft Scripting Runtime</code> – <code>Scripting.Dictionary</code>用</p></li>
</ul>
<h3 class="wp-block-heading">コード1: GETリクエストとJSONレスポンスの基本処理(MSXML2.XMLHTTP60)</h3>
<p>ここでは、公開されているダミーAPI(例: <code>https://jsonplaceholder.typicode.com/todos/1</code>)からJSONデータを取得し、Excelシートに表示する例を示します。</p>
<pre data-enlighter-language="generic">' /////////////////////////////////////////////////////////////
' // モジュール名: modApiHelper
' // 目的: REST APIからJSONデータを取得し、Excelシートに表示
' // 適用: Excel VBA (参照設定: Microsoft XML, v6.0; Microsoft Scripting Runtime)
' /////////////////////////////////////////////////////////////
Option Explicit
' 簡易JSONパーサーの定義 (Scripting.Dictionaryを使用)
' JSONオブジェクトを表現する型
Private Type JSONObject
KeyValues As Scripting.Dictionary
End Type
' JSON配列を表現する型 (Collectionとして利用)
' Private Type JSONArray
' Items As Collection
' End Type
' JSON文字列から特定のキーの値を抽出する簡易関数
' この関数はネストされていない単純なJSONのみを想定しています。
Function GetJsonValue(ByVal jsonString As String, ByVal key As String) As String
Const JSON_KEY_QUOTE As String = """"
Dim pattern As String
Dim regEx As Object
Dim matches As Object
' JSON文字列から "key": "value" または "key": value (数値など) の形式を抽出
' キーがクォートされ、コロンの後に値が続くパターン
pattern = JSON_KEY_QUOTE & key & JSON_KEY_QUOTE & "\s*:\s*(" & JSON_KEY_QUOTE & ".*??" & JSON_KEY_QUOTE & "|[0-9\-\.]+)"
Set regEx = CreateObject("VBScript.RegExp")
With regEx
.Pattern = pattern
.IgnoreCase = False
.Global = False ' 最初の一致のみ
End With
Set matches = regEx.Execute(jsonString)
If matches.Count > 0 Then
' キャプチャグループ1が値
GetJsonValue = Replace(matches(0).SubMatches(0), JSON_KEY_QUOTE, "")
Else
GetJsonValue = ""
End If
End Function
Sub FetchAndParseJson_MSXML2()
' パフォーマンス最適化
Application.ScreenUpdating = False
Application.Calculation = xlCalculationManual
Dim xmlHttp As MSXML2.XMLHTTP60 ' 早期バインディング (参照設定が必要)
Dim apiUrl As String
Dim jsonResponse As String
Dim targetSheet As Worksheet
Dim lastRow As Long
Dim parsedTitle As String
Dim parsedCompleted As String
Dim startTime As Double, endTime As Double
startTime = Timer
Set xmlHttp = New MSXML2.XMLHTTP60
apiUrl = "https://jsonplaceholder.typicode.com/todos/1" ' ダミーAPI
' リクエスト送信
With xmlHttp
.Open "GET", apiUrl, False ' 同期通信
.setRequestHeader "Content-Type", "application/json; charset=UTF-8"
.send
End With
' レスポンス処理
If xmlHttp.Status = 200 Then ' HTTP OK
jsonResponse = xmlHttp.responseText ' JSON文字列を取得
Debug.Print "Received JSON: " & jsonResponse
' 簡易JSON解析
parsedTitle = GetJsonValue(jsonResponse, "title")
parsedCompleted = GetJsonValue(jsonResponse, "completed")
' Excelシートへの書き出し
Set targetSheet = ThisWorkbook.Sheets("Sheet1") ' または任意のシート名
With targetSheet
.Cells.ClearContents ' 内容をクリア
.Cells(1, 1).Value = "項目"
.Cells(1, 2).Value = "値"
.Cells(2, 1).Value = "API URL"
.Cells(2, 2).Value = apiUrl
.Cells(3, 1).Value = "Status Code"
.Cells(3, 2).Value = xmlHttp.Status
.Cells(4, 1).Value = "Title"
.Cells(4, 2).Value = parsedTitle
.Cells(5, 1).Value = "Completed"
.Cells(5, 2).Value = parsedCompleted
End With
MsgBox "APIデータがSheet1に書き込まれました。", vbInformation
Else
MsgBox "APIリクエストに失敗しました。ステータスコード: " & xmlHttp.Status & vbCrLf & "レスポンステキスト: " & xmlHttp.responseText, vbCritical
End If
' リソースの解放
Set xmlHttp = Nothing
endTime = Timer
Debug.Print "処理時間: " & (endTime - startTime) & "秒"
' パフォーマンス設定を元に戻す
Application.Calculation = xlCalculationAutomatic
Application.ScreenUpdating = True
End Sub
</pre>
<p><strong>コードのポイント:</strong></p>
<ul class="wp-block-list">
<li><p><code>MSXML2.XMLHTTP60</code>: HTTPリクエストの送受信に利用します。<code>Open</code>メソッドでリクエストの種類、URL、同期/非同期を指定。<code>setRequestHeader</code>でヘッダーを追加し、<code>send</code>でリクエストを送信します。</p></li>
<li><p><code>GetJsonValue</code>関数: 外部ライブラリを使わずにJSONから特定のキーの値を抽出する<strong>簡易的な</strong>関数です。正規表現(<code>VBScript.RegExp</code>)を使用しています。ネストされたJSONや配列には対応していません。</p></li>
<li><p>エラーハンドリング: <code>xmlHttp.Status</code>でHTTPステータスコードを確認し、成功(200番台)か失敗かを判断します。</p></li>
<li><p>性能チューニング: <code>Application.ScreenUpdating = False</code>と<code>Application.Calculation = xlCalculationManual</code>で画面更新と自動計算を一時停止し、処理速度を向上させています。</p></li>
</ul>
<h3 class="wp-block-heading">コード2: POSTリクエストとJSONデータ送信(WinHttpRequest)</h3>
<p>ここでは、ダミーAPIエンドポイントに対してJSONデータをPOSTリクエストとして送信する例を示します。</p>
<pre data-enlighter-language="generic">' /////////////////////////////////////////////////////////////
' // モジュール名: modApiHelper
' // 目的: REST APIにJSONデータをPOST送信
' // 適用: Excel VBA (参照設定: Microsoft WinHTTP Services, version 5.1)
' /////////////////////////////////////////////////////////////
Option Explicit
' JSON文字列をエスケープする簡易関数
' この関数は、クォーテーションや改行などの特殊文字をエスケープします。
Function EscapeJsonString(ByVal inputString As String) As String
' 改行、タブなどのエスケープはここでは省略し、主にダブルクォーテーションをエスケープ
EscapeJsonString = Replace(inputString, """", "\""")
' 必要に応じてその他のエスケープ処理を追加:
' EscapeJsonString = Replace(EscapeJsonString, vbCrLf, "\n")
' EscapeJsonString = Replace(EscapeJsonString, vbCr, "\r")
' EscapeJsonString = Replace(EscapeJsonString, vbTab, "\t")
' EscapeJsonString = Replace(EscapeJsonString, "\", "\\") ' バックスラッシュもエスケープが必要な場合
End Function
Sub PostJsonData_WinHttpRequest()
' パフォーマンス最適化
Application.ScreenUpdating = False
Application.Calculation = xlCalculationManual
Dim winHttpReq As WinHttpRequest ' 早期バインディング (参照設定が必要)
Dim apiUrl As String
Dim jsonPayload As String
Dim startTime As Double, endTime As Double
startTime = Timer
Set winHttpReq = New WinHttpRequest
apiUrl = "https://jsonplaceholder.typicode.com/posts" ' ダミーAPI (POST用)
' 送信するJSONデータを構築 (手動で文字列結合)
' 実際のデータはExcelシートやAccessテーブルから取得する
Dim userId As Long: userId = 1
Dim title As String: title = "VBAでAPI連携テスト"
Dim bodyContent As String: bodyContent = "これはVBAから送信されたテストデータです。"
jsonPayload = "{" & _
"""userId"": " & userId & "," & _
"""title"": """ & EscapeJsonString(title) & """," & _
"""body"": """ & EscapeJsonString(bodyContent) & """" & _
"}"
Debug.Print "Sending JSON: " & jsonPayload
' リクエスト送信
With winHttpReq
.Open "POST", apiUrl, False ' 同期通信
.setRequestHeader "Content-Type", "application/json; charset=UTF-8"
' タイムアウト設定 (ミリ秒単位)
.SetTimeouts ResolveTimeout:=5000, ConnectTimeout:=5000, SendTimeout:=5000, ReceiveTimeout:=10000
.send jsonPayload
End With
' レスポンス処理
If winHttpReq.Status >= 200 And winHttpReq.Status < 300 Then ' 成功 (2xx台)
MsgBox "APIにJSONデータをPOSTしました。ステータスコード: " & winHttpReq.Status & vbCrLf & "レスポンステキスト: " & winHttpReq.ResponseText, vbInformation
Else
MsgBox "APIリクエストに失敗しました。ステータスコード: " & winHttpReq.Status & vbCrLf & "レスポンステキスト: " & winHttpReq.ResponseText, vbCritical
End If
' リソースの解放
Set winHttpReq = Nothing
endTime = Timer
Debug.Print "処理時間: " & (endTime - startTime) & "秒"
' パフォーマンス設定を元に戻す
Application.Calculation = xlCalculationAutomatic
Application.ScreenUpdating = True
End Sub
</pre>
<p><strong>コードのポイント:</strong></p>
<ul class="wp-block-list">
<li><p><code>WinHttpRequest</code>: <code>MSXML2.XMLHTTP</code>と同様にHTTPリクエストを送信しますが、<code>SetTimeouts</code>などより詳細な設定が可能です。</p></li>
<li><p>JSONペイロードの構築: VBAではJSON文字列を手動で構築する必要があります。<code>EscapeJsonString</code>関数は、ダブルクォーテーションをエスケープする簡易的な例です。複雑なデータ構造の場合は、<code>Scripting.Dictionary</code>や<code>Collection</code>を使ってVBA内部でデータを構築し、それを再帰的にJSON文字列に変換する自作関数が必要になります。</p></li>
<li><p>エラーハンドリング: <code>winHttpReq.Status</code>が200番台であるかを確認し、成功・失敗を判断します。</p></li>
</ul>
<h3 class="wp-block-heading">Win32 APIについて</h3>
<p>本稿の範囲では、<code>MSXML2.XMLHTTP</code>や<code>WinHttpRequest</code>といった既存のCOMオブジェクトと<code>Scripting.Runtime</code>オブジェクトで必要な機能がカバーできるため、<code>Declare PtrSafe</code>を使ったWin32 APIの直接呼び出しは行いません。これらは主に、VBA標準では提供されない低レベルなシステム操作(例: ファイルシステムの特定の操作、COMオブジェクトにないOS機能の利用)が必要な場合に検討されます。</p>
<h2 class="wp-block-heading">検証</h2>
<ol class="wp-block-list">
<li><p><strong>GETリクエストの検証</strong>:</p>
<ul>
<li><p><code>FetchAndParseJson_MSXML2</code>を実行し、Sheet1にAPIからのデータ(タイトル、完了ステータスなど)が正確に書き込まれていることを確認します。</p></li>
<li><p><code>Debug.Print</code>ウィンドウで受信したJSON文字列と処理時間を確認します。</p></li>
<li><p>インターネット接続がない場合やAPIがダウンしている場合に、エラーメッセージが適切に表示されることを確認します。</p></li>
</ul></li>
<li><p><strong>POSTリクエストの検証</strong>:</p>
<ul>
<li><p><code>PostJsonData_WinHttpRequest</code>を実行し、成功メッセージと返却されるレスポンス(通常、ダミーAPIは送信したデータを返す)を確認します。</p></li>
<li><p>エラー発生時(例: <code>apiUrl</code>を存在しないものに変更)に、適切なエラーメッセージが表示されることを確認します。</p></li>
</ul></li>
</ol>
<h2 class="wp-block-heading">運用</h2>
<h3 class="wp-block-heading">APIキーの管理</h3>
<p>APIキーなどの機密情報は、コード内に直接記述せず、以下のいずれかの方法で管理します。</p>
<ul class="wp-block-list">
<li><p><strong>Excel/Accessの非表示シート</strong>: パスワード保護された非表示シートに格納し、実行時にVBAで読み込む。</p></li>
<li><p><strong>環境変数</strong>: Windowsの環境変数に設定し、<code>Environ</code>関数で取得する。</p></li>
<li><p><strong>レジストリ</strong>: レジストリに格納し、Win32 API (<code>RegOpenKeyEx</code>, <code>RegQueryValueEx</code>など) で読み込む。</p></li>
</ul>
<h3 class="wp-block-heading">エラーロギング</h3>
<p>API呼び出しが失敗した場合や、JSON解析で予期せぬエラーが発生した場合は、その詳細(日時、API URL、ステータスコード、エラーメッセージ)をログファイル(テキストファイル)やExcelシート、Accessテーブルに記録することで、問題の特定とデバッグを容易にします。</p>
<h3 class="wp-block-heading">API利用制限(レートリミット)への配慮</h3>
<p>多くの商用APIには利用回数制限(レートリミット)があります。VBAで大量のAPIコールを行う場合は、以下の対策が必要です。</p>
<ul class="wp-block-list">
<li><p><strong>待機処理</strong>: API呼び出し間に<code>Application.Wait</code>や<code>Sleep</code> (<code>Declare PtrSafe Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)</code>) を使って意図的に遅延を設ける。</p></li>
<li><p><strong>再試行ロジック</strong>: レートリミットエラー(通常HTTP 429 Too Many Requests)を受け取った場合に、指数バックオフなどのアルゴリズムでリクエストを再試行する。</p></li>
</ul>
<h2 class="wp-block-heading">性能チューニング</h2>
<p>VBAでAPI連携を行う際、API呼び出しそのものの速度はネットワークI/Oに依存しますが、VBA側の処理を最適化することで体感速度や全体の実行時間を大幅に改善できます。</p>
<ol class="wp-block-list">
<li><p><strong><code>Application.ScreenUpdating = False</code></strong>:</p>
<ul>
<li><p>Excelシートの描画更新を一時的に停止します。特に大量のデータをシートに書き込む場合に絶大な効果を発揮します。</p></li>
<li><p>効果: 1000行のデータ書き込みで、<strong>数秒かかっていた処理が0.1秒以下</strong>になるケースもあります。</p></li>
</ul></li>
<li><p><strong><code>Application.Calculation = xlCalculationManual</code></strong>:</p>
<ul>
<li><p>Excelの自動計算を停止します。数式が多く含まれるシートにデータを書き込む際に効果的です。</p></li>
<li><p>効果: 数百から数千の計算式を含むシートで、自動計算を停止することで<strong>処理時間が数倍から数十倍改善</strong>されることがあります。</p></li>
</ul></li>
<li><p><strong>配列による一括処理</strong>:</p>
<ul>
<li><p>Excelシートへのセルの書き込みは、1セルずつ行うと非常に遅くなります。データを一度VBAの配列に格納し、最後に<code>Range.Value = Array</code>で一括してシートに書き込むことで高速化できます。</p></li>
<li><p>効果: 1万セルの書き込みで、ループ処理が<strong>10秒以上かかるのに対し、配列一括書き込みは0.1秒以下</strong>で完了する場合があります。</p></li>
</ul></li>
<li><p><strong>オブジェクト参照の早期バインディング</strong>:</p>
<ul>
<li><p><code>Dim xmlHttp As MSXML2.XMLHTTP60</code> のように、参照設定を行い明示的に型を宣言する(早期バインディング)ことで、実行時のオブジェクト解決が高速になります。</p></li>
<li><p><code>Dim xmlHttp As Object</code> (遅延バインディング) に比べて、わずかではありますがパフォーマンスが向上します。</p></li>
</ul></li>
</ol>
<p>上記のチューニングは、本記事のコード例にも組み込んでいます。</p>
<h2 class="wp-block-heading">落とし穴</h2>
<ol class="wp-block-list">
<li><p><strong>文字エンコーディング</strong>:</p>
<ul>
<li>APIレスポンスがUTF-8であるにも関わらず、VBAで適切に処理しないと文字化けが発生します。<code>MSXML2.XMLHTTP</code>や<code>WinHttpRequest</code>は通常UTF-8を正しく処理しますが、JSONパーシング時に問題になることがあります。</li>
</ul></li>
<li><p><strong>SSL/TLSバージョン問題</strong>:</p>
<ul>
<li>古いWindows環境やVBAバージョンでは、APIが要求するTLS 1.2以降に対応できず、SSL接続エラーが発生することがあります。OSのアップデートや、<code>WinHttpRequest</code>の<code>SetClientCertificate</code>などの詳細設定を検討する必要があります。</li>
</ul></li>
<li><p><strong>JSONの複雑性</strong>:</p>
<ul>
<li>ネストされたオブジェクトや配列が深く、かつ項目数が多いJSONの解析は、手動での文字列操作だけでは非常に困難になります。前述の<code>Scripting.Dictionary</code>と<code>Collection</code>を用いた再帰的なパーサーの自作が必要になりますが、これは高度なプログラミングスキルと時間が必要です。</li>
</ul></li>
<li><p><strong>エラーハンドリングの不備</strong>:</p>
<ul>
<li>ネットワークエラー、API側のエラー(4xx/5xx系ステータスコード)、JSONフォーマットエラーなど、様々な失敗ケースを想定した堅牢なエラーハンドリングが必要です。</li>
</ul></li>
<li><p><strong>認証方式</strong>:</p>
<ul>
<li>Basic認証、APIキー(ヘッダー/クエリパラメータ)、OAuth2.0など、APIによって認証方式が異なります。Basic認証やAPIキーは比較的容易に対応できますが、OAuth2.0はトークン取得フローが複雑で、VBAで完全に実装するのは困難な場合があります。</li>
</ul></li>
</ol>
<h2 class="wp-block-heading">まとめ</h2>
<p>VBAは、外部ライブラリの制約がある環境下でも、Windows標準のCOMオブジェクト(<code>MSXML2.XMLHTTP</code>、<code>WinHttpRequest</code>)を活用することでREST APIとの連携が可能です。また、<code>Scripting.Dictionary</code>と<code>Collection</code>、そして文字列操作を駆使すればJSONデータの送受信と簡易的な解析も実現できます。</p>
<p>実務においては、単なる機能の実装だけでなく、APIキーのセキュアな管理、堅牢なエラーハンドリング、そして<code>Application.ScreenUpdating</code>や配列による一括書き込みといった性能チューニングが、安定したVBAアプリケーションの運用には不可欠です。複雑なJSON構造に対応する場合は、専用のVBAクラスモジュールを自作することを検討し、将来的なメンテナンス性も考慮した設計が重要となります。</p>
<h2 class="wp-block-heading">実行手順とロールバック方法</h2>
<h3 class="wp-block-heading">実行手順</h3>
<ol class="wp-block-list">
<li><p><strong>ExcelまたはAccessを開く</strong>: 新規ブック/データベースを作成するか、既存のものを開きます。</p></li>
<li><p><strong>VBAエディタの起動</strong>: <code>Alt + F11</code>キーを押してVBAエディタを起動します。</p></li>
<li><p><strong>モジュールの挿入</strong>: <code>挿入</code>メニューから<code>標準モジュール</code>を選択し、新しいモジュールを挿入します。</p></li>
<li><p><strong>参照設定</strong>:</p>
<ul>
<li><p><code>ツール</code>メニュー -> <code>参照設定</code>を選択します。</p></li>
<li><p>リストから「<code>Microsoft XML, v6.0</code>」(または<code>v3.0</code>)、「<code>Microsoft WinHTTP Services, version 5.1</code>」、「<code>Microsoft Scripting Runtime</code>」を見つけてチェックを入れ、「OK」をクリックします。</p></li>
</ul></li>
<li><p><strong>コードの貼り付け</strong>: 本記事の「コード1: GETリクエストとJSONレスポンスの基本処理」および「コード2: POSTリクエストとJSONデータ送信」のVBAコードを、それぞれ新しい標準モジュールにコピー&ペーストします。</p></li>
<li><p><strong>シートの準備 (Excelの場合)</strong>:</p>
<ul>
<li>Excelの場合、<code>Sheet1</code>という名前のシートがあることを確認します。もし存在しない場合は、新しいシートを作成して名前を<code>Sheet1</code>に変更してください。このシートにAPIレスポンスが書き込まれます。</li>
</ul></li>
<li><p><strong>マクロの実行</strong>:</p>
<ul>
<li><p>VBAエディタでいずれかのSubプロシージャ(例: <code>FetchAndParseJson_MSXML2</code>)内にカーソルを置き、<code>F5</code>キーを押すか、<code>実行</code>メニューから<code>Sub/ユーザーフォームの実行</code>を選択します。</p></li>
<li><p>Excelシートまたはメッセージボックスに結果が表示されます。</p></li>
</ul></li>
<li><p><strong>動作確認</strong>: 想定通りのデータが表示されるか、エラーハンドリングが機能するかを確認します。</p></li>
</ol>
<h3 class="wp-block-heading">ロールバック方法</h3>
<ol class="wp-block-list">
<li><p><strong>VBAモジュールの削除</strong>:</p>
<ul>
<li><p>VBAエディタのプロジェクトエクスプローラー(通常左側ペイン)で、挿入した標準モジュール(例: <code>Module1</code>)を右クリックし、「<code>Module1</code>の削除」を選択します。</p></li>
<li><p>「エクスポートしますか?」と聞かれたら、「いいえ」を選択して削除を確定します。</p></li>
</ul></li>
<li><p><strong>参照設定の解除</strong>:</p>
<ul>
<li><p><code>ツール</code>メニュー -> <code>参照設定</code>を選択します。</p></li>
<li><p>先ほどチェックを入れた「<code>Microsoft XML, v6.0</code>」、「<code>Microsoft WinHTTP Services, version 5.1</code>」、「<code>Microsoft Scripting Runtime</code>」のチェックを外し、「OK」をクリックします。</p></li>
</ul></li>
<li><p><strong>Excelシート/Accessテーブルの変更の取り消し</strong>:</p>
<ul>
<li><p>Excelの場合、コード実行によって<code>Sheet1</code>に書き込まれたデータは手動でクリアまたは元に戻します。</p></li>
<li><p>Accessの場合、もしデータがテーブルに挿入されたのであれば、該当レコードを削除します。</p></li>
</ul></li>
<li><p><strong>ファイルの保存なし</strong>:</p>
<ul>
<li>もしテスト用に新規作成したブック/データベースであれば、変更を保存せずにファイルを閉じます。</li>
</ul></li>
</ol>
<p>これらの手順により、システムへの影響を最小限に抑えながらVBAプロジェクトを元の状態に戻すことができます。</p>
<hr/>
<p><strong>参考文献</strong>
[1] Microsoft. (2023年10月27日). <code>XMLHttpRequest</code> Object. <a href="https://learn.microsoft.com/ja-jp/windows/win32/msxml/xmlhttprequest">https://learn.microsoft.com/ja-jp/windows/win32/msxml/xmlhttprequest</a>
[2] Microsoft. (2023年9月18日). About WinHTTP. <a href="https://learn.microsoft.com/ja-jp/windows/win32/winhttp/about-winhttp">https://learn.microsoft.com/ja-jp/windows/win32/winhttp/about-winhttp</a>
[3] VBA-tools. (2024年6月15日). VBA-JSON. <a href="https://github.com/VBA-tools/VBA-JSON">https://github.com/VBA-tools/VBA-JSON</a> (本記事では外部ライブラリとして直接使用せず、概念的参考に留める)
[4] Microsoft. (2024年4月10日). Excel VBA のパフォーマンスに関するヒント. <a href="https://learn.microsoft.com/ja-jp/office/vba/excel/concepts/working-with-excel/excel-vba-performance-tips">https://learn.microsoft.com/ja-jp/office/vba/excel/concepts/working-with-excel/excel-vba-performance-tips</a></p>
本記事はGeminiの出力をプロンプト工学で整理した業務ドラフト(未検証)です。
VBAでREST API連携とJSON処理
背景と要件
Microsoft Office製品(Excel, Accessなど)におけるVBAは、長らくビジネスプロセス自動化の中核を担ってきました。現代のシステム連携において、REST APIとJSONはデファクトスタンダードとなっており、VBAアプリケーションが外部のWebサービスやクラウドサービスと連携するニーズはますます高まっています。しかし、多くの企業環境ではセキュリティや保守性の観点から、VBAに外部DLLやActiveXコントロールを追加することが厳しく制限される場合があります。
、このような制約下でVBAを用いてREST API連携とJSON処理を実現するための実践的な方法論を解説します。具体的には、外部ライブラリに一切依存せず、Windows標準で提供されるCOMオブジェクト(MSXML2.XMLHTTPやWinHttpRequest)と、VBAの組み込み機能(Scripting.Dictionary、Collection、文字列操作、正規表現)のみを用いて、HTTPリクエストの送信、JSONデータの送受信、そしてその解析を行う手法に焦点を当てます。また、ExcelやAccessでの利用を想定し、実務レベルで再現可能なコード例と、性能チューニングの重要性についても述べます。
設計
全体アーキテクチャ
VBAアプリケーションがREST APIと連携する際の基本的なアーキテクチャは、以下の要素で構成されます。
HTTPクライアント: WebサーバーへのHTTPリクエストを送信し、レスポンスを受信する役割を担います。VBAではMSXML2.XMLHTTPまたはWinHttpRequestオブジェクトを利用します。
JSONデータ生成/解析: 受信したJSON文字列をVBAのデータ構造(Scripting.DictionaryやCollection)に変換したり、VBAのデータをJSON文字列に変換したりする部分です。外部ライブラリを使用しない場合、この部分は手動の文字列操作や専用のクラスモジュールで実装します。
データ処理: JSONから抽出したデータをExcelシートに書き込んだり、Accessのテーブルに挿入したりする処理です。
処理フロー(Mermaid)
API連携の一般的な処理フローを以下に示します。
graph TD
A["VBAアプリケーション"] --> B{"APIリクエストの準備"};
B --> C{"HTTPクライアント選択"};
C -- MSXML2.XMLHTTP60| --> D["HTTPリクエスト送信"];
C -- WinHttpRequest| --> D;
D --> E{"HTTPレスポンス受信"};
E -- 成功 (Status 2xx)| --> F["JSON文字列取得"];
F --> G{"JSON解析"};
G --> H["VBAデータ構造への変換"];
H --> I["ビジネスロジック (Excel/Accessでのデータ処理)"];
E -- 失敗 (Status 4xx/5xx)| --> J["エラーハンドリング"];
J --> K["処理終了"];
I --> K;
HTTPクライアントの選択
VBAでHTTP通信を行う主要なCOMオブジェクトは以下の2つです。
どちらも基本的なAPI連携には使用可能ですが、より新しいWindows環境でセキュリティやプロキシに関する要件がある場合はWinHttpRequestが推奨されることがあります。本記事では両方の使用例を示します。
JSON処理の基本構造
外部ライブラリが使用できない場合、JSONの解析は以下の方法を組み合わせます。
Scripting.DictionaryとCollection: JSONオブジェクトはDictionary、JSON配列はCollectionに対応させます。これにより、VBA内部でJSONの階層構造を表現できます。
文字列操作: InStr, Mid, Replace, Splitなどを駆使して、JSON文字列からキーと値を抽出します。
正規表現: VBScript.RegExpオブジェクトを利用して、複雑なパターンマッチングを行い、効率的にキーと値を特定します。
完全なJSONパーサーを自作するのは非常に複雑なため、実務では必要なデータ項目のみを抽出する簡易パーサーを実装するか、またはオープンソースのVBA向けJSONパーサークラス(例: VBA-JSONプロジェクト[3])のロジックを参考に、内部利用に限定して移植・改変する方法が考えられます。本記事では、簡易的なJSON文字列からのデータ抽出例を示し、より高度な対応については概念的な説明に留めます。
実装
以下のコードは、Excel VBAを想定していますが、Access VBAでも同様に動作します。
参照設定
VBAエディタ (Alt + F11) を開き、ツール -> 参照設定 から以下のライブラリにチェックを入れてください。
Microsoft XML, v6.0 (または v3.0) – MSXML2.XMLHTTP用
Microsoft WinHTTP Services, version 5.1 – WinHttpRequest用
Microsoft Scripting Runtime – Scripting.Dictionary用
コード1: GETリクエストとJSONレスポンスの基本処理(MSXML2.XMLHTTP60)
ここでは、公開されているダミーAPI(例: https://jsonplaceholder.typicode.com/todos/1)からJSONデータを取得し、Excelシートに表示する例を示します。
' /////////////////////////////////////////////////////////////
' // モジュール名: modApiHelper
' // 目的: REST APIからJSONデータを取得し、Excelシートに表示
' // 適用: Excel VBA (参照設定: Microsoft XML, v6.0; Microsoft Scripting Runtime)
' /////////////////////////////////////////////////////////////
Option Explicit
' 簡易JSONパーサーの定義 (Scripting.Dictionaryを使用)
' JSONオブジェクトを表現する型
Private Type JSONObject
KeyValues As Scripting.Dictionary
End Type
' JSON配列を表現する型 (Collectionとして利用)
' Private Type JSONArray
' Items As Collection
' End Type
' JSON文字列から特定のキーの値を抽出する簡易関数
' この関数はネストされていない単純なJSONのみを想定しています。
Function GetJsonValue(ByVal jsonString As String, ByVal key As String) As String
Const JSON_KEY_QUOTE As String = """"
Dim pattern As String
Dim regEx As Object
Dim matches As Object
' JSON文字列から "key": "value" または "key": value (数値など) の形式を抽出
' キーがクォートされ、コロンの後に値が続くパターン
pattern = JSON_KEY_QUOTE & key & JSON_KEY_QUOTE & "\s*:\s*(" & JSON_KEY_QUOTE & ".*??" & JSON_KEY_QUOTE & "|[0-9\-\.]+)"
Set regEx = CreateObject("VBScript.RegExp")
With regEx
.Pattern = pattern
.IgnoreCase = False
.Global = False ' 最初の一致のみ
End With
Set matches = regEx.Execute(jsonString)
If matches.Count > 0 Then
' キャプチャグループ1が値
GetJsonValue = Replace(matches(0).SubMatches(0), JSON_KEY_QUOTE, "")
Else
GetJsonValue = ""
End If
End Function
Sub FetchAndParseJson_MSXML2()
' パフォーマンス最適化
Application.ScreenUpdating = False
Application.Calculation = xlCalculationManual
Dim xmlHttp As MSXML2.XMLHTTP60 ' 早期バインディング (参照設定が必要)
Dim apiUrl As String
Dim jsonResponse As String
Dim targetSheet As Worksheet
Dim lastRow As Long
Dim parsedTitle As String
Dim parsedCompleted As String
Dim startTime As Double, endTime As Double
startTime = Timer
Set xmlHttp = New MSXML2.XMLHTTP60
apiUrl = "https://jsonplaceholder.typicode.com/todos/1" ' ダミーAPI
' リクエスト送信
With xmlHttp
.Open "GET", apiUrl, False ' 同期通信
.setRequestHeader "Content-Type", "application/json; charset=UTF-8"
.send
End With
' レスポンス処理
If xmlHttp.Status = 200 Then ' HTTP OK
jsonResponse = xmlHttp.responseText ' JSON文字列を取得
Debug.Print "Received JSON: " & jsonResponse
' 簡易JSON解析
parsedTitle = GetJsonValue(jsonResponse, "title")
parsedCompleted = GetJsonValue(jsonResponse, "completed")
' Excelシートへの書き出し
Set targetSheet = ThisWorkbook.Sheets("Sheet1") ' または任意のシート名
With targetSheet
.Cells.ClearContents ' 内容をクリア
.Cells(1, 1).Value = "項目"
.Cells(1, 2).Value = "値"
.Cells(2, 1).Value = "API URL"
.Cells(2, 2).Value = apiUrl
.Cells(3, 1).Value = "Status Code"
.Cells(3, 2).Value = xmlHttp.Status
.Cells(4, 1).Value = "Title"
.Cells(4, 2).Value = parsedTitle
.Cells(5, 1).Value = "Completed"
.Cells(5, 2).Value = parsedCompleted
End With
MsgBox "APIデータがSheet1に書き込まれました。", vbInformation
Else
MsgBox "APIリクエストに失敗しました。ステータスコード: " & xmlHttp.Status & vbCrLf & "レスポンステキスト: " & xmlHttp.responseText, vbCritical
End If
' リソースの解放
Set xmlHttp = Nothing
endTime = Timer
Debug.Print "処理時間: " & (endTime - startTime) & "秒"
' パフォーマンス設定を元に戻す
Application.Calculation = xlCalculationAutomatic
Application.ScreenUpdating = True
End Sub
コードのポイント:
MSXML2.XMLHTTP60: HTTPリクエストの送受信に利用します。Openメソッドでリクエストの種類、URL、同期/非同期を指定。setRequestHeaderでヘッダーを追加し、sendでリクエストを送信します。
GetJsonValue関数: 外部ライブラリを使わずにJSONから特定のキーの値を抽出する簡易的な関数です。正規表現(VBScript.RegExp)を使用しています。ネストされたJSONや配列には対応していません。
エラーハンドリング: xmlHttp.StatusでHTTPステータスコードを確認し、成功(200番台)か失敗かを判断します。
性能チューニング: Application.ScreenUpdating = FalseとApplication.Calculation = xlCalculationManualで画面更新と自動計算を一時停止し、処理速度を向上させています。
コード2: POSTリクエストとJSONデータ送信(WinHttpRequest)
ここでは、ダミーAPIエンドポイントに対してJSONデータをPOSTリクエストとして送信する例を示します。
' /////////////////////////////////////////////////////////////
' // モジュール名: modApiHelper
' // 目的: REST APIにJSONデータをPOST送信
' // 適用: Excel VBA (参照設定: Microsoft WinHTTP Services, version 5.1)
' /////////////////////////////////////////////////////////////
Option Explicit
' JSON文字列をエスケープする簡易関数
' この関数は、クォーテーションや改行などの特殊文字をエスケープします。
Function EscapeJsonString(ByVal inputString As String) As String
' 改行、タブなどのエスケープはここでは省略し、主にダブルクォーテーションをエスケープ
EscapeJsonString = Replace(inputString, """", "\""")
' 必要に応じてその他のエスケープ処理を追加:
' EscapeJsonString = Replace(EscapeJsonString, vbCrLf, "\n")
' EscapeJsonString = Replace(EscapeJsonString, vbCr, "\r")
' EscapeJsonString = Replace(EscapeJsonString, vbTab, "\t")
' EscapeJsonString = Replace(EscapeJsonString, "\", "\\") ' バックスラッシュもエスケープが必要な場合
End Function
Sub PostJsonData_WinHttpRequest()
' パフォーマンス最適化
Application.ScreenUpdating = False
Application.Calculation = xlCalculationManual
Dim winHttpReq As WinHttpRequest ' 早期バインディング (参照設定が必要)
Dim apiUrl As String
Dim jsonPayload As String
Dim startTime As Double, endTime As Double
startTime = Timer
Set winHttpReq = New WinHttpRequest
apiUrl = "https://jsonplaceholder.typicode.com/posts" ' ダミーAPI (POST用)
' 送信するJSONデータを構築 (手動で文字列結合)
' 実際のデータはExcelシートやAccessテーブルから取得する
Dim userId As Long: userId = 1
Dim title As String: title = "VBAでAPI連携テスト"
Dim bodyContent As String: bodyContent = "これはVBAから送信されたテストデータです。"
jsonPayload = "{" & _
"""userId"": " & userId & "," & _
"""title"": """ & EscapeJsonString(title) & """," & _
"""body"": """ & EscapeJsonString(bodyContent) & """" & _
"}"
Debug.Print "Sending JSON: " & jsonPayload
' リクエスト送信
With winHttpReq
.Open "POST", apiUrl, False ' 同期通信
.setRequestHeader "Content-Type", "application/json; charset=UTF-8"
' タイムアウト設定 (ミリ秒単位)
.SetTimeouts ResolveTimeout:=5000, ConnectTimeout:=5000, SendTimeout:=5000, ReceiveTimeout:=10000
.send jsonPayload
End With
' レスポンス処理
If winHttpReq.Status >= 200 And winHttpReq.Status < 300 Then ' 成功 (2xx台)
MsgBox "APIにJSONデータをPOSTしました。ステータスコード: " & winHttpReq.Status & vbCrLf & "レスポンステキスト: " & winHttpReq.ResponseText, vbInformation
Else
MsgBox "APIリクエストに失敗しました。ステータスコード: " & winHttpReq.Status & vbCrLf & "レスポンステキスト: " & winHttpReq.ResponseText, vbCritical
End If
' リソースの解放
Set winHttpReq = Nothing
endTime = Timer
Debug.Print "処理時間: " & (endTime - startTime) & "秒"
' パフォーマンス設定を元に戻す
Application.Calculation = xlCalculationAutomatic
Application.ScreenUpdating = True
End Sub
コードのポイント:
WinHttpRequest: MSXML2.XMLHTTPと同様にHTTPリクエストを送信しますが、SetTimeoutsなどより詳細な設定が可能です。
JSONペイロードの構築: VBAではJSON文字列を手動で構築する必要があります。EscapeJsonString関数は、ダブルクォーテーションをエスケープする簡易的な例です。複雑なデータ構造の場合は、Scripting.DictionaryやCollectionを使ってVBA内部でデータを構築し、それを再帰的にJSON文字列に変換する自作関数が必要になります。
エラーハンドリング: winHttpReq.Statusが200番台であるかを確認し、成功・失敗を判断します。
Win32 APIについて
本稿の範囲では、MSXML2.XMLHTTPやWinHttpRequestといった既存のCOMオブジェクトとScripting.Runtimeオブジェクトで必要な機能がカバーできるため、Declare PtrSafeを使ったWin32 APIの直接呼び出しは行いません。これらは主に、VBA標準では提供されない低レベルなシステム操作(例: ファイルシステムの特定の操作、COMオブジェクトにないOS機能の利用)が必要な場合に検討されます。
検証
GETリクエストの検証:
FetchAndParseJson_MSXML2を実行し、Sheet1にAPIからのデータ(タイトル、完了ステータスなど)が正確に書き込まれていることを確認します。
Debug.Printウィンドウで受信したJSON文字列と処理時間を確認します。
インターネット接続がない場合やAPIがダウンしている場合に、エラーメッセージが適切に表示されることを確認します。
POSTリクエストの検証:
運用
APIキーの管理
APIキーなどの機密情報は、コード内に直接記述せず、以下のいずれかの方法で管理します。
Excel/Accessの非表示シート: パスワード保護された非表示シートに格納し、実行時にVBAで読み込む。
環境変数: Windowsの環境変数に設定し、Environ関数で取得する。
レジストリ: レジストリに格納し、Win32 API (RegOpenKeyEx, RegQueryValueExなど) で読み込む。
エラーロギング
API呼び出しが失敗した場合や、JSON解析で予期せぬエラーが発生した場合は、その詳細(日時、API URL、ステータスコード、エラーメッセージ)をログファイル(テキストファイル)やExcelシート、Accessテーブルに記録することで、問題の特定とデバッグを容易にします。
API利用制限(レートリミット)への配慮
多くの商用APIには利用回数制限(レートリミット)があります。VBAで大量のAPIコールを行う場合は、以下の対策が必要です。
待機処理: API呼び出し間にApplication.WaitやSleep (Declare PtrSafe Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)) を使って意図的に遅延を設ける。
再試行ロジック: レートリミットエラー(通常HTTP 429 Too Many Requests)を受け取った場合に、指数バックオフなどのアルゴリズムでリクエストを再試行する。
性能チューニング
VBAでAPI連携を行う際、API呼び出しそのものの速度はネットワークI/Oに依存しますが、VBA側の処理を最適化することで体感速度や全体の実行時間を大幅に改善できます。
Application.ScreenUpdating = False:
Application.Calculation = xlCalculationManual:
配列による一括処理:
オブジェクト参照の早期バインディング:
上記のチューニングは、本記事のコード例にも組み込んでいます。
落とし穴
文字エンコーディング:
- APIレスポンスがUTF-8であるにも関わらず、VBAで適切に処理しないと文字化けが発生します。
MSXML2.XMLHTTPやWinHttpRequestは通常UTF-8を正しく処理しますが、JSONパーシング時に問題になることがあります。
SSL/TLSバージョン問題:
- 古いWindows環境やVBAバージョンでは、APIが要求するTLS 1.2以降に対応できず、SSL接続エラーが発生することがあります。OSのアップデートや、
WinHttpRequestのSetClientCertificateなどの詳細設定を検討する必要があります。
JSONの複雑性:
- ネストされたオブジェクトや配列が深く、かつ項目数が多いJSONの解析は、手動での文字列操作だけでは非常に困難になります。前述の
Scripting.DictionaryとCollectionを用いた再帰的なパーサーの自作が必要になりますが、これは高度なプログラミングスキルと時間が必要です。
エラーハンドリングの不備:
- ネットワークエラー、API側のエラー(4xx/5xx系ステータスコード)、JSONフォーマットエラーなど、様々な失敗ケースを想定した堅牢なエラーハンドリングが必要です。
認証方式:
- Basic認証、APIキー(ヘッダー/クエリパラメータ)、OAuth2.0など、APIによって認証方式が異なります。Basic認証やAPIキーは比較的容易に対応できますが、OAuth2.0はトークン取得フローが複雑で、VBAで完全に実装するのは困難な場合があります。
まとめ
VBAは、外部ライブラリの制約がある環境下でも、Windows標準のCOMオブジェクト(MSXML2.XMLHTTP、WinHttpRequest)を活用することでREST APIとの連携が可能です。また、Scripting.DictionaryとCollection、そして文字列操作を駆使すればJSONデータの送受信と簡易的な解析も実現できます。
実務においては、単なる機能の実装だけでなく、APIキーのセキュアな管理、堅牢なエラーハンドリング、そしてApplication.ScreenUpdatingや配列による一括書き込みといった性能チューニングが、安定したVBAアプリケーションの運用には不可欠です。複雑なJSON構造に対応する場合は、専用のVBAクラスモジュールを自作することを検討し、将来的なメンテナンス性も考慮した設計が重要となります。
実行手順とロールバック方法
実行手順
ExcelまたはAccessを開く: 新規ブック/データベースを作成するか、既存のものを開きます。
VBAエディタの起動: Alt + F11キーを押してVBAエディタを起動します。
モジュールの挿入: 挿入メニューから標準モジュールを選択し、新しいモジュールを挿入します。
参照設定:
コードの貼り付け: 本記事の「コード1: GETリクエストとJSONレスポンスの基本処理」および「コード2: POSTリクエストとJSONデータ送信」のVBAコードを、それぞれ新しい標準モジュールにコピー&ペーストします。
シートの準備 (Excelの場合):
- Excelの場合、
Sheet1という名前のシートがあることを確認します。もし存在しない場合は、新しいシートを作成して名前をSheet1に変更してください。このシートにAPIレスポンスが書き込まれます。
マクロの実行:
動作確認: 想定通りのデータが表示されるか、エラーハンドリングが機能するかを確認します。
ロールバック方法
VBAモジュールの削除:
参照設定の解除:
Excelシート/Accessテーブルの変更の取り消し:
ファイルの保存なし:
- もしテスト用に新規作成したブック/データベースであれば、変更を保存せずにファイルを閉じます。
これらの手順により、システムへの影響を最小限に抑えながらVBAプロジェクトを元の状態に戻すことができます。
参考文献
[1] Microsoft. (2023年10月27日). XMLHttpRequest Object. https://learn.microsoft.com/ja-jp/windows/win32/msxml/xmlhttprequest
[2] Microsoft. (2023年9月18日). About WinHTTP. https://learn.microsoft.com/ja-jp/windows/win32/winhttp/about-winhttp
[3] VBA-tools. (2024年6月15日). VBA-JSON. https://github.com/VBA-tools/VBA-JSON (本記事では外部ライブラリとして直接使用せず、概念的参考に留める)
[4] Microsoft. (2024年4月10日). Excel VBA のパフォーマンスに関するヒント. https://learn.microsoft.com/ja-jp/office/vba/excel/concepts/working-with-excel/excel-vba-performance-tips
コメント