基礎から学ぶVBAプログラミング教室

もりさんのお題を解きながら楽しく勉強しよう

スポンサーリンク

【VBAでOutlook操作】Excelシートのデータからメールを一括作成する①

f:id:excel-accounting:20180629204252p:plain:w400

オフィスワークでメール送信をする機会が多い方、必見の記事です!

メール本文がまったく同じ内容であればToやBccなどで一斉送信できますが、

相手によってメールの文面を変えたい場合は、

一通ずつメールを作成して個人宛に送信する必要がありますよね。

そんな作業を一瞬で片づけるマクロの紹介です。

この記事で紹介すること

エクセルシートに用意したデータからOutlookのメールアイテムが一括作成できます。

f:id:excel-accounting:20180630213413p:plain:w500

作業手順の解説

※この記事はVBAの基本操作を習得している方向けに書いているので、全般的な解説は省略しています。

ただ、あまり知識のない方でも、手順どおりに実施すればおおむね問題なくできると思います。

エクセルシートにデータを用意

下記のようなフォーマットを用意します。

ご自身の業務要件に応じてフォーマットは調整してください。

f:id:excel-accounting:20180630214051p:plain

  • A~E列:宛先と宛先毎の情報
  • J列:固定情報

J列の「本文」は「ひな形」です。
宛先毎に変更したい箇所を()でくくっています。

f:id:excel-accounting:20180701153338p:plain:w350

この部分をマクロで置き換えます。

  • (氏名):C列の値
  • (使用日):D列の値
  • (金額):E列の値

ソースコード

参照設定「Microsoft Outlook XX.0 Object Library」を使用しています。

Enum col '1以降の数値を省略した場合は+1される
    宛先 = 1
    複写
    氏名
    使用日
    金額
End Enum

Sub Outlookメール一括作成()

    Dim OutlookObj As Outlook.Application 'Outlookオブジェクトの作成
    Set OutlookObj = CreateObject("Outlook.Application")
    
    Dim r As Long
    For r = 2 To Cells(1, 1).End(xlDown).Row '対象人数分の処理を繰り返す
    
        Dim mailItemObj As Outlook.MailItem 'メールアイテムオブジェクト作成
        Set mailItemObj = OutlookObj.CreateItem(olMailItem)

        Dim mailBody As String
        mailBody = CreateMailBody(r) 'メール本文作成
        
        With mailItemObj 'メールアイテム作成
            .To = Cells(r, col.宛先).Value 'Toを設定
            .CC = Cells(r, col.複写).Value 'CCを設定
            .Subject = Cells(1, "J").Value '件名を設定
            .Body = mailBody '本文を設定
        End With
        
        mailItemObj.Display '下書きを表示
        
        '次のメールアイテムを作成するためいったん破棄
        Set mailItemObj = Nothing
    
    Next r

End Sub

Function CreateMailBody(r As Long) As String
' 機能:Excelシート上の指定行番号のメール本文を作成する

    Dim sName As String, DayOfUse As String, price As Long
    sName = Cells(r, col.氏名).Value
    DayOfUse = Cells(r, col.使用日).Value
    price = Cells(r, col.金額).Value
    
    Dim sign As String '署名
    sign = Cells(12, "J").Value
    
    Dim mBody As String 'メール本文
    mBody = Cells(2, "J").Value '初期値を設定
    mBody = Replace(mBody, "(氏名)", sName)
    mBody = Replace(mBody, "(使用日)", DayOfUse)
    mBody = Replace(mBody, "(金額)", price)
    mBody = mBody & vbCrLf & vbCrLf & sign '末尾に署名を付与
    
    CreateMailBody = mBody

End Function

Enum~End Enumは「列挙体」や「列挙型」と呼ばれているもので、シートの列番号を定義して扱いやすくする方法です。

気になる方は調べてみてくださいね。
こちらもオススメ↓
エクセルVBAでシートの列の挿入も簡単に対応できちゃう列挙体の使い方

マクロの使い方

①参照設定
VBE[ツール] メニューで [参照設定] をクリック。
Microsoft Outlook XX.0 Object Libraryにチェックをいれます。
(XXはOfficeのバージョンによって異なる)

f:id:excel-accounting:20180629210138p:plain

②上記のソースコードを標準モジュールに貼り付ける
※セル番地はご自身で作成したExcelフォーマットに合わせて変更してください。

③Outlookを起動する

f:id:excel-accounting:20180629163822p:plain:w500

④マクロ実行
エクセルシート2行目~最終行のデータを元にした「下書きメール」が一括で作成されました!

もちろん「宛先」や「本文」にはエクセルシートのデータが設定されています。

f:id:excel-accounting:20180701153009p:plain:w500


⑤「送信」する
※これは人間の作業です。
マクロで作成されたメールを確認し、問題なければ送信ボタンを押します。

送信処理もマクロで行いたい場合

「面倒くさいから送信まで一気にやっちゃおうよー」って声が聞こえてきそうなので書いておきます。

f:id:excel-accounting:20180629202027p:plain:w200

あまりオススメはしませんが、一気に送信したい方はどうぞ!
※事前に必ずテストして自己責任でお願いします

mailItemObj.Display '下書きを表示
 メソッドを書き換えます。
mailItemObj.Send '送信

マクロを実行すると、メール送信まで行われます。

送信したメールは、Outlookの[送信済みアイテム]に入ります。


以上です!

エクセルデータから1件ずつコピペでメールを作成している方、ぜひぜひ使ってみてくださいね。

スポンサーリンク