こんにちは、管理人のりゅうです。
今回は、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
プロパティ
# | プロパティ | 意味 | 備考 |
---|---|---|---|
1 | To | 宛先。 メールアドレスを指定する。 | カンマ区切りでメールアドレスを指定すると、複数宛先の指定が可能。 |
2 | CC | CC。 メールアドレスを指定する。 | カンマ区切りでメールアドレスを指定すると、複数宛先の指定が可能。 |
3 | BCC | BCC。 メールアドレスを指定する。 | カンマ区切りでメールアドレスを指定すると、複数宛先の指定が可能。 |
4 | Subject | 件名 | 半角 255文字まで有効 |
5 | Body | 本文 | 改行をするには「vbCrLf」を指定します。 |
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メールを利用したメール送信方法について解説しました。
サンプルコードが少し長くなってしまいましたが、汎用的なロジックとなっておりますので、是非ご活用ください!
サンプルコードが冗長になるので記載していませんでしたが、ファイルの存在チェックや宛先の必須チェックロジックなども忘れず実装するようにしましょう。

コメント