【ExcelVBA・マクロ】Outlookメールを自動送信する方法|宛先・本文・添付ファイルを差し込むVBAコード【コピペOK】

ExcelVBA

請求金額の案内や定型的な業務連絡など、同じ形式のメールを何十件も手作業で送っていませんか。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メソッドに0olMailItemに相当する値)を渡します。遅延バインディングでは列挙定数が使えないため、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)でメールアイテムを作成できる
  • ToSubjectBodyHTMLBodyにセルの値を差し込んで、宛先ごとに内容を変えたメールを自動生成できる
  • Attachments.Addで添付ファイルを付けられる。事前にDir関数でファイルの存在確認をしておくと安全
  • .Sendは即送信、.Displayは作成画面を開くだけなので、確認しながら運用したい場合は.Displayを使う
  • Excelの一覧をループ処理すれば、複数人への一括送信も自動化できる

Outlookメールの自動化は業務効率化の効果が大きい一方、誤送信のリスクも伴います。テスト運用をしっかり行った上で、実務に取り入れてみてください。

スポンサーリンク
スポンサーリンク
ExcelVBA
シェアする
いがぴをフォローする

コメント

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