こんにちは、藤田です。
前回はAccessやSQLから取得したデータをPADでCSV出力 → Excel VBAで整形するところまで完了しました。今回はその整形済みファイルをOutlookを介して所定の宛先へメール送信する処理について、実装ベースで深掘りしていきます。
これは一見単純に見えて、意外と奥が深いんですよね。**件名の切り替え、宛先の設定、本文テンプレート、添付ファイルの選定、メール送信の確認、エラー対処…**などなど。
💡設計概要:VBAからOutlookを操作する全体像
1. 添付対象ファイルを指定(最新ファイル or 成形済み)
2. 宛先・件名・本文を準備(テンプレート化)
3. Outlookメールオブジェクトを生成
4. 添付して送信(または表示)
5. ログ出力(成功/失敗記録)
🧭事前準備と前提
- Outlookがインストール済みで正常に起動できること
- Excel VBAからOutlookを操作するには COM参照またはCreateObject を使用
- セキュリティ警告(“プログラムがメールを送信しようとしています”)が出る場合、セキュリティセンター設定またはIT部門の確認が必要
📝送信するメールのテンプレ設計
- 件名:
【自動通知】〇〇帳票データ(yyyymmdd)
- 宛先:複数可(To、CC)
- 本文:
お疲れ様です。
PAD+VBAにより自動作成された帳票をお送りします。
ご確認くださいませ。
(※本メールはシステムより自動送信されました)
こういったテンプレートをVBAコード内で変数化しておくと、処理の汎用性が上がります。
📦ファイル取得処理:最新ファイルを自動検出
たとえば、PADやVBAで保存したレポートファイルが C:\Output\Report_yyyymmdd.xlsx
という形式で保存されているなら、日付付きファイルの中から最新ファイルを自動選定する処理を先に組んでおきます。
🔍コード例:最新ファイル検出
Function GetLatestReportFile(folderPath As String) As String
Dim fso As Object, folder As Object, file As Object
Dim latestDate As Date: latestDate = DateSerial(2000, 1, 1)
Dim latestFile As String: latestFile = ""
Set fso = CreateObject("Scripting.FileSystemObject")
Set folder = fso.GetFolder(folderPath)
For Each file In folder.Files
If InStr(file.Name, "Report_") > 0 And InStr(file.Name, ".xlsx") > 0 Then
If file.DateLastModified > latestDate Then
latestDate = file.DateLastModified
latestFile = file.Path
End If
End If
Next
GetLatestReportFile = latestFile
End Function
📧Outlookメール送信処理
さて、いよいよメール送信です。以下のコードで、添付+件名+本文をセットし、メールを 送信 or 表示確認 のいずれかにできます。
✉️コード例:メール送信処理(VBA)
Sub SendReportViaOutlook()
Dim olApp As Object
Dim olMail As Object
Dim reportFile As String
Dim mailSubject As String
Dim mailBody As String
reportFile = GetLatestReportFile("C:\Output")
If reportFile = "" Then
MsgBox "レポートファイルが見つかりません。", vbCritical
Exit Sub
End If
mailSubject = "【自動通知】レポート帳票(" & Format(Date, "yyyy/mm/dd") & ")"
mailBody = "お疲れ様です。" & vbCrLf & vbCrLf & _
"PAD+VBAにより自動作成された帳票をお送りします。" & vbCrLf & vbCrLf & _
"ご確認くださいませ。" & vbCrLf & vbCrLf & _
"(※本メールは自動送信されています)"
Set olApp = CreateObject("Outlook.Application")
Set olMail = olApp.CreateItem(0)
With olMail
.To = "recipient@example.com"
.CC = "sub@example.com"
.Subject = mailSubject
.Body = mailBody
.Attachments.Add reportFile
.Send '→ .Display に変更すれば確認画面付き
End With
LogMessage "メール送信完了:" & reportFile
End Sub
📋ログ管理:送信履歴を記録しておくと安心
📄コード例:
Sub LogMessage(msg As String)
Dim fso As Object, ts As Object
Set fso = CreateObject("Scripting.FileSystemObject")
Set ts = fso.OpenTextFile("C:\Logs\MailLog.txt", 8, True)
ts.WriteLine Format(Now, "yyyy-mm-dd hh:nn:ss") & " - " & msg
ts.Close
End Sub
このログは運用時にも便利で、定時処理が実行されたかの確認、万が一の証跡として活用できます。
🧯トラブル対応のポイント
現象 | 原因 | 対処 |
---|---|---|
“Outlookが起動していない” エラー | Outlookインスタンスなし |
CreateObject では自動起動されるが、事前に確認推奨 |
“セキュリティ警告”が出る | VBAからメールを送信すると警告される | Outlookセキュリティセンターで「信頼済みアドイン」設定 or IT担当と調整 |
“送信できない” or “添付できない” | ファイルパスの誤り、添付上限 | パスを Dir() で事前確認/ZIP化で軽量化対策 |
“表示はされたが送信されない” |
.Display で止まっている |
.Send に切り替えて完全自動化(または .Display で確認→手動送信) |
🚀応用アイデアと拡張構想
- 🧵 宛先リスト化: Excelシートで複数宛先の管理(To/CC/BCC)
- 🔁 添付複数対応: PDFとExcel両方/ZIP化済ファイルの送信
- 📦 フォーム送信後処理: PowerAppsで送信 → PAD → Excel → VBA → メール通知までの一気通貫
- 📢 Teams通知連携: VBAからWebhookでTeams通知を追加(PowerShell併用)
🧠まとめと次回予告
今回の内容:
- VBAでOutlookメールを自動生成&送信する構成を確立
- 添付ファイルの取得、テンプレート設定、ログ記録、エラー対処まで一通り設計
- これにより「業務の最終ステップだったメール送信」までも完全自動化できる
次回はいよいよ 第5回:「一括実行ボタンの設計と複数フローの統合制御」 です!
- ボタン1つでフロー全部動かす設計
- 処理順の制御(VBA→PAD→VBA→PAD)
- フラグ管理とモジュール分割
- ユーザー向け汎用UI化の構想
最終工程を滑らかにするための設計思想を共有します