Excelで作成したメールアドレス一覧を使ってOutlookで一斉送信する

2022年2月20日

同じ内容のメールを複数の宛先に送信する場合、通常は一件ずつメールを作成して送信することになりますがExcelVBAを使うと1クリックで複数の宛先に一斉メールを送ることができます。また、一斉にメールを送る際に複数のメールアドレスを設定して送ると迷惑メールとして判断されることがありますが、ExcelVBAを使った送信ではその心配がありません。今回はExcelVBAを使ったメール送信アプリをご紹介します。メールに関連したルーティンワークで効率化が図れると思いますので参考にしてください。

サンプルアプリ実行結果

下記赤枠の「メール送信」ボタンをクリックすると、メールアドレス欄にあるアドレス宛に上から順番に1件ずつメールが送信されます。その際、件名に件名欄の内容が本文に本文欄にある内容がセットされメールが送られます。また、以下のコードを追加することにより添付ファイルを貼り付けることができます。
「UrlToLocal」はカレントフォルダ(当サンプルファイルが置かれているフォルダ)のパスを求める関数です。詳しくは下記リンク先をご覧ください。
https://scodebank.com/?p=696

'添付ファイルがあるパス
attachmentPath = UrlToLocal(ThisWorkbook.Path) & "\テストメール.txt"

'上記パスにあるファイルを添付
Call objMail.Attachments.Add(attachmentPath)

上の画像のようにメールアドレスをあらかじめリスト化しておくことにより、ボタンを1クリックするだけで一斉にメールを送ることが可能になります。

ExcelVBAでOutlookを操作するための準備

Outlookを操作するため参照設定の追加が必要になります。手順は以下の通りです。

・「ツール」から「参照設定」を選択します。


・一覧の中で「Microsoft Outlook ○○.〇 Object Library」にチェックを入れてOKボタンをクリックします。

サンプルコードの処理内容

次はExcelVBAでOutlookを操作するコードの説明です。

まず、下記のように「Outlook.Application」を指定して変数を定義します。
  Dim objOutlook As Outlook.Application
上で定義した変数にOutlook.Applicationを設定します。
   Set objOutlook = New Outlook.Application

次にメール送信用の変数を設定します。
  Dim objMail As Outlook.MailItem
上で定義した変数にobjOutlook.CreateItem(olMailItem)を設定します。
  Set objMail = objOutlook.CreateItem(olMailItem)

objMailオブジェクトのプロパティを使って宛先、メール件名、メール本文を設定します。
  objMail.To = .Range(Cells(i, 3).Address).Value     ’メール宛先
  objMail.Subject = .Range(Cells(11, 3).Address).Value  'メール件名
  objMail.BodyFormat = olFormatPlain          'メールの形式
  objMail.Body = .Range(Cells(12, 3).Address).Value   'メール本文

BodyFormatで指定できるメールの形式は下記の通りです。
・プレーンテキスト :olFormatPlain
・HTML      :olFormatHTML
・リッチテキスト  :olFormatRichText

最後にメールを送信します
  objMail.Send

送ったメールはOutlookの送信済アイテムで確認することができます。

MailItemオブジェクトのプロパティとメソッドは他にも色々用意されていますので、必要に応じて以下のサイトを参照ください。
 MailItemオブジェクトのプロパティとメソッド

サンプルコード   コードの作成手順はこちら

Option Explicit '変数の宣言を強制する

Sub OpenOutlookApp()

 Dim objOutlook As Outlook.Application '「Outlook.Application」変数定義
 Dim objMail As Outlook.MailItem       '「Outlook.MailItem」変数定義
 Dim attachmentPath As String          '添付ファイルのパスを格納する変数を定義
 Dim wsMail As Worksheet               'ワークシート名を格納する変数を定義
 Dim i As Integer                      'ループカウンタの変数を定義

 Set objOutlook = New Outlook.Application '変数にOutlook.Applicationオブジェクトを設定

'メールアドレスの数分ループさせる(4行目~8行目)
 For i = 4 To 8 Step 1

  Set wsMail = ThisWorkbook.Sheets("Sheet1")
  Set objMail = objOutlook.CreateItem(olMailItem) '変数にobjOutlook.CreateItem(olMailItem)オブジェクトを設定

  With wsMail

    objMail.To = .Range(Cells(i, 3).Address).Value         'メールの宛先にアドレスを設定
    objMail.Subject = .Range(Cells(11, 3).Address).Value   'メールの件名を設定
    objMail.BodyFormat = olFormatPlain                     'メールの形式を設定
    objMail.Body = .Range(Cells(12, 3).Address).Value      'メールの本文を設定

   '当Excelファイルのフォルダにある添付ファイルのパスを設定
    attachmentPath = UrlToLocal(ThisWorkbook.Path) & "\テストメール.txt"
   'メールにファイルを添付
    Call objMail.Attachments.Add(attachmentPath)

    objMail.Send  'メールを送信
    
  End With

 Next i

 Set objOutlook = Nothing
 MsgBox "送信完了"

End Sub



'カレントフォルダのパスを求める関数
Public Function UrlToLocal(ByRef Url As String) As String

   'OneDrive環境変数を格納する変数の定義
    Dim OneDrive As String

   'OneDrive環境変数の取得
    OneDrive = Environ("OneDrive")

   '「https://・・・・・・・/Documents」までの文字数を格納する変数の定義
    Dim CharPosi As String

   ' URLからローカルパスを作成する
    If Url Like "https://*" Then 'OneDriveのパスかどうかの判定
           
      '「https://・・・・・・・/Documents」までの文字数を取得
      CharPosi = InStr(1, Url, "/Documents") + 10
      
      'ローカルパス作成
      Url = OneDrive & Replace(Mid(Url, CharPosi), "/", Application.PathSeparator)
    
    Else
    
      'OneDriveのパス以外だったらカレントドライブ指定
      ChDrive Left(Url, 1)
     
    End If

  '作成したローカルパスを返す
   UrlToLocal = Url

End Function