動画でExcel 個別対応メールの本文を作成する、VBAでOutlook操作
動画版「マクロ講座」です。
このメール自動一括作成マクロは、
メール本文を個別の宛先ごとにカスタマイズする必要がある場合を想定しています。
そこでメール本文は、個別のデータを反映させるために、Functionを作成しています。
(サンプルファイルは、こちらです。 個別対応メールの本文を作成する、VBAでOutlook操作、サンプル97回)
本文の内容は雛形としてシート上に作成してあります。
今回はそれを取り込んでくれる function を作成するわけです。
この記事では、以下の内容について解説しています。
今回のサンプルでは、メールで対象者に対して日付時刻、そして本文を記載したメールを送ります。
本文中の赤字の部分、氏名、日付、時刻は、同じシート上のセルの値から、代入します。

前回作成したメインのマクロです。
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)は、関数に引数として渡された変数そのものを関数内で直接操作することができます。
つまり、引数の変数が直接関数によって変更されます。
したがって、関数内での変更は元の引数に反映されます。
次に本文で使っている氏名と日付、時間。この部分を今指定した変数と交換して行きます。
簡単ですが重要なコードの部分です。

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件のメールを送信する時に、送信漏れがあったり本文の記述漏れがあったりすると大変です。そういったことはエクセルで管理すると非常に効率的に安全にミスなくできるかと思います。

今回のサンプルでは、結果的に、本文の日付を「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])