【実務・中級編】【中級者向け】外部のJSON設定ファイルを読み込み、宛先やCCのグループ分けを動的に変更する柔軟な送信システム – Outlook VBA解析バイブル

スポンサーリンク

Outlook VBAを「設定ファイル」で制御せよ:ハードコーディングを廃するプロの設計術

業務自動化の現場で最も「保守の地獄」を招くのは、宛先やCCをVBAコード内に直書きすることだ。人事異動やチーム編成が変わるたびにソースコードを書き換え、コンパイルし、デバッグする……そんな非効率なルーチンは、今日で卒業しよう。

真のエンジニアは、「ロジック」と「データ」を分離する。今回は、外部JSONファイルを読み込み、宛先制御を動的に行う堅牢な送信システムの構築手法を伝授する。

—

1. なぜ「ハードコーディング」が現場の癌なのか

多くの初学者は、宛先を `To = “taro@example.com”` のようにコードに埋め込む。だが、これには以下のリスクが伴う。

  • 保守性の欠如: 宛先変更のたびにVBAエディタを開く必要があり、誤操作によるバグのリスクが高い。
  • 権限と管理: 設定ファイルに分けることで、非エンジニア(管理職など)がExcelやテキストエディタで宛先を管理できる。
  • スケーラビリティ: 宛先が100個あっても、ロジック側は「設定ファイルを読み込む」という1つの処理だけで完結する。

—

2. 実装の要:JSONパーサーの選定

VBAには標準でJSON解析機能がない。ここで `ScriptControl` を使うのは32bit環境限定のレガシーな手法だ。モダンな環境(64bit含む)を考慮し、最も軽量で安定しているのは [VBA-JSON](https://github.com/VBA-tools/VBA-JSON) を利用する手法である。

まずはライブラリをプロジェクトにインポートしておくこと。これがなければ始まらない。

—

3. 実践:動的宛先制御システムの実装

設定ファイル (config.json)

プロジェクトフォルダに以下のようなJSONを置く。

{
“project_alpha”: {
“to”: “dev-team@example.com”,
“cc”: “manager@example.com;sub-manager@example.com”
},
“project_beta”: {
“to”: “client@example.com”,
“cc”: “support@example.com”
}
}

VBA実装コード

Option Explicit

‘ 宛先グループを指定してメールを自動生成するメイン関数
Public Sub SendDynamicEmail(groupName As String)
Dim jsonText As String
Dim json As Object
Dim targetConfig As Object
Dim mail As Outlook.MailItem

‘ 1. JSONファイルの読み込み(FSOを使用)
jsonText = ReadFile(ThisWorkbook.Path & “\config.json”)
Set json = JsonConverter.ParseJson(jsonText)

‘ 2. グループの存在チェック(堅牢な設計には必須)
If Not json.Exists(groupName) Then
MsgBox “指定されたグループが見つかりません。”, vbCritical
Exit Sub
End If
Set targetConfig = json(groupName)

‘ 3. メールの生成
Set mail = Application.CreateItem(olMailItem)
With mail
.To = targetConfig(“to”)
.CC = targetConfig(“cc”)
.Subject = “【自動報告】” & groupName & “に関するアップデート”
.Body = “関係者各位” & vbCrLf & “本日の報告を送信します。”
.Display ‘ まずはDisplayで確認させる(自動送信にする場合は .Send)
End With

Set mail = Nothing
End Sub

‘ ファイル読み込みの共通関数(再利用性を高める)
Private Function ReadFile(filePath As String) As String
Dim fso As Object, ts As Object
Set fso = CreateObject(“Scripting.FileSystemObject”)
Set ts = fso.OpenTextFile(filePath, 1) ‘ 1 = ForReading
ReadFile = ts.ReadAll
ts.Close
End Function

—

4. プロダクション環境で生き残るための「鉄則」

コードを動かすだけなら上記で十分だが、業務ツールとして納品・運用するなら以下の視点が欠かせない。

① ファイルロックと競合の回避

JSONファイルを共有フォルダに置く場合、読み込み時の排他制御を考慮すべきだ。VBAでは `Open … Lock Read` を使用し、他者が編集中にエラーで落ちないよう、必ずエラーハンドリングを実装せよ。

② パス管理の抽象化

`ThisWorkbook.Path` に依存させすぎると、ツールを移動した際にリンク切れを起こす。設定ファイルのパスは、隠しシート(設定用シート)のセルA1に記載させるなど、実行時に環境変数としてロードする設計が最も堅牢だ。

③ 宛先検証(Validation)

JSONから読み取った文字列をそのまま `MailItem` に流し込むのは危険だ。宛先が空でないか、`@`が含まれているかなど、最小限のバリデーションをロジック層に挟め。

—

結論:コードは「書かない」ことが最高の最適化

優れた業務自動化エンジニアは、コードの行数で勝負しない。「いかにしてコードを触らずに業務変更に対応させるか」という設計の美しさで勝負する。

このJSONベースの設計を導入すれば、君のVBAは「使い捨てのスクリプト」から「堅牢なミドルウェア」へと進化する。次に修正が必要になったとき、君はコードを一行も変えることなく、設定ファイルを書き換えるだけでタスクを完了できるはずだ。

さあ、レガシーなハードコーディングの呪縛を解き放とう。

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