【入門編】JSON形式の設定ファイルから定数を読み込む:VBAでの外部設定管理の自動化 – Excel VBA解析バイブル

スポンサーリンク

こんにちは!現場のシステム開発で日々VBAや様々なAPIと格闘しているエンジニアの先輩です。

「マクロの記録」は卒業したけれど、コードの中に「集計対象のフォルダパス」や「社内システムの接続URL」といった設定値を直接書き込んでいませんか?そして、担当者が変わったりサーバーが移転したりするたびに、VBAのコードを開いて書き直していませんか?

……もし心当たりがあるなら、ここをクリアすることであなたのVBAスキルは一気に「プロの領域」へジャンプアップしますよ。

今回は、コードの外側にある 「JSON形式の設定ファイル」 からデータを読み込み、VBAの定数のように動的に扱う極限のテクニックを伝授します。ここをマスターすれば、コードを1行も書き換えずに挙動を変えられる、メンテナンス性の高いシステムが作れるようになります。

なぜコードの中に設定値を書いてはいけないのか?

プログラミングの世界では、「プログラムのロジック(処理)」と「データ(設定値)」は完全に分離すべきという鉄則があります。

これを「ハードコーディングの排除」と呼びます。もし以下のような状態になっているなら、少し危険信号です。

  • 「来月から共有フォルダのパスが変わるから、全ツールのVBAを書き直さなきゃ……」
  • 「テスト環境と本番環境で、接続先URLを手動で書き換えてから実行している」

こんな時、設定を「JSON(ジェイソン)」という軽量なテキストファイルに外出ししておけば、VBAのコードはいじらず、メモ帳でJSONを書き換えるだけで対応完了になります。

そもそも「JSON」とは何か?

JSON(JavaScript Object Notation)とは、データ構造をシンプルに表現するためのテキスト形式です。キーと値のペアで構成されており、人間にも非常に読みやすいのが特徴です。

実際のJSONファイル(`config.json`)のイメージを見てみましょう。

{
“CompanyName”: “株式会社テックフロンティア”,
“TimeoutSeconds”: 30,
“TargetFolderPath”: “C:\\Works\\DataExport\\”,
“IsDebugMode”: true
}

たったこれだけです。文字列、数値、真偽値(True/False)といったデータ型をそのまま表現できるため、VBAの設定ファイルとしてはこれ以上ないほど適しています。

VBAでJSONをどうやって読み込むのか?(超重要アプローチ)

実は、VBAには標準の機能だけでJSONをパース(解析)する機能がありません。ここで多くの初学者が「VBAでJSONなんて無理だ」と諦めてしまいます。

しかし、世の中のシニアエンジニアたちはどうしているか?
Windowsに標準搭載されている強力なオブジェクト、またはVBA用の軽量なJSONパーサー(VBA-JSONなど)を組み合わせて華麗に解決しています。

今回は、追加のライブラリインストール不要で、今すぐWindows環境(※今回はモダンなアプローチとして、VBAからJScript/IEコンポーネント、または標準的なファイル読み込みを応用する手法)で動かせる、最も実用的なアプローチを解説します。

準備:同じフォルダに設定ファイルを作る

まず、Excelファイルと同じ階層に `config.json` という名前で、先ほどのJSONテキストを保存したファイルを用意してください。

実装コード:JSONから設定値を読み込む全手順

それでは、実際にExcelの標準モジュールに貼り付けて動かせるコードを見ていきましょう。

今回は、VBAからファイルシステムオブジェクト(FSO)を使ってテキストを読み込み、VBA標準の簡易的な文字列置換や、あるいは確実な解析を行うためのプログラミングを組み立てます。

Option Explicit

‘ =====================================================================
‘ テーマ: JSON形式の設定ファイルから定数を動的に読み込む
‘ 執筆者: チーフアーキテクト先輩
‘ =====================================================================

‘ グローバル(あるいはモジュールレベル)で設定値を保持する変数
‘ ※VBAのConstはコンパイル時に決まる必要があるため、
‘  動的読み込みの場合は「読み取り専用の変数(Public変数)」として扱います。
Public CONFIG_CompanyName As String
Public CONFIG_Timeout As Long
Public CONFIG_FolderPath As String
Public CONFIG_IsDebug As Boolean

Sub Main_RunProcess()
‘ 1. 設定ファイルの読み込みを実行
If Not LoadConfiguration() Then
MsgBox “設定ファイルの読み込みに失敗したため、処理を中断します。”, vbCritical, “致命的エラー”
Exit Sub
End If

‘ 2. 読み込んだ「動的定数」を使って処理を実行
MsgBox “設定ファイルを正常に読み込みました!” & vbCrLf & _
“会社名: ” & CONFIG_CompanyName & vbCrLf & _
“タイムアウト: ” & CONFIG_Timeout & “秒” & vbCrLf & _
“フォルダ: ” & CONFIG_FolderPath & vbCrLf & _
“デバッグモード: ” & IIf(CONFIG_IsDebug, “ON”, “OFF”), _
vbInformation, “実行成功”

‘ ここに実際の業務ロジック(データの集計やAPI連携など)を記述していきます
End Sub

‘ ———————————————————————
‘ 関数名: LoadConfiguration
‘ 概要 : 同階層の config.json を読み込み、メモリ上に展開する
‘ ———————————————————————
Function LoadConfiguration() As Boolean
On Error GoTo ErrorHandler

Dim fso As Object
Dim ts As Object
Dim jsonText As String
Dim configFilePath As String

‘ Excelファイルと同じパスにある “config.json” のパスを特定
configFilePath = ThisWorkbook.Path & “\config.json”

‘ ファイルが存在するかチェック
Set fso = CreateObject(“Scripting.FileSystemObject”)
If Not fso.FileExists(configFilePath) Then
MsgBox “設定ファイルが見つかりません: ” & vbCrLf & configFilePath, vbExclamation, “ファイルエラー”
LoadConfiguration = False
Exit Function
End If

‘ JSONファイルをテキストとして読み込む(UTF-8対応が必要な場合はADODB.Stream推奨ですが、今回は標準的FSO)
Set ts = fso.OpenTextFile(configFilePath, 1, False) ‘ 1 = ForReading
jsonText = ts.ReadAll
ts.Close

‘ —————————————————————-5
‘ 【簡易JSONパーサーの代用:正規表現や文字列抽出による実装】
‘ 外部ライブラリを入れずにVBA単体で動かすため、キーを狙い撃ちで抽出します
‘ —————————————————————–
CONFIG_CompanyName = ExtractJsonValue(jsonText, “CompanyName”, “String”)
CONFIG_Timeout = CLng(ExtractJsonValue(jsonText, “TimeoutSeconds”, “Number”))
CONFIG_FolderPath = ExtractJsonValue(jsonText, “TargetFolderPath”, “String”)

Dim debugStr As String
debugStr = LCase(Trim(ExtractJsonValue(jsonText, “IsDebugMode”, “Boolean”)))
CONFIG_IsDebug = (debugStr = “true”)

LoadConfiguration = True
Exit Function

ErrorHandler:
MsgBox “設定ファイルの解析中にエラーが発生しました。” & vbCrLf & _
“エラー番号: ” & Err.Number & vbCrLf & _
“エラー内容: ” & Err.Description, vbCritical, “パースエラー”
LoadConfiguration = False
End Function

‘ ———————————————————————
‘ 補助関数: JSONテキストから指定したキーの値を強引かつ確実に抜き出す極意
‘ ———————————————————————
Function ExtractJsonValue(ByVal json As String, ByVal key As String, ByVal valType As String) As String
Dim p1 As Long, p2 As Long
Dim searchKey As String

‘ キーのパターンを作成 (例: “CompanyName”: )
searchKey = “””” & key & “”””
p1 = InStr(1, json, searchKey)

If p1 = 0 Then
ExtractJsonValue = “”
Exit Function
End If

‘ コロンの位置を探す
p1 = InStr(p1, json, “:”)
If p1 = 0 Then Exit Function

‘ 値の開始位置までポインタを進める
p1 = p1 + 1

‘ データ型に応じた終端文字の判定
If valType = “String” Then
‘ 文字列の場合は最初のダブルクォーテーションを探す
p1 = InStr(p1, json, “”””) + 1
p2 = InStr(p1, json, “”””)
ExtractJsonValue = Mid(json, p1, p2 – p1)
‘ JSONのエスケープされたバックスラッシュ(\\)を通常のパス区切り(\)に戻す
ExtractJsonValue = Replace(ExtractJsonValue, “\\”, “\”)
Else
‘ 数値や真偽値の場合は、カンマ(,) または 波括弧の閉じ(}) までを取得
Dim c1 As Long, c2 As Long
c1 = InStr(p1, json, “,”)
c2 = InStr(p1, json, “}”)

If c1 = 0 Then c1 = 999999
If c2 = 0 Then c2 = 999999

If c1 < c2 Then p2 = c1 Else p2 = c2 End If ExtractJsonValue = Trim(Mid(json, p1, p2 - p1)) End If End Function ---

ここで陥りやすい「罠」とエンジニアの知見

このコードを実装する上で、現場でよくあるハマりポイントをいくつか共有しておきます。ここを知っているだけで、デバッグの時間が何時間も節約できます。

1. パスの記述における「エスケープ文字」の罠

JSONやプログラミングの世界では、円マーク(`\`)は特殊な意味を持つ「エスケープ文字」として扱われます。そのため、JSON内でWindowsのフォルダパスを指定するときは、`C:\Works\` ではなく、`C:\\Works\\` と「2回重ねる(バックスラッシュをエスケープする)」必要があります。
コード内の `Replace(ExtractJsonValue, “\\”, “\”)` は、このJSON特有の仕様をVBA側で綺麗に補正するためのプロの技です。

2. 文字コード(UTF-8)の壁

もしJSONファイルに日本語(会社名など)を含める場合、メモ帳で普通に保存するとANSI(Shift-JIS)になってしまい、環境によっては文字化けします。
JSONの標準規格は UTF-8(BOMなし) です。メモ帳で保存する際は、文字コードを必ず「UTF-8」に指定して保存するように運用ルールを定めましょう。

まとめ:この先にある「真の自動化」

お疲れ様でした!ここまで理解できれば、あなたのVBAコードは単なる「マクロの塊」から、保守性の高い「エンタープライズ・アプリケーション」へと進化しています。

  • コードの変更なしで環境切り替えができる
  • 非エンジニアのメンバーでも、メモ帳から設定を変更できる
  • ハードコーディングによるバグのリスクから解放される

ここをクリアすれば、Excel VBAの基本はもうバッチリ、胸を張って「プログラミングができる」と言えますよ。
ぜひ明日の業務から、あなたのツールにこの「外部設定ファイル連携」を取り入れてみてください。圧倒的な快適さに驚くはずです。それでは、また次の極限知見でお会いしましょう!

タイトルとURLをコピーしました