【入門編】【中級者向け】外部のJSON設定ファイルから「宛先グループ」を読み込み、環境に応じて送信先を切り替える柔軟な設計 – Outlook VBA解析バイブル

スポンサーリンク

こんにちは!Outlook VBAの automaty(自動化)の世界へようこそ。
これまでマクロの記録を使ったり、VBAのコードの中に直接メールアドレスをズラズラと書き込んだりしていませんか?

「部署異動があったから、宛先のメールアドレスを書き換えなきゃ…」
「テスト環境と本番環境で、送信先を切り替えるのが面倒くさい…」

そんな「ハードコーディング(直書き)の呪縛」からあなたを解放し、一歩上のエンジニアへと引き上げる技術を今回は伝授します。ここをクリアすれば、あなたのOutlook VBAのスキルは確実に実務レベルの「プロ仕様」になりますよ。

今日のテーマは、「外部のJSON設定ファイルから宛先グループを読み込み、環境に応じて送信先を動的に切り替える柔軟な設計」です。

優しく、そして本質的なところまでしっかり解説していきますので、ぜひ最後までついてきてくださいね!

なぜ「直書き」をやめるべきなのか?

初学者の方が最初にやりがちなのが、以下のようなコードです。

‘ 宛先をコードに直書きしている例
Sub SendMail_Bad()
Dim mail As MailItem
Set mail = Application.CreateItem(olMailItem)

mail.To = “boss@example.com” ‘ ここに直接書いている
mail.CC = “team@example.com”
mail.Subject = “日報です”
mail.Body = “お疲れ様です。今日の報告です。”
mail.Send
End Sub

このコードの何がいけないのでしょうか?
一見すると動くので問題なさそうですが、「運用が変わったときにコードを修正し、VBAエディタを開いてコンパイルし直す必要がある」という致命的な弱点があります。

ビジネスの現場では、組織改編、メンバーの入れ替わり、テスト送信先から本番送信先への切り替えなど、宛先は「水モノ」のように変わります。プログラムの本体(ロジック)と、データ(宛先)は完全に分離するべきなのです。

そこで登場するのが、外部のJSON設定ファイルです。

全体像の理解:どうやってJSONを読み込むのか?

Excelと違って、Outlook VBAには標準で「JSONをパースする(読み解く)機能」が備わっていません。
しかし、Windows環境であればVBScript.RegExpや、少し工夫してMicrosoft Script Control、あるいはテキストファイルとして読み込んでVBAで文字列操作を行うことで、外部のJSONを華麗に料理することができます。

今回は、依存関係を極力減らし、Windowsの標準機能だけでスマートにJSONの値を抽出するアプローチを取り入れましょう。

1. 外部JSONファイルの準備(`config.json`)

まずは、PCの適当なフォルダ(例: `C:\OutlookConfig\config.json`)に、環境ごとの宛先を定義したJSONファイルを置きます。

{
“environment”: “development”,
“groups”: {
“development”: {
“To”: “dev-test@example.com”,
“CC”: “debug-team@example.com”
},
“production”: {
“To”: “client-project@example.com”,
“CC”: “management@example.com; stakeholder@example.com”
}
}
}

  • `environment` キーで、現在「開発環境(development)」なのか「本番環境(production)」なのかを切り替えます。
  • これにより、コードを一切触らずに、この `config.json` の1行を変えるだけで送信先がパッと切り替わる仕組みを作ります。

実装コード:プロ仕様の動的メール生成モジュール

それでは、Outlook VBAのエディタを開き、標準モジュールに以下のコードを貼り付けてみましょう。
(※VBAからファイルシステムを扱うため、参照設定で「Microsoft Scripting Runtime」にチェックを入れておくか、CreateObjectを使用します。今回は汎用的なCreateObjectで記述しています)

Option Explicit

‘ =====================================================================
‘ 【メイン処理】設定ファイルから宛先を読み込み、メールを動的作成する
‘ =====================================================================
Sub CreateMailWithDynamicConfig()
Dim jsonPath As String
jsonPath = “C:\OutlookConfig\config.json” ‘ JSONファイルのパス

‘ 1. JSONファイルの内容を丸ごと文字列として読み込む
Dim jsonText As String
jsonText = ReadTextFile(jsonPath)

If jsonText = “” Then
MsgBox “設定ファイルが読み込めませんでした。”, vbCritical, “エラー”
Exit Sub
End If

‘ 2. 環境(development / production)を判定・取得
Dim currentEnv As String
currentEnv = ExtractJsonValue(jsonText, “environment”)

‘ 3. 現在の環境に応じた To と CC の文字列を抽出
‘ JSONのネスト構造(groups -> 選択環境 -> To/CC)を解析します
Dim targetTo As String
Dim targetCC As String
targetTo = ExtractNestedJsonValue(jsonText, currentEnv, “To”)
targetCC = ExtractNestedJsonValue(jsonText, currentEnv, “CC”)

‘ 4. Outlookのメールアイテムを生成・プロパティ設定
Dim ns As Outlook.NameSpace
Dim mail As Outlook.MailItem

Set mail = Application.CreateItem(olMailItem)

With mail
.To = targetTo
.CC = targetCC
.Subject = “【自動送信】” & UCase(currentEnv) & “環境からのテストメール”
.Body = “管理者様” & vbCrLf & _
“現在指定されている環境は [” & currentEnv & “] です。” & vbCrLf & _
“宛先は設定ファイルから動的に割り当てられました。”

‘ 危険な誤送信を防ぐため、一旦「表示」にとどめる(実務の鉄則!)
.Display
End With

MsgBox “環境「” & currentEnv & “」の宛先でメールを下書き作成しました!”, vbInformation, “成功”
End Sub

‘ =====================================================================
‘ 【ヘルパー関数】テキストファイルをUTF-8等で安全に読み込む
‘ =====================================================================
Function ReadTextFile(filePath As String) As String
On Error GoTo ErrorHandler
Dim fso As Object
Dim ts As Object

Set fso = CreateObject(“Scripting.FileSystemObject”)
‘ 第3引数(True)でUnicode/UTF-8に対応させる場合もありますが、環境によりADODB.Stream推奨
Dim stream As Object
Set stream = CreateObject(“ADODB.Stream”)

With stream
.Type = 2 ‘ adTypeText
.Charset = “UTF-8”
.Open
.LoadFromFile filePath
ReadTextFile = .ReadText
.Close
End With
Exit Function

ErrorHandler:
ReadTextFile = “”
End Function

‘ =====================================================================
‘ 【ヘルパー関数】簡易JSONパーサ(トップレベルのキー値取得用)
‘ =====================================================================
Function ExtractJsonValue(json As String, key As String) As String
Dim pattern As String
pattern = “””” & key & “””\s:\s””([^””]+)”””

Dim regex As Object
Set regex = CreateObject(“VBScript.RegExp”)
regex.Pattern = pattern
regex.IgnoreCase = True
regex.Global = False

If regex.Test(json) Then
ExtractJsonValue = regex.Execute(json)(0).SubMatches(0)
Else
ExtractJsonValue = “”
End If
End Function

‘ =====================================================================
‘ 【ヘルパー関数】ネストされた構造(groups -> env -> key)から値を取得
‘ =====================================================================
Function ExtractNestedJsonValue(json As String, env As String, key As String) As String
‘ 簡易的かつ堅牢に該当ブロックを抜き出す正規表現
Dim pattern As String
pattern = “””” & env & “””\s:\s\{([^}]+)\}”

Dim regex As Object
Set regex = CreateObject(“VBScript.RegExp”)
regex.Pattern = pattern
regex.IgnoreCase = True

If regex.Test(json) Then
Dim subJson As String
subJson = regex.Execute(json)(0).SubMatches(0)
‘ 抜き出したブロックの中から目的のキー(To または CC)の値を取得
ExtractNestedJsonValue = ExtractJsonValue(subJson, key)
Else
ExtractNestedJsonValue = “”
End If
End Function

ジックリとコードを眺めてみてください。ここには実務で役立つ「エンジニアのこだわり」が詰まっています。

1. ADODB.StreamによるUTF-8読み込み:
日本語や特殊文字を含むJSONファイルを文字化けさせずに安全に読み込むため、標準のFileSystemObjectではなく`ADODB.Stream`を採用しています。
2. 正規表現(RegExp)の活用:
フルスペックのJSONパーサをVBAでスクラッチから書くのは大変ですが、宛先や設定値の抽出程度であれば、正規表現(`VBScript.RegExp`)を使うことでわずか数行でエレガントに実現できます。
3. 誤送信防止の `.Display`:
自動化コードでやりがちなのが `.Send`(即時送信)の暴走です。テスト段階や運用初期は必ず `.Display`(画面表示)にして、人間の目で確認できる猶予を持たせるのがプロの作法です。

陥りやすいエラーと回避のテクニック

この高度な設計にチャレンジする際、初心者がハマりがちな罠と対策をシェアしておきます。

  • パスが見つからないエラー(実行時エラー 53)
  • 原因: `C:\OutlookConfig\config.json` のフォルダが存在しない、またはファイル名が間違っている。
  • 対策: `Dir`関数や `FSO.FileExists` を使って、ファイルの存在チェックを冒頭に入れると親切です。
  • 正規表現がうまくマッチしない
  • 原因: JSON内のスペースや改行(インデント)が正規表現のパターンと衝突している。
  • 対策: 今回用意した正規表現は `\s`(ホワイトスペースの許容)を入れているため柔軟ですが、JSONを記述する際は余計な特殊文字を入れないように気をつけましょう。

まとめ:ここをクリアすれば、もう怖くない!

今回は、外部のJSON設定ファイルから宛先をダイナミックに読み込み、環境に応じて送信先を切り替えるモダンなOutlook VBA設計を解説しました。

  • ハードコーディングを廃し、設定を外部化する
  • ADODB.Streamで文字コードのトラブルを防ぐ
  • 正規表現で軽量かつスマートにJSONをパースする

この3つの引き出しを持っていれば、周囲の同僚や上司から「おっ、この人のマクロは一味違うぞ」と一目置かれること間違いなしです。

「ここをこう変えれば、宛先だけでなく件名のテンプレートも外部化できるな…」など、ぜひご自身の業務に合わせて応用を膨らませてみてください。

あなたのOutlook自動化ライフが、より快適で知的になりますように。それではまた次のテクニックでお会いしましょう!

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