請求金額の案内や定型的な業務連絡など、同じ形式のメールを何十件も手作業で送っていませんか。ExcelVBAからOutlook.Applicationを操作すれば、宛先・件名・本文・添付ファイルを自動で設定し、メールをそのまま送信することができます。この記事では、Outlookメールを自動送信する基本コードから、Excelの一覧を使って複数人へ一括送信する実務向けマクロまで解説します。
OutlookをVBAから操作する準備
Excelから他のOfficeアプリを操作する場合と同じく、CreateObject("Outlook.Application")を使う実行時バインディングが扱いやすい方法です。参照設定が不要なため、他のパソコンにマクロを配布したときにもエラーになりにくいというメリットがあります。
Sub CreateOutlookApp()
Dim outApp As Object
Set outApp = CreateObject("Outlook.Application")
End Sub
メール本体を作成するには、CreateItemメソッドに0(olMailItemに相当する値)を渡します。遅延バインディングでは列挙定数が使えないため、Constで数値を定義しておくとコードの意味が分かりやすくなります。
メールを作成して送信する基本コード
宛先・件名・本文を設定し、Sendメソッドで送信する基本形は次の通りです。
Sub SendMailBasic()
Dim outApp As Object
Dim outMail As Object
Const olMailItem As Long = 0
Set outApp = CreateObject("Outlook.Application")
Set outMail = outApp.CreateItem(olMailItem)
With outMail
.To = "sample@example.com"
.Subject = "テスト送信"
.Body = "これはVBAから自動送信したメールです。"
.Send
End With
Set outMail = Nothing
Set outApp = Nothing
End Sub
.Sendを実行すると即座に送信されます。テスト段階では自分宛のアドレスに送るか、後述の.Displayで内容を確認してから送信するようにしましょう。
本文にセルの値を差し込む方法
Bodyプロパティに文字列を連結して渡せば、Excelのセルの値を差し込んだ本文を自動生成できます。
Sub SendMailWithCellValues()
Dim outApp As Object
Dim outMail As Object
Dim ws As Worksheet
Dim customerName As String
Dim amount As Currency
Const olMailItem As Long = 0
Set ws = ThisWorkbook.Worksheets("Sheet1")
customerName = ws.Range("B2").Value
amount = ws.Range("C2").Value
Set outApp = CreateObject("Outlook.Application")
Set outMail = outApp.CreateItem(olMailItem)
With outMail
.To = ws.Range("A2").Value
.Subject = customerName & "様 ご請求金額のご案内"
.Body = customerName & "様" & vbCrLf & vbCrLf & _
"今月のご請求金額は " & Format(amount, "#,##0") & "円 です。" & vbCrLf & _
"よろしくお願いいたします。"
.Send
End With
Set outMail = Nothing
Set outApp = Nothing
End Sub
vbCrLfで改行を入れることで、見やすいメール本文にできます。HTML形式で装飾したい場合はBodyの代わりにHTMLBodyプロパティを使用します。
添付ファイルを付けて送信する方法
添付ファイルを付けるにはAttachments.Addにファイルパスを渡します。ファイルが存在しない場合はエラーになるため、事前にDir関数でチェックしておくと安全です。
Sub SendMailWithAttachment()
Dim outApp As Object
Dim outMail As Object
Dim filePath As String
Const olMailItem As Long = 0
filePath = ThisWorkbook.Path & "\請求書.pdf"
If Dir(filePath) = "" Then
MsgBox "添付ファイルが見つかりません: " & filePath
Exit Sub
End If
Set outApp = CreateObject("Outlook.Application")
Set outMail = outApp.CreateItem(olMailItem)
With outMail
.To = "sample@example.com"
.Subject = "請求書送付のご案内"
.Body = "請求書を添付いたします。ご確認をお願いいたします。"
.Attachments.Add filePath
.Send
End With
Set outMail = Nothing
Set outApp = Nothing
End Sub
送信前に内容を確認する方法(DisplayとSendの使い分け)
いきなり.Sendで送ってしまうのが不安な場合は、.Displayメソッドでメール作成画面を開き、内容を目視確認してから手動で送信ボタンを押す運用にすると安全です。
Sub CreateMailForReview()
Dim outApp As Object
Dim outMail As Object
Const olMailItem As Long = 0
Set outApp = CreateObject("Outlook.Application")
Set outMail = outApp.CreateItem(olMailItem)
With outMail
.To = "sample@example.com"
.Subject = "内容確認用メール"
.Body = "この内容で送信して問題ないか確認してください。"
.Display
End With
Set outMail = Nothing
Set outApp = Nothing
End Sub
マクロを新しく作った直後や、宛先を間違えると影響が大きいメールを送る場合は、.Sendではなくまず.Displayでテストすることをおすすめします。なお、Outlookのセキュリティ設定によっては、プログラムからの自動送信時に確認ダイアログが表示されることがあります。これはOutlookが不正なマクロによる大量送信を防ぐための正規の仕組みなので、実行環境の管理者に確認しながら利用してください。
実務での活用例:Excelの一覧から複数人へ一括送信
顧客一覧のようなExcelの表をもとに、1行ずつメールを作成して送信するマクロです。A列に宛先、B列に氏名が入っている前提のサンプルです。
Sub SendMailToAllCustomers()
Dim outApp As Object
Dim outMail As Object
Dim ws As Worksheet
Dim lastRow As Long
Dim i As Long
Const olMailItem As Long = 0
Set ws = ThisWorkbook.Worksheets("Sheet1")
lastRow = ws.Cells(ws.Rows.Count, "A").End(xlUp).Row
Set outApp = CreateObject("Outlook.Application")
For i = 2 To lastRow
Set outMail = outApp.CreateItem(olMailItem)
With outMail
.To = ws.Cells(i, "A").Value
.Subject = ws.Cells(i, "B").Value & "様 ご案内"
.Body = ws.Cells(i, "B").Value & "様" & vbCrLf & vbCrLf & _
"いつもお世話になっております。" & vbCrLf & _
"詳細は添付資料をご確認ください。"
.Send
End With
Set outMail = Nothing
Next i
Set outApp = Nothing
MsgBox (lastRow - 1) & "件のメールを送信しました。"
End Sub
Cells(Rows.Count, "A").End(xlUp).Rowで最終行を取得し、2行目から最終行まで1件ずつメールを作成・送信しています。一斉送信は誤送信の影響が大きいため、最初は件数を絞ったテストデータで動作確認してから本番の一覧に適用してください。
まとめ
CreateObject("Outlook.Application")とCreateItem(0)でメールアイテムを作成できるTo・Subject・Body・HTMLBodyにセルの値を差し込んで、宛先ごとに内容を変えたメールを自動生成できるAttachments.Addで添付ファイルを付けられる。事前にDir関数でファイルの存在確認をしておくと安全.Sendは即送信、.Displayは作成画面を開くだけなので、確認しながら運用したい場合は.Displayを使う- Excelの一覧をループ処理すれば、複数人への一括送信も自動化できる
Outlookメールの自動化は業務効率化の効果が大きい一方、誤送信のリスクも伴います。テスト運用をしっかり行った上で、実務に取り入れてみてください。


コメント