‘ ==============================================================================
‘ 処理名: AdvancedMailMergeEngine
‘ 概要 : Wordオブジェクトモデルを駆使して動的にレイアウトを構築し、
‘ HTMLメールとしてOutlookのMailItemへ安全に流し込むプロフェッショナル向け実装
‘ ==============================================================================
Public Sub ExecuteAdvancedMailMerge()
‘ — オブジェクト変数の宣言 (スコープを明確にし、後で確実に解放する) —
Dim objWordApp As Object
Dim objDoc As Object
Dim objOutlookApp As Object
Dim objMail As Object
Dim tempFilePath As String
Dim dataRow As Long
‘ 予期せぬエラーによるプロセス残留を防ぐための大域エラーハンドラ
On Error GoTo ErrorHandler
‘ 2. 一時ドキュメントの生成
Set objDoc = objWordApp.Documents.Add()
‘ ==========================================================================
‘ 3. Wordオブジェクトモデルによる高度なレイアウト構築
‘ ==========================================================================
With objDoc.Content
.Text = “平素は格別のご高配を賜り、厚く御礼申し上げます。” & vbCrLf & vbCrLf
.Collapse 0 ‘ 文書の末尾にカーソルを移動
End With
‘ 複雑な表組みの動的生成 (例: 顧客別の請求サマリー)
Dim targetTable As Object
Set targetTable = objDoc.Tables.Add(Range:=objDoc.Content.Characters.Last, NumRows:=3, NumColumns:=3)
.Display ‘ いきなり送信せず、最終確認のため画面に表示 (必要に応じて .Send に変更)
End With
CleanUp:
‘ ==========================================================================
‘ 6. 確実なオブジェクト解放とリソースの回収
‘ ==========================================================================
On Error Resume Next
‘ 一時ファイルのクリーンアップ
If Len(tempFilePath) > 0 Then
If Dir(tempFilePath) <> “” Then Kill tempFilePath
End If
‘ 参照の完全破棄 (逆順での解放が安全)
Set objMail = Nothing
Set objOutlookApp = Nothing
If Not objDoc Is Nothing Then
objDoc.Close False
Set objDoc = Nothing
End If
If Not objWordApp Is Nothing Then
objWordApp.ScreenUpdating = True
objWordApp.Quit False
Set objWordApp = Nothing
End If
‘ ==============================================================================
‘ 補助関数: UTF-8テキストファイルの安全な読み込み (ADODB.Stream利用)
‘ ==============================================================================
Private Function ReadTextFileUTF8(ByVal filePath As String) As String
Dim objStream As Object
Set objStream = CreateObject(“ADODB.Stream”)
With objStream
.Type = 2 ‘ adTypeText = 2
.Charset = “UTF-8”
.Open
.LoadFromFile filePath
ReadTextFileUTF8 = .ReadText
.Close
End With