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

スポンサーリンク

ハードコーディングという名の「負債」を断つ:JSON駆動型・動的メール配信アーキテクチャの構築

業務システムにおいて、メール配信ロジックがソースコードに直書きされている光景は、もはや「技術的負債」ではなく「時限爆弾」である。宛先の変更があるたびにコンパイルを伴う修正を強いるなど、アーキテクトの矜持が許さない。

今回は、Outlook VBAにおける「脱・ハードコーディング」を完遂するための、JSON設定ファイルを用いた動的メール配信システムの設計思想を伝授する。

—

1. なぜ「JSON駆動」なのか:疎結合の哲学

OutlookのVBAで宛先リストやCCの制御をコードに埋め込むと、運用開始後に必ず「CCに〇〇さんを追加してほしい」という要求が飛んでくる。これを防ぐための唯一の解は、「ロジック」と「データ」の物理的な分離だ。

我々は外部JSONをパーサー経由で読み込み、実行時にオブジェクトへ展開することで、再コンパイル不要な柔軟性を手に入れる。

2. アーキテクチャの要:JSONパーサーの選定

VBAには標準のJSONライブラリがない。だが、シニアエンジニアたるもの、外部依存を最小限に抑えるべきだ。
本稿では、軽量かつ堅牢な「VBA-JSON(`ScriptControl`を避け、ネイティブな辞書オブジェクトへのマッピングを推奨)」を利用する前提で話を進める。

※ `ScriptControl`は64bit環境で動作しないため、将来的なWindowsの進化を考慮すれば選択肢から外すのが賢明だ。代わりに、`ADODB.Stream`でファイルを読み込み、`JsonConverter`(GitHub等で公開されている著名なモジュール)でパースする手法を推奨する。

3. 実装:メモリリークを許さないオブジェクト管理

VBAにおいて、`MailItem`を生成し続けるとメモリリークの温床となる。特にループ処理内での生成は、必ず参照を明示的に解放しなければならない。

以下に、JSON設定ファイルを読み込み、動的に宛先を設定するプロトタイプを示す。

‘ 必要なライブラリ: Microsoft Scripting Runtime
‘ ※ JsonConverterモジュールをプロジェクトにインポートしておくこと

Public Sub SendDynamicMail(configPath As String)
Dim fso As Object: Set fso = CreateObject(“Scripting.FileSystemObject”)
Dim jsonText As String
Dim config As Object
Dim olApp As Outlook.Application
Dim mail As Outlook.MailItem

‘ 1. ファイルI/Oの最適化: ADODB.Stream推奨(文字コード制御のため)
jsonText = ReadFile(configPath)
Set config = JsonConverter.ParseJson(jsonText)

Set olApp = New Outlook.Application

‘ 2. メールオブジェクトの生成
Set mail = olApp.CreateItem(olMailItem)

With mail
.To = Join(JsonArrayToCollection(config(“Recipients”)), “;”)
.CC = Join(JsonArrayToCollection(config(“CCs”)), “;”)
.Subject = config(“Subject”)
.Body = config(“Body”)

‘ 3. 送信処理(テスト時は .Display で確認)
.Send
End With

‘ 4. 厳格なメモリ解放: 参照カウンタを意識する
Set mail = Nothing
Set olApp = Nothing
Set config = Nothing
Set fso = Nothing
End Sub

‘ 外部JSONを読み込むためのストリーム処理
Private Function ReadFile(path As String) As String
Dim stream As Object
Set stream = CreateObject(“ADODB.Stream”)
stream.Charset = “UTF-8”
stream.Open
stream.LoadFromFile path
ReadFile = stream.ReadText
stream.Close
End Function

—

4. 極限の知見:シニアエンジニアが守るべき3つの鉄則

① `ScriptControl`は捨てろ

前述の通り、64bit Office環境が標準となった今、`MSScriptControl`は死んだ技術だ。`Late Binding`(遅延バインディング)を極め、環境依存を排除せよ。

② 宛先のバリデーションは「送信前」に行え

JSONの中身が壊れていた場合、`MailItem`のプロパティセット段階でエラーが起きる。`On Error GoTo`でのトラップは必須だが、それ以上に「設定ファイルのスキーマチェック」を別関数として切り出し、システムの入り口で弾く設計(ガード節)を徹底せよ。

③ `Set = Nothing` はおまじないではない

VBAのガベージコレクションを信じてはいけない。Outlookのインスタンスは特にメモリを食う。ループ内でメールを大量送信する際は、適宜 `DoEvents` を挟み、Windowsのメッセージループを枯渇させない配慮が、安定稼働の鍵となる。

結論

JSON駆動型の設計は、単なる「設定の外部化」ではない。それは、システムを「保守されるもの」から「変化に追従するもの」へと昇華させるための第一歩だ。

コードは書くことよりも、「いかに後から触りやすくするか」に全精力を注ぐべきである。それが、真に洗練されたエンジニアの仕事だ。次は、このJSONに送信条件(フラグ)を加え、条件分岐までをデータ駆動で制御する「メタプログラミング的アプローチ」を試みてほしい。

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