個別対応メールの本文を作成する、VBAでOutlook操作
動画でExcel 個別対応メールの本文を作成する、VBAでOutlook操作
個別対応メールの本文を作成する、VBAでOutlook操作
動画版「マクロ講座」です。
このメール自動一括作成マクロは、
メール本文を個別の宛先ごとにカスタマイズする必要がある場合を想定しています。
そこでメール本文は、個別のデータを反映させるために、Functionを作成しています。
(サンプルファイルは、こちらです。 個別対応メールの本文を作成する、VBAでOutlook操作、サンプル97回)
マクロ動画 個別対応メールの本文を作成する、VBAでOutlook操作
Outlookを操作してメールを送信、本文をつくるFunction
本文の内容は雛形としてシート上に作成してあります。
今回はそれを取り込んでくれる function を作成するわけです。
この記事では、以下の内容について解説しています。
- Excel VBA を使って、Outlook でメールを送信する方法を学ぶことができる。
- マクロでメール本文を作成する方法を学び、メールの本文をシート上の情報から自動生成できるようになる。
- VBA で関数を定義し、その関数を使ってメール本文を作成する方法を学ぶことができる。
- メール送信に使うアドレスを切り替える方法を学び、値渡しと参照渡しの違いを理解することができる。
- Excel の Format 関数を使って、日付や時刻を特定の形式に変換する方法を学ぶことができる。
-
今回のサンプルでは、メールで対象者に対して日付時刻、そして本文を記載したメールを送ります。
本文中の赤字の部分、氏名、日付、時刻は、同じシート上のセルの値から、代入します。 -
前回作成したメインのマクロです。
For文を使って3行目から最終行までをメールを作るという繰り返し処理をします。
以下のコードはコピーして使えます。
For r = 3 To lastrow Dim OutMail As Outlook.MailItem Set OutMail = OutApp.CreateItem(olMailItem) Dim BodyOfMail As String BodyOfMail = CreateBodyOfMail(ws, r) With OutMail .To = ws.Cells(r, 4).Value .Subject = ws.Cells(r, 5).Value & "様 " & ws.Cells(2, 9).Value .body = BodyOfMail End With OutMail.Display ' OutMail.Save OutMail.Send Set OutMail = Nothing Next r
-
送信につかうメールアドレスを、通常メインで使うプライベートのアドレス以外に持っている仕事用のアドレスに変更する場合は、以下のようにします。
SendUsingAccount property
.SendUsingAccount = Seesion.Account("") -
ファンクションの引数として使っている ws は、メールの詳細を記述したワークシートのことで、 r はその使う行数のことです。
その2つを引数として受け取っています。
サンプルでは引数の型を省略していますが、これは自分が使うという前提で省略しているわけですが、引数の型は省略しないようにしたほうが良いです。
関数に引数を渡す場合に、参照渡しと値渡しの2通りがあります。省略した場合は参照渡しとなります。
参照渡しはByRef 、値渡しはByVal と書きます。意味はReference(参照)、Value(値)です。 -
Functionで使う変数を設定し、それが何かをという値を変数に代入します。
値渡し(ByVal)は、関数に引数として渡された変数のコピーを関数内に作成します。
このため、関数内でこのコピーに対して変更を加えても、元の引数の値は変わりません。
一方、参照渡し(ByRef)は、関数に引数として渡された変数そのものを関数内で直接操作することができます。
つまり、引数の変数が直接関数によって変更されます。
したがって、関数内での変更は元の引数に反映されます。
本文に使う文章をReplace関数で変換する
-
次に本文で使っている氏名と日付、時間。この部分を今指定した変数と交換して行きます。
簡単ですが重要なコードの部分です。Function CreateBodyOfMail(ByVal ws As Worksheet, ByVal r As Long) As String Dim simei As String, hiduke As String, jikoku As String, tantou As String simei = ws.Cells(r, 2).Value hiduke = ws.Cells(r, 6).Value jikoku = ws.Cells(r, 7).Value tantou = ws.Cells(10, 9).Value Dim body As String body = ws.Cells(3, 9).Value body = Replace(body, "氏名", simei) body = Replace(body, "日付", hiduke) body = Replace(body, "時刻", jikoku) body = body & vbCrLf & vbCrLf & tantou CreateBodyOfMail = body End Function
-
ではマクロをF8キーを押しながら、ステップ実行で確認していきましょう。その前に O
utlook は先に起動しておく必要があります。 -
1つ目のメール作成をステップ実行で、コードを確認しながら、見てみました。
最初のメールができましたね。 -
残りはF5キーでまとめて実行します。
-
今回のサンプルはメール送信が7件と少なかったです。 けれども実務ではこれが大量にあるかと思います。 100件200件のメールを送信する時に、送信漏れがあったり本文の記述漏れがあったりすると大変です。そういったことはエクセルで管理すると非常に効率的に安全にミスなくできるかと思います。
-
Format 関数を使って、日付や時刻を特定の形式に変換する
今回のサンプルでは、結果的に、本文の日付を「yyyy/mm/dd」の形式で送信しました。
シート上には、年月日と表示されていても、日付なので送信する際には、デフォルトの形で送信されたわけです。
〇月〇日と和式で表示させたい場合は、Format関数を使って書式を設定してやります。'元のコード ' hiduke = ws.Cells(r, 6).Value 'Format関数を使ったコード hiduke = Format(ws.Cells(r, 6).Value, "m月d日")
-
同様に、時刻をシートには文字列で10時のように記述するのではなく、10:00と記載してある場合は、Excelは時刻のシリアル値としてとらえます。
そこで記載通りに文字列でメールに10:00と書きたい時には、Format関数を使って書式を設定してやります。
' jikoku = ws.Cells(r, 7).Value jikoku = Format(ws.Cells(r, 7).Value, "hh:mm")
Format関数は、数値や日付、時刻などのデータを特定の形式に整形するために使用するVBA関数です。
日付を "yyyy/mm/dd" の形式に整形したり、 "m月d日"のように成型することができます。
Format関数の基本的な構文
Format(Expression, [Format], [FirstDayOfWeek], [FirstWeekOfYear])