Excelで条件を満たしたときにメールを自動送信する3つの方法【VBAマクロ】
メールの自動送信機能を活用すれば、あらかじめ作成しておいたメッセージをユーザーへ一括配信でき、作業時間を大幅に節約できます。特に、指定したタイミングでメールを送れる仕組みは、見込み顧客とのエンゲージメント向上に非常に効果的です。中でも最も価値が高いのは、「適切な相手に、適切なタイミングで通知を届けられる」という点でしょう。
本記事では、Excel VBAマクロを使って、条件を満たしたときに自動的にメールを送信するさまざまな方法をご紹介します。記事内のサンプルブックをダウンロードして、実際に練習することも可能です。
条件を満たしたときにExcelからメールを自動送信する3つの方法
業務では「特定の条件を満たしたら顧客へメールを送りたい」という場面が頻繁に発生します。VBAマクロを使えば、メール送信機能を自由にカスタマイズでき、複数の宛先へ同時にメールを送ることも可能です。
なお、マクロでメールを自動送信するには、パソコンにOutlookがインストールされている必要があります。以下で紹介するコードは、いずれもOutlook経由で受信者へメールを送信する仕組みです。
方法1:セルの値に基づいてメールを自動送信するVBAマクロ
まずは、データセット内の特定の列の値をもとに、メールを自動送信するVBAマクロを作成します。ここでは、下記のようなスーパーマーケットの顧客情報データセットを使用します。
このデータセットには、B列に顧客名、C列にメールアドレス、D列に商品購入の未払い金額が入力されています。未払いのある顧客へ支払い依頼のメールを送りたいのですが、ここで「請求額が10より大きい場合のみメールを送る」という条件を設けます。それでは、セルの値に基づいてメールを自動送信する手順を見ていきましょう。

手順:
- まず、リボンの「開発」タブをクリックします。
- 次に、「コード」グループにある「Visual Basic」をクリックして、VBE(Visual Basic Editor)を開きます。ショートカットキーのAlt + F11でも開けます。

- または、ワークシート上で右クリックし、「コードの表示」を選択しても、同じくVBEを開けます。

- 表示されたVisual Basic Editorに、以下のVBAコードをコピー&ペーストします。
VBAコード:
Dim r As Range
Private Sub Worksheet_Change(ByVal Target As Range)
On Error Resume Next
If Target.Cells.Count > 1 Then Exit Sub
Set r = Intersect(Range("D5"), Target)
If r Is Nothing Then Exit Sub
If IsNumeric(Target.Value) And Target.Value > 10 Then
Call Send_Mail_Automatically1
End If
End Sub
Sub Send_Mail_Automatically1()
Dim ob1 As Object
Dim ob2 As Object
Dim str As String
Set ob1 = CreateObject("Outlook.Application")
Set ob2 = ob1.CreateItem(0)
str = "Hello!" & vbNewLine & vbNewLine & "To prevent further costs," _
& vbNewLine & "please pay before the deadline."
On Error Resume Next
With ob2
.To = Range("C5").Value
.cc = ""
.BCC = ""
.Subject = "Request to Pay Bill"
.Body = str
.Send
End With
On Error GoTo 0
Set ob2 = Nothing
Set ob1 = Nothing
End Sub
- その後、「Sub/ユーザーフォームの実行」ボタンをクリックするか、キーボードのF5キーを押してコードを実行します。

- 「マクロ」ダイアログが表示されるので、該当するマクロを選択して「実行」ボタンを押します。

- Outlookアプリケーションを開いて受信トレイを確認すると、ExcelのVBAマクロから送信されたメールが届いているのが分かります。

VBAコードの解説
Private Sub Worksheet_Change(ByVal Target As Range)
On Error Resume Next
If Target.Cells.Count > 1 Then Exit Su
Set r = Intersect(Range("D5"), Target)
If r Is Nothing Then Exit Sub
If IsNumeric(Target.Value) And Target.Value > 10 Then
Call Send_Mail_Automatically1
End If
End Sub
ここではPrivate Subを使用しています。これは、マクロウィンドウから実行するのではなく、セルの値が変更されたときに自動的にコードを実行させるためです。Worksheet Changeイベントと組み合わせてPrivate Subを使うことで、対象セルをD5に限定し、その値が10より大きいかどうかを判定します。条件が満たされれば、Send_Email_Automatically1というSubプロシージャが呼び出されます。
Sub Send_Mail_Automatically1()
Dim ob1 As Object
Dim ob2 As Object
Dim str As String
Set ob1 = CreateObject("Outlook.Application")
Set ob2 = ob1.CreateItem(0)
str = "Hello!" & vbNewLine & vbNewLine & "To prevent further costs," & vbNewLine & "please pay before the deadline."
On Error Resume Next
With ob2
.To = Range("C5").Value
.cc = ""
.BCC = ""
.Subject = "Request to Pay Bill"
.Body = str
.Send
続くSend_Email_Automatically1プロシージャでは、まず変数の型を宣言します。メールクライアントとしてOutlookを指定し、変数strにメール本文の内容を格納します。宛先には顧客のメールアドレスが保存されているセルC5の値を設定し、件名は.Subjectで指定します。最後に.Sendによってメールを送信します。
関連記事: セルの内容に基づいてExcelからメールを自動送信する2つの方法
方法2:支払期限に基づいてメールを自動送信するVBAコード
次に、請求書の支払期限が近づいたときにメールを自動送信する、いわばリマインダー機能を持つExcel VBAマクロを作成します。今回使用するデータセットには、B列に顧客名、C列にメールアドレス、D列に送信したいメッセージ、E列に支払期限が入力されています。それでは、日付の条件を満たしたときにメールを自動送信する手順を見ていきましょう。

手順:
- まず、リボンの「開発」タブを開きます。
- 次に、「Visual Basic」をクリックしてVisual Basic Editorを起動します。
- ショートカットキーのAlt + F11でも同様に開けます。
- または、シート上で右クリックして「コードの表示」を選択してもOKです。
- Visual Basicのウィンドウが開いたら、以下のVBAコードをコピー&ペーストします。
VBAコード:
Public Sub Send_Email_Automatically2()
Dim rngD, rngS, rngT As Range
Dim ob1, ob2 As Object
Dim LRow, x As Long
Dim l, strbody, rSendValue, mSub As String
On Error Resume Next
Set rngD = Application.InputBox("Deadline Range:", "Exceldemy", , , , , , 8)
If rngD Is Nothing Then Exit Sub
Set rngS = Application.InputBox("Email Range:", "Exceldemy", , , , , , 8)
If rngS Is Nothing Then Exit Sub
Set rngT = Application.InputBox("Email Topic Range:", "Exceldemy", , , , , , 8)
If rngT Is Nothing Then Exit Sub
LRow = rngD.Rows.Count
Set rngD = rngD(1)
Set rngS = rngS(1)
Set rngT = rngT(1)
Set ob1 = CreateObject("Outlook.Application")
For x = 1 To LRow
rngDValue = ""
rngDValue = rngD.Offset(x - 1).Value
If rngDValue <> "" Then
If CDate(rngDValue) - Date <= 7 And CDate(rngDValue) - Date > 0 Then
rngSValue = rngS.Offset(x - 1).Value
mSub = rngT.Offset(x - 1).Value & " on " & rngDValue
l = "<br><br>"
strbody = "<HTML><BODY>"
strbody = strbody & "Hello! " & rngSValue & l
strbody = strbody & rngT.Offset(x - 1).Value & l
strbody = strbody & "</BODY></HTML>"
Set ob2 = ob1.CreateItem(0)
With ob2
.Subject = mSub
.To = rSendValue
.HTMLBody = strbody
.Send
End With
Set ob2 = Nothing
End If
End If
Next
Set ob1 = Nothing
End Sub
- F5キーを押すか、「Sub/ユーザーフォームの実行」ボタンをクリックしてコードを実行します。

- まず、期限(Deadline)の列範囲を選択して「OK」をクリックします。

- 同様に、メールアドレスの列範囲を選択して「OK」を押します。

- 次に、メッセージの列範囲を選択して「OK」をクリックします。

- これで完了です。メッセージが各メールアドレスへ送信されます。Outlookの受信トレイを確認してみましょう。
VBAコードの解説
Public Sub Send_Email_Automatically2()
Dim rngD, rngS, rngT As Range
Dim ob1, ob2 As Object
Dim LRow, x As Long
Dim l, strbody, rSendValue, mSub As String
On Error Resume Next
Set rngD = Application.InputBox("Deadline Range:", "Exceldemy", , , , , , 8)
If rngD Is Nothing Then Exit Sub
Set rngS = Application.InputBox("Email Range:", "Exceldemy", , , , , , 8)
If rngS Is Nothing Then Exit Sub
Set rngT = Application.InputBox("Email Topic Range:", "Exceldemy", , , , , , 8)
If rngT Is Nothing Then Exit Sub
LRow = rngD.Rows.Count
Set rngD = rngD(1)
Set rngS = rngS(1)
Set rngT = rngT(1)
Set ob1 = CreateObject("Outlook.Application")
このプロシージャでは、まず変数の型を宣言し、InputBoxを使って期限・メールアドレス・メッセージの各範囲をユーザーに入力してもらいます。その後、メールクライアントとしてOutlookを設定します。
For x = 1 To LRow
rngDValue = ""
rngDValue = rngD.Offset(x - 1).Value
If rngDValue <> "" Then
If CDate(rngDValue) - Date <= 7 And CDate(rngDValue) - Date > 0 Then
rngSValue = rngS.Offset(x - 1).Value
mSub = rngT.Offset(x - 1).Value & " on " & rngDValue
l = "<br><br>"
strbody = "<HTML><BODY>"
strbody = strbody & "Hello! " & rngSValue & l
strbody = strbody & rngT.Offset(x - 1).Value & l
strbody = strbody & "</BODY></HTML>"
Set ob2 = ob1.CreateItem(0)
With ob2
.Subject = mSub
.To = rSendValue
.HTMLBody = strbody
.Send
次に、VBAのCDate関数を使って、各期限が本日から7日以内かどうかを判定します。条件を満たす行については、コード内でメール本文を作成し、最後に.Sendでメールを送信します。
関連記事: 日付に基づいてExcelからメールを自動送信する方法
合わせて読みたい記事
- 共有Excelファイルで誰が編集しているか確認する方法(クイックステップ付き)
- Excelでブックの共有を有効にする方法
- VBAを使ってExcelワークシートからリマインダーメールを自動送信する方法
- ExcelとOutlookを使って一括メールを送信する3つの方法
- 添付ファイル付きでExcelからメールを送るマクロの使い方
方法3:複数の条件を満たしたときにメールを自動送信するExcel VBA
3つ目の方法でも引き続きVBAマクロを使用しますが、今回は複数の条件がすべて満たされた場合のみ、顧客へメッセージを送信する仕組みです。それでは、具体的な手順を見ていきましょう。

手順:
- まず、リボンの「開発」タブをクリックします。
- 次に、「Visual Basic」をクリックしてVisual Basic Editorを起動します。
- ショートカットキーのAlt + F11でも開けます。
- または、シート上で右クリックし、「コードの表示」を選択してください。
- Visual Basicのウィンドウが表示されたら、そこにコードを記述します。
VBAコード:
Sub Send_Email_Automatically3()
Dim wrksht As Worksheet
Dim add As String, mSub As String, N As String
Dim eRow As Long, x As Long
Set wrksht = ThisWorkbook.Sheets("Multiple Conditions")
With wrksht
eRow = .Cells(.Rows.Count, 5).End(xlUp).Row
For x = 5 To eRow
If .Cells(x, 4) >= 1 And .Cells(x, 5) = "Yes" Then
add = .Cells(x, 3)
mSub = "Request to Pay Bill"
N = .Cells(x, 2)
Call Multiple_Conditions(add, mSub, N)
End If
Next x
End With
End Sub
Sub Multiple_Conditions(mAddress As String, mSubject As String, eName As String)
Dim ob1 As Object
Dim ob2 As Object
Set ob1 = CreateObject("Outlook.Application")
Set ob2 = ob1.CreateItem(0)
With ob2
.To = add
.CC = ""
.BCC = ""
.Subject = mSub
.Body = "Hello!" & N & ", To prevent further costs, please pay before the deadline."
.Attachments.add ActiveWorkbook.FullName
.Send
End With
Set pMail = Nothing
Set pApp = Nothing
End Sub
- 最後に、F5キーを押してコードを実行します。

- 「マクロ」ダイアログが表示されるので、適切なマクロを選択して「実行」ボタンを押します。

- 前の方法と同様に、Outlookを開いて受信トレイを確認すると、ExcelのVBAマクロから送信されたメールが届いていることが分かります。
VBAコードの解説
Sub Send_Email_Automatically3()
Dim wrksht As Worksheet
Dim add As String, mSub As String, N As String
Dim eRow As Long, x As Long
Set wrksht = ThisWorkbook.Sheets("Multiple Conditions")
With wrksht
eRow = .Cells(.Rows.Count, 5).End(xlUp).Row
For x = 5 To eRow
If .Cells(x, 4) >= 1 And .Cells(x, 5) = "Yes" Then
add = .Cells(x, 3)
mSub = "Request to Pay Bill"
N = .Cells(x, 2)
Call Multiple_Conditions(add, mSub, N)
ここでは2つのプロシージャを使用しています。最初のSend_Email_Automatically3では、対象シートとして「Multiple Conditions」を設定し、変数の型を宣言します。次にEnd(xlUp)で最終行番号を取得し、データが5行目から始まるため、ループも5行目から最終行まで実行されます。条件式では、4列目の値が1以上かつ5列目が「Yes」である行のみ処理対象となります。
Sub Multiple_Conditions(mAddress As String, mSubject As String, eName As String)
Dim ob1 As Object
Dim ob2 As Object
Set ob1 = CreateObject("Outlook.Application")
Set ob2 = ob1.CreateItem(0)
With ob2
.To = add
.CC = ""
.BCC = ""
.Subject = mSub
.Body = "Hello!" & N & ", To prevent further costs, please pay before the deadline."
.Attachments.add ActiveWorkbook.FullName
.Send
2つ目のMultiple_Conditionsプロシージャでは、メールクライアントとしてOutlookを指定し、宛先・件名・本文を設定します。さらにAttachments.Addメソッドを使って、現在開いているExcelファイル自体をメールに添付しています。最後に.Sendでメールを送信します。
関連記事: 条件を満たした場合にExcelからメールを送信する3つの簡単な方法
まとめ
以上の方法を使えば、Excelで条件を満たしたときにメールを自動送信する仕組みを構築できます。ぜひ実際の業務でお役立てください。ご質問やご提案、フィードバックなどがあれば、コメント欄でお気軽にお知らせください。その他のExcelに関する記事も、ぜひExcelDemy.comブログでご覧ください!
関連記事
- ExcelからOutlookへ自動メールを送信する4つの方法
- マクロを使って本文付きでExcelからメールを送信する方法(簡単ステップ付き)
- Excelマクロ:セル内のアドレスへメールを送信する2つの簡単な方法
- Excelスプレッドシートから複数メールを送信する2つの簡単な方法
- 本文付きでExcelからメールを送信するマクロ(3つの活用ケース)
- 編集可能なExcelスプレッドシートをメールで送る3つのクイックな方法
-
Excelでメールリンクを削除する7つの簡単な方法
Excelのワークシートにメールアドレスを入力すると、自動的にリンク(ハイパーリンク)に変換されてしまいます。この自動変換を解除したいとお悩みの方に向けて、本記事ではExcelでメールリンクを削除する方法を詳しく解説します。 Excelでメールリンクを削除する7つの方法 以下のデータセットを使って手順を説明します。このデータには社員ID、氏名、メールアドレスが含まれており、メールアドレスはリンクとして挿入されています。これから7つの方法でメールリンクを削除する手順を紹介していきます。 方法1:「ハイパーリンクの編集」でメールリンクを削除する まず、「ハイパーリンクの編集」ダイアログボックスを
-
匿名でメールを送信する方法|プライバシーを守る3つの実践テクニック
Gmail、Outlook、Yahoo!メールなど、大手インターネット企業が運営する高機能なメールクライアントは市場に数多く存在します。しかし、こうしたプラットフォームはユーザーの行動や他のオンライン活動を追跡・監視しようとするため、多くのユーザーはオンラインのプライバシーに対して不安を感じています。 通常、メールは双方向のコミュニケーション手段として使われますが、身元を明かさずにメールを送受信したい場面もあるでしょう。その理由は完全に正当なものであり得ます。単にプライバシーを大切にしたい、アカウント登録時に個人情報を提供したくない、あるいは決して追跡されたくない機密性の高いメールを送りたい—