こんにちは!Excel VBAの世界へようこそ。
これまで「マクロの記録」を使って、ボタン一つで定型作業を動かせるようになったあなた。素晴らしいステップアップです!
でも、こんな風に悩んだことはありませんか?
「社内のサーバーが変わるたびに、VBAのコードを書き直して配り直すのが面倒……」
「テスト環境と本番環境で、接続先URLやファイルパスをスマートに切り替えたい……」
コードの中に直接、パスやURLを書き込んでしまう(これを「ハードコーディング」と言います)と、環境が変わるたびにソースコードを修正して、全員に配布し直すという地獄の作業が待っています。
今回は、この呪縛からあなたを完全に解放する「定数管理の外部化」というプロの技を授けましょう。設定値はすべて「JSONファイル」という外の世界に追い出し、VBA側はそれをエレガントに読み込んでメモリ上に保持する――。
ここをクリアすれば、あなたのVBAスキルは「初学者」の域を脱し、ワンランク上の「エンジニア」へと大きく前進します。一緒にマスターしていきましょう!
—
1. なぜ「外部化」が必要なのか?(設計思想の話)
まずは、イメージ図を見てください。
【今まで(ハードコーディング)】
[VBAコード] ──(中に直書き)──> 接続先、パス、期限など
※環境が変わるたびに、全員分のコード修正・再配布が必要…(涙)
【これから(外部化・モダン設計)】
[VBAコード] <──(実行時に読み込み)── [設定ファイル (config.json)]
※環境が変わったら「jsonファイル」を書き換えるだけ!VBAは無修正でOK!
プログラミングの世界では、「ロジック(処理)」と「データ(設定値)」は完全に分離すべきという大原則があります。
設定値を外部のJSON(ジェイソン)ファイルに追い出すことで、VBAのコード自体は「環境に依存しない美しい状態」を保つことができるのです。
—
2. 準備するファイルはこの2つ!
今回は、デスクトップなどの同じフォルダ内に、以下の2つのファイルを用意してください。
1. `ConfigManager.xlsm` (今回の主役となるExcelマクロファイル)
2. `config.json` (設定値を書き込んだ外部ファイル)
準備①:外部設定ファイル `config.json` を作る
メモ帳を開いて、以下のテキストを貼り付け、ファイル名を `config.json` としてExcelと同じフォルダに保存してください。
{
“Environment”: “Production”,
“TimeoutSeconds”: 30,
“ExportFolderPath”: “C:\\Work\\Output\\”,
“AdminEmail”: “admin@example.com”
}
※これが、今回VBAに読み込ませる「設定のデータ」です。
—
3. VBAでJSONをどう扱うか?(構造体の活用)
VBAには、JavaScriptのように標準でJSONをパース(解析)する便利な機能がありません。そのため、VBAの「標準モジュール」と「ユーザー定義型(Type)」を組み合わせて、きれいな構造体として保持させます。
以下の手順で、VBAエディタ(Alt + F11)を開き、標準モジュールを1つ挿入してください。
実装コード
以下のコードを丸ごと標準モジュールに貼り付けてください。コード内のコメントに、分かりやすい解説をみっちり仕込んでいます。
Option Explicit
‘ ==========================================================
‘ 【設定値を保持する構造体(ユーザー定義型)の定義】
‘ モジュールの最上部に書くことで、この中身がそのまま
‘ アプリケーション全体の「設定の設計図」になります。
‘ ==========================================================
Public Type AppConfig
Environment As String
TimeoutSeconds As Long
ExportFolderPath As String
AdminEmail As String
‘ ↑ ここに項目を追加していくだけで、大規模な設定にも対応できます!
End Type
‘ グローバル変数としてメモリ上に保持(実行中はいつでも参照可能)
Public G_Config As AppConfig
‘ ==========================================================
‘ メイン実行プロシージャ
‘ ==========================================================
Sub Main_LoadConfigAndRun()
Dim configPath As String
‘ 1. config.json のパスを特定(Excelファイルと同じ階層にある前提)
configPath = ThisWorkbook.Path & “\config.json”
‘ 2. ファイルが存在するかチェック(初心者が陥るエラーの9割はこれがないこと!)
If Dir(configPath) = “” Then
MsgBox “致命的なエラー: 設定ファイルが見つかりません。” & vbCrLf & _
“配置場所: ” & configPath, vbCritical, “ファイル消失”
Exit Sub
End If
‘ 3. JSONファイルから設定を読み込み、構造体に格納する
G_Config = ReadConfigFromJson(configPath)
‘ 4. 読み込めたかテスト表示(ちゃんと取れているか確認!)
MsgBox “設定の読み込みに成功しました!” & vbCrLf & _
“———————————–” & vbCrLf & _
“動作環境: ” & G_Config.Environment & vbCrLf & _
“タイムアウト: ” & G_Config.TimeoutSeconds & “秒” & vbCrLf & _
“出力先: ” & G_Config.ExportFolderPath & vbCrLf & _
“管理者: ” & G_Config.AdminEmail, _
vbInformation, “ロード完了”
‘ — ここから先は、G_Config.ExportFolderPath のように、
‘ — いつでもどこでも安全に設定値を呼び出して業務処理を行えます!
‘ Call DoActualBusinessLogic(G_Config)
End Sub
‘ ==========================================================
‘ 【補助関数】JSONファイルを読み込んで構造体にマッピングする関数
‘ ※今回はVBA単体で動かすため、簡易的にテキストとして読み込み、
‘ 文字列置換や簡易パースを行うロジックにしています。
‘ ==========================================================
Function ReadConfigFromJson(filePath As String) As AppConfig
Dim fileNum As Integer
Dim fileContent As String
Dim conf As AppConfig
‘ テキストファイルとして開く
fileNum = FreeFile
Open filePath For Input As #fileNum
fileContent = Input(LOF(fileNum), fileNum)
Close #fileNum
‘ 【実務的なワンポイント】
‘ 本格的なJSONライブラリ(VBA-JSON等)を使うのがベストですが、
“今回は初心者の方でも外部参照なしで動かせるよう、
‘ 簡易的に値を抽出する正規表現や文字列操作の代わりとして、
‘ 自前でパースするロジック(あるいは簡易値取得)をイメージしてください。
‘ 実際には、以下のように値を取り出します(今回は疑似的に値をセット)。
‘ ※実務ではVBA-JSONライブラリの利用を強く推奨しますが、
‘ 概念として「ファイルの中身を読み解いて構造体に入れる」流れはこれです。
‘ 今回は確実に動かすため、シンプルなテキスト解析の代わりとして
‘ 各項目をJSONから切り出すスマートな自作パーサを内包させます。
conf.Environment = ExtractJsonValue(fileContent, “Environment”)
conf.TimeoutSeconds = CLng(ExtractJsonValue(fileContent, “TimeoutSeconds”))
conf.ExportFolderPath = ExtractJsonValue(fileContent, “ExportFolderPath”)
conf.AdminEmail = ExtractJsonValue(fileContent, “AdminEmail”)
ReadConfigFromJson = conf
End Function
‘ ==========================================================
‘ 【プライベート関数】JSON文字列から指定したキーの値を取り出す汎用ロジック
‘ ==========================================================
Private Function ExtractJsonValue(json As String, key As String) As String
Dim p1 As Long, p2 As Long
Dim targetKey As String
targetKey = “””” & key & “”””
p1 = InStr(json, targetKey)
If p1 = 0 Then Exit Function
‘ コロンの位置を探す
p1 = InStr(p1, json, “:”)
If p1 = 0 Then Exit Function
‘ 値の開始位置(ダブルクォーテーションか数値の始まり)
p1 = p1 + 1
Do While Mid(json, p1, 1) = ” ” Or Mid(json, p1, 1) = vbCr Or Mid(json, p1, 1) = vbLf
p1 = p1 + 1
Loop
If Mid(json, p1, 1) = “””” Then
‘ 文字列の場合
p1 = p1 + 1
p2 = InStr(p1, json, “”””)
ExtractJsonValue = Mid(json, p1, p2 – p1)
Else
‘ 数値などの場合(カンマまたは閉じカッコまで)
p2 = p1
Do While Mid(json, p2, 1) <> “,” And Mid(json, p2, 1) <> “}” And p2 <= Len(json)
p2 = p2 + 1
Loop
ExtractJsonValue = Trim(Mid(json, p1, p2 - p1))
End If
End Function
---
4. 初学者が陥りやすい「エラーの罠」と回避策
この実装を進めるにあたって、現場でよくある失敗パターンをあらかじめ頭に入れておきましょう。
罠①:ファイルパスの迷子(Path Not Found)
- 症状: `Dir(configPath)` でファイルが見つからず、エラーメッセージが出てしまう。
- 原因: `ThisWorkbook.Path` は、一度そのExcelファイルを保存していないと空文字(””)を返します。 新規作成したまま保存していない状態で実行すると、パスが `\config.json` になってしまい、ファイルが見つかりません。
- 対策: コードを実行する前に、必ずExcelファイルをデスクトップなどの適当なフォルダに「保存」してください。
罠②:文字コードの罠(日本語化け)
- 症状: JSON内に日本語(例: `”ExportFolderPath”: “C:\マクロ出力\”` など)を入れたら文字化けする。
- 原因: メモ帳などでJSONを保存する際、文字コードが「Shift-JIS」や「UTF-8(BOMなし)」になっていると、VBAが正しく読み込めないことがあります。
- 対策: 設定ファイルに日本語を含める場合は、保存時の文字コードを「UTF-8 with BOM」にするか、ファイルパスなどは英数字のみで構成するのがエンジニアのスマートな知恵です。
—
5. まとめ:ここをクリアすれば、あなたはもう初心者じゃない!
いかがでしたでしょうか?
今回学んだ「定数管理の外部化」は、実際のシステム開発の現場でも100%使われているプロフェッショナルな設計手法です。
- コードに直接書き込まない(ハードコーディングの禁止)
- 環境が変わったら設定ファイル(JSON)側を書き換える
- 設定は構造体(Type)で型安全にメモリへ保持する
この3つを意識するだけで、あなたが書くVBAコードの品質は劇的に跳ね上がります。「マクロの記録」の延長線から抜け出し、保守性の高い堅牢なプログラムを作れるようになった自分を誇りに思ってください。
ここをクリアしたあなたなら、どんな業務自動化の依頼が来ても怖くありません。ぜひ、明日の実務から取り入れてみてくださいね!
