【Excel VBA】Outlookを利用してメールを送信する

はじめに

こんにちは、管理人のりゅうです。
今回は、ExcelVBAにてメールを送信する方法について解説します。
よくあるエラーの対処法や、Excelシートに記載されたメールアドレスに送信するやり方など、実用的な内容となっているので、是非最後までお付き合いください。

この記事を読むメリット
  • Outlookメール送信の基礎構文から、複数ファイルを添付する方法などを詳細に解説しています。
  • よくあるエラーとその対処法について理解できます。
  • コピペで使える実践的なサンプルコードを掲載しています。

前提

本記事はOutlookを利用します。
Outlookがインストールされていない場合については、非対応となりますのでご注意ください。

めい

まずサンプルコードからご覧になりたい方は、目次から遷移頂けます。

基本情報

Outlookを利用してメールを送信するには、以下のように「Outlook.Application.CreateItem(0)」でオブジェクトを作成した後、各プロパティに値をセットし、Sendメソッドでメールを送信します。

サンプルコード
Public Sub sendOutlookMail()
    Dim outlookObj As Object
    Dim outMailObj As Object

    ' Outlookオブジェクト生成
    Set outlookObj = CreateObject("Outlook.Application")
    Set outMailObj = outlookObj.CreateItem(0)

    With outMailObj
        .To = "vba-hack@example.com"    ' To
        .CC = ""                        ' CC(必要に応じて入力)
        .BCC = ""                       ' BCC(必要に応じて入力)
        .Subject = "テスト送信"         ' 件名
        .Body = "テスト送信です。"      ' 本文
        .Send                           ' メール実行
    End With

    ' オブジェクト解放
    Set outMailObj = Nothing
    Set outlookObj = Nothing
End Sub

プロパティ

#プロパティ意味備考
1To宛先。
メールアドレスを指定する。
カンマ区切りでメールアドレスを指定すると、複数宛先の指定が可能。
2CCCC。
メールアドレスを指定する。
カンマ区切りでメールアドレスを指定すると、複数宛先の指定が可能。
3BCCBCC。
メールアドレスを指定する。
カンマ区切りでメールアドレスを指定すると、複数宛先の指定が可能。
4Subject件名半角 255文字まで有効
5Body本文改行をするには「vbCrLf」を指定します。
Outlookオブジェクト – プロパティ

Toを指定しないままSendメソッドを実行すると以下のエラーとなるため気を付けてください。

【メッセージ】
実行時エラー ‘-2147467259 (80004005)’:

オートメーション エラーです。
エラーを特定できません

ファイルを添付する方法

ファイルを添付するには、「.Attachments.Add」プロパティにフルパスを指定します。
複数ファイル添付する場合には、「.Attachments.Add」プロパティを複数回設定すればOKです。

サンプルコード
Public Sub sendOutlookMail()
    Dim outlookObj As Object
    Dim outMailObj As Object

    ' Outlookオブジェクト生成
    Set outlookObj = CreateObject("Outlook.Application")
    Set outMailObj = outlookObj.CreateItem(0)

    With outMailObj
        .To = "deathneetryu0727@gmail.com"  ' To
        .CC = ""                            ' CC(必要に応じて入力)
        .BCC = ""                           ' BCC(必要に応じて入力)
        .Subject = "テスト送信"             ' 件名
        .Body = "テスト送信です。"          ' 本文
        .Attachments.Add "C:\Users\xxx\Desktop\test-1.txt"
        .Attachments.Add "C:\Users\xxx\Desktop\test-2.xlsx"
        .Send                               ' メール実行
    End With

    ' オブジェクト解放
    Set outMailObj = Nothing
    Set outlookObj = Nothing

    MsgBox "メールを送信しました。"
End Sub

存在しないファイルを指定した場合にエラーとなってしまいます。
必ず、存在するファイルを指定するか、存在チェックを入れるようにしましょう。

メール送信時に確認を挟む方法

「Send」メソッドを実行したタイミングでメールが送信されますが、「Display」メソッドを利用するとメール送信前にOutlookの送信前画面が立ち上がるため、確認が可能です。

サンプルコード
Public Sub sendOutlookMail()
    Dim outlookObj As Object
    Dim outMailObj As Object

    ' Outlookオブジェクト生成
    Set outlookObj = CreateObject("Outlook.Application")
    Set outMailObj = outlookObj.CreateItem(0)

    With outMailObj
        .To = "vba-hack@example.com"    ' To
        .CC = ""                        ' CC(必要に応じて入力)
        .BCC = ""                       ' BCC(必要に応じて入力)
        .Subject = "テスト送信"         ' 件名
        .Body = "テスト送信です。"      ' 本文
        .Display                        ' メール確認
    End With

    ' オブジェクト解放
    Set outMailObj = Nothing
    Set outlookObj = Nothing
End Sub

上記コードを実行すると、以下の画面が表示されますので、メール内容を確認後に赤枠のボタン押下でメール送信が可能です。

りゅう

ソースコードのデバッグに便利です!

サンプルコード

特定の1人にメールを送信する

サンプルコード
Public Sub sendOutlookMail()
    Dim outlookObj As Object
    Dim outMailObj As Object

    ' Outlookオブジェクト生成
    Set outlookObj = CreateObject("Outlook.Application")
    Set outMailObj = outlookObj.CreateItem(0)

    With outMailObj
        .To = "vba-hack@example.com"    ' To
        .CC = ""                        ' CC(必要に応じて入力)
        .BCC = ""                       ' BCC(必要に応じて入力)
        .Subject = "テスト送信"         ' 件名
        .Body = "テスト送信です。"      ' 本文
        .Send                           ' メール実行
    End With

    ' オブジェクト解放
    Set outMailObj = Nothing
    Set outlookObj = Nothing
End Sub

ファイルを添付して送信する

サンプルコード
Public Sub sendOutlookMail()
    Dim outlookObj As Object
    Dim outMailObj As Object

    ' Outlookオブジェクト生成
    Set outlookObj = CreateObject("Outlook.Application")
    Set outMailObj = outlookObj.CreateItem(0)

    With outMailObj
        .To = "vba-hack@example.com"        ' To
        .CC = ""                            ' CC(必要に応じて入力)
        .BCC = ""                           ' BCC(必要に応じて入力)
        .Subject = "テスト送信"             ' 件名
        .Body = "テスト送信です。"          ' 本文
        .Attachments.Add "C:\Users\xxx\Desktop\test-1.txt"
        .Send                               ' メール実行
    End With

    ' オブジェクト解放
    Set outMailObj = Nothing
    Set outlookObj = Nothing

    MsgBox "メールを送信しました。"
End Sub

複数人にメールを送信する

サンプルコード
Public Sub sendOutlookMail()
    Dim outlookObj As Object
    Dim outMailObj As Object

    ' Outlookオブジェクト生成
    Set outlookObj = CreateObject("Outlook.Application")
    Set outMailObj = outlookObj.CreateItem(0)

    With outMailObj
        .To = "vba-hack@example.com, vba-hack2@example.com"
        .CC = ""                        ' CC(必要に応じて入力)
        .BCC = ""                       ' BCC(必要に応じて入力)
        .Subject = "テスト送信"         ' 件名
        .Body = "テスト送信です。"      ' 本文
        .Send                           ' メール実行
    End With

    ' オブジェクト解放
    Set outMailObj = Nothing
    Set outlookObj = Nothing
End Sub
めい

カンマ区切りで複数人にメール送付出来ます。
サンプルではToに複数指定していますが、CCやBCCも同様にカンマ区切りで複数人を指定できます。

複数ファイルを添付してメールを送信する

サンプルコード
Public Sub sendOutlookMail()
    Dim outlookObj As Object
    Dim outMailObj As Object

    ' Outlookオブジェクト生成
    Set outlookObj = CreateObject("Outlook.Application")
    Set outMailObj = outlookObj.CreateItem(0)

    With outMailObj
        .To = "deathneetryu0727@gmail.com"  ' To
        .CC = ""                            ' CC(必要に応じて入力)
        .BCC = ""                           ' BCC(必要に応じて入力)
        .Subject = "テスト送信"             ' 件名
        .Body = "テスト送信です。"          ' 本文
        .Attachments.Add "C:\Users\xxx\Desktop\test-1.txt"
        .Attachments.Add "C:\Users\xxx\Desktop\test-2.xlsx"
        .Send                               ' メール実行
    End With

    ' オブジェクト解放
    Set outMailObj = Nothing
    Set outlookObj = Nothing

    MsgBox "メールを送信しました。"
End Sub

メソッド化 – 引数に指定されたメールアドレス・添付ファイルを展開し送信する

サンプルコード
Public Sub main()
    Dim toArr As Variant            ' To配列
    Dim ccArr As Variant            ' CC配列
    Dim bccArr As Variant           ' BCC配列
    Dim attachmentsArr As Variant   ' 添付ファイルリスト

    ' 宛先指定
    toArr = Array("vba-hack@example.com", "vba-hack2@example.com")
    bccArr = Array("vba-hack4@example.com", "vba-hack5@example.com", "vba-hack6@example.com")

    ' 添付ファイル
    attachmentsArr = Array("C:\Users\xxx\Desktop\test-1.txt", "C:\Users\xxx\Desktop\test-2.xlsx")

    ' メール送信
    Call sendOutlookMail(toArr, ccArr, bccArr, attachmentsArr)
End Sub

Private Sub sendOutlookMail( _
    ByRef toArr As Variant, _
    ByRef ccArr As Variant, _
    ByRef bccArr As Variant, _
    ByRef attachmentsArr As Variant)

    Dim outlookObj As Object
    Dim outMailObj As Object

    ' Outlookオブジェクト生成
    Set outlookObj = CreateObject("Outlook.Application")
    Set outMailObj = outlookObj.CreateItem(0)

    With outMailObj
        .To = Join(toArr, ",")      ' To

        ' CC
        If IsArray(ccArr) Then
            .CC = Join(ccArr, ",")
        End If

        ' BCC
        If IsArray(bccArr) Then
            .BCC = Join(bccArr, ",")
        End If

        ' ファイル添付
        Dim attachment As Variant
        If IsArray(attachmentsArr) Then
            For Each attachment In attachmentsArr
                .Attachments.Add attachment
            Next attachment
        End If

        .Subject = "テスト送信"     ' 件名
        .Body = "テスト送信です。"  ' 本文
        .Send                       ' メール実行
    End With

    ' オブジェクト解放
    Set outMailObj = Nothing
    Set outlookObj = Nothing

    MsgBox "メールを送信しました。"
End Sub
りゅう

mainメソッドにて設定した宛先、添付ファイルパスをsendOutlookMailメソッドで展開して送信するコードです。

メソッド化 – セルに記載されているメールアドレス・添付ファイルを元にメールを送信する

前提

Excelに「メールアドレスリスト」シートと、「添付ファイルリスト」シートがあると仮定します。

「メールアドレスリスト」シート
「添付ファイルリスト」シート

サンプルコード

サンプルコード
Public Sub main()
    Dim toArr As Variant            ' To配列
    Dim ccArr As Variant            ' CC配列
    Dim bccArr As Variant           ' BCC配列
    Dim attachmentsArr As Variant   ' 添付ファイルリスト

    ' 宛先指定
    With ThisWorkbook.Worksheets("メールアドレスリスト")
    
        ' To
        toArr = .Range(.Cells(3, 2), .Cells(.Range("B2").End(xlDown).Row, 2))
        toArr = convOneDimension(toArr)

        ' CC
        ccArr = .Range(.Cells(3, 3), .Cells(.Range("C2").End(xlDown).Row, 3))
        ccArr = convOneDimension(ccArr)

        ' BCC
        bccArr = .Range(.Cells(3, 4), .Cells(.Range("D2").End(xlDown).Row, 4))
        bccArr = convOneDimension(bccArr)
    End With

    ' 添付ファイル指定
    With ThisWorkbook.Worksheets("添付ファイルリスト")

        attachmentsArr = .Range(.Cells(3, 2), .Cells(.Range("B2").End(xlDown).Row, 2))
        bccArr = convOneDimension(attachmentsArr)
    End With

    ' メール送信
    Call sendOutlookMail(toArr, ccArr, bccArr, attachmentsArr)
End Sub

Private Sub sendOutlookMail( _
    ByRef toArr As Variant, _
    ByRef ccArr As Variant, _
    ByRef bccArr As Variant, _
    ByRef attachmentsArr As Variant)

    Dim outlookObj As Object
    Dim outMailObj As Object

    ' Outlookオブジェクト生成
    Set outlookObj = CreateObject("Outlook.Application")
    Set outMailObj = outlookObj.CreateItem(0)

    With outMailObj
        .To = Join(toArr, ",")      ' To

        ' CC
        If IsArray(ccArr) Then
            .CC = Join(ccArr, ",")
        End If

        ' BCC
        If IsArray(bccArr) Then
            .BCC = Join(bccArr, ",")
        End If

        ' ファイル添付
        Dim attachment As Variant
        If IsArray(attachmentsArr) Then
            For Each attachment In attachmentsArr
                .Attachments.Add attachment
            Next attachment
        End If

        .Subject = "テスト送信"     ' 件名
        .Body = "テスト送信です。"  ' 本文
        .Send                       ' メール実行
    End With

    ' オブジェクト解放
    Set outMailObj = Nothing
    Set outlookObj = Nothing

    MsgBox "メールを送信しました。"
End Sub

' 2次元配列を1次元配列に変換
Private Function convOneDimension(ByVal arr As Variant) As Variant
    Dim retArr() As Variant

    ReDim retArr(1 To UBound(arr, 1))
    Dim i As Integer
    For i = 1 To UBound(arr, 1)
        retArr(i) = arr(i, 1)
    Next i

    convOneDimension = retArr
End Function
りゅう

mainメソッドにてExcelのセルを参照し、sendOutlookMailメソッドでメールを送信します。
セルから値を取得する際、二次元配列となってしまいJoin関数でエラーとなってしまうため、一次元配列に変換するロジックも用意しています。

最後に

今回は、Outlookメールを利用したメール送信方法について解説しました。
サンプルコードが少し長くなってしまいましたが、汎用的なロジックとなっておりますので、是非ご活用ください!

サンプルコードが冗長になるので記載していませんでしたが、ファイルの存在チェックや宛先の必須チェックロジックなども忘れず実装するようにしましょう。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

大手外資系コンサルティングファーム勤務。ExcelVBA歴は8年。金融関係のプロジェクトにて約100万レコードを処理するマクロの開発実績あり。ExcelVBAの基礎・応用情報を発信中。

コメント

コメントする

CAPTCHA