Office
 Computer >> コンピューター >  >> ソフトウェア >> Office

Excelで条件を満たしたときにメールを自動送信する3つの方法【VBAマクロ】

メールの自動送信機能を活用すれば、あらかじめ作成しておいたメッセージをユーザーへ一括配信でき、作業時間を大幅に節約できます。特に、指定したタイミングでメールを送れる仕組みは、見込み顧客とのエンゲージメント向上に非常に効果的です。中でも最も価値が高いのは、「適切な相手に、適切なタイミングで通知を届けられる」という点でしょう。

本記事では、Excel VBAマクロを使って、条件を満たしたときに自動的にメールを送信するさまざまな方法をご紹介します。記事内のサンプルブックをダウンロードして、実際に練習することも可能です。

条件を満たしたときにExcelからメールを自動送信する3つの方法

業務では「特定の条件を満たしたら顧客へメールを送りたい」という場面が頻繁に発生します。VBAマクロを使えば、メール送信機能を自由にカスタマイズでき、複数の宛先へ同時にメールを送ることも可能です。

なお、マクロでメールを自動送信するには、パソコンにOutlookがインストールされている必要があります。以下で紹介するコードは、いずれもOutlook経由で受信者へメールを送信する仕組みです。

方法1:セルの値に基づいてメールを自動送信するVBAマクロ

まずは、データセット内の特定の列の値をもとに、メールを自動送信するVBAマクロを作成します。ここでは、下記のようなスーパーマーケットの顧客情報データセットを使用します。

このデータセットには、B列に顧客名、C列にメールアドレス、D列に商品購入の未払い金額が入力されています。未払いのある顧客へ支払い依頼のメールを送りたいのですが、ここで「請求額が10より大きい場合のみメールを送る」という条件を設けます。それでは、セルの値に基づいてメールを自動送信する手順を見ていきましょう。

Excelで条件を満たしたときにメールを自動送信する3つの方法【VBAマクロ】

手順:

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

Excelで条件を満たしたときにメールを自動送信する3つの方法【VBAマクロ】

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

Excelで条件を満たしたときにメールを自動送信する3つの方法【VBAマクロ】

  • 表示された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キーを押してコードを実行します。

Excelで条件を満たしたときにメールを自動送信する3つの方法【VBAマクロ】

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

Excelで条件を満たしたときにメールを自動送信する3つの方法【VBAマクロ】

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

Excelで条件を満たしたときにメールを自動送信する3つの方法【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列に支払期限が入力されています。それでは、日付の条件を満たしたときにメールを自動送信する手順を見ていきましょう。

Excelで条件を満たしたときにメールを自動送信する3つの方法【VBAマクロ】

手順:

  • まず、リボンの「開発」タブを開きます。
  • 次に、「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/ユーザーフォームの実行」ボタンをクリックしてコードを実行します。

Excelで条件を満たしたときにメールを自動送信する3つの方法【VBAマクロ】

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

Excelで条件を満たしたときにメールを自動送信する3つの方法【VBAマクロ】

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

Excelで条件を満たしたときにメールを自動送信する3つの方法【VBAマクロ】

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

Excelで条件を満たしたときにメールを自動送信する3つの方法【VBAマクロ】

  • これで完了です。メッセージが各メールアドレスへ送信されます。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マクロを使用しますが、今回は複数の条件がすべて満たされた場合のみ、顧客へメッセージを送信する仕組みです。それでは、具体的な手順を見ていきましょう。

Excelで条件を満たしたときにメールを自動送信する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キーを押してコードを実行します。

Excelで条件を満たしたときにメールを自動送信する3つの方法【VBAマクロ】

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

Excelで条件を満たしたときにメールを自動送信する3つの方法【VBAマクロ】

  • 前の方法と同様に、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つのクイックな方法
  1. Excelでメールリンクを削除する7つの簡単な方法

    Excelのワークシートにメールアドレスを入力すると、自動的にリンク(ハイパーリンク)に変換されてしまいます。この自動変換を解除したいとお悩みの方に向けて、本記事ではExcelでメールリンクを削除する方法を詳しく解説します。 Excelでメールリンクを削除する7つの方法 以下のデータセットを使って手順を説明します。このデータには社員ID、氏名、メールアドレスが含まれており、メールアドレスはリンクとして挿入されています。これから7つの方法でメールリンクを削除する手順を紹介していきます。 方法1:「ハイパーリンクの編集」でメールリンクを削除する まず、「ハイパーリンクの編集」ダイアログボックスを

  2. 匿名でメールを送信する方法|プライバシーを守る3つの実践テクニック

    Gmail、Outlook、Yahoo!メールなど、大手インターネット企業が運営する高機能なメールクライアントは市場に数多く存在します。しかし、こうしたプラットフォームはユーザーの行動や他のオンライン活動を追跡・監視しようとするため、多くのユーザーはオンラインのプライバシーに対して不安を感じています。 通常、メールは双方向のコミュニケーション手段として使われますが、身元を明かさずにメールを送受信したい場面もあるでしょう。その理由は完全に正当なものであり得ます。単にプライバシーを大切にしたい、アカウント登録時に個人情報を提供したくない、あるいは決して追跡されたくない機密性の高いメールを送りたい—