個別対応メールの本文を作成する、VBAでOutlook操作 97回

個別対応メールの本文を作成する、VBAでOutlook操作

マクロ講座 動画編 97回
マクロ講座の動画VBAでメール送信

動画でExcel 個別対応メールの本文を作成する、VBAでOutlook操作

個別対応メールの本文を作成する、VBAでOutlook操作

動画版「マクロ講座」です。
このメール自動一括作成マクロは、 メール本文を個別の宛先ごとにカスタマイズする必要がある場合を想定しています。 そこでメール本文は、個別のデータを反映させるために、Functionを作成しています。
(サンプルファイルは、こちらです。 個別対応メールの本文を作成する、VBAでOutlook操作、サンプル97回

マクロ動画 個別対応メールの本文を作成する、VBAでOutlook操作

Outlookを操作してメールを送信、本文をつくるFunction

本文の内容は雛形としてシート上に作成してあります。
今回はそれを取り込んでくれる function を作成するわけです。

この記事では、以下の内容について解説しています。

  • Excel VBA を使って、Outlook でメールを送信する方法を学ぶことができる。
  • マクロでメール本文を作成する方法を学び、メールの本文をシート上の情報から自動生成できるようになる。
  • VBA で関数を定義し、その関数を使ってメール本文を作成する方法を学ぶことができる。
  • メール送信に使うアドレスを切り替える方法を学び、値渡しと参照渡しの違いを理解することができる。
  • Excel の Format 関数を使って、日付や時刻を特定の形式に変換する方法を学ぶことができる。

  1. 今回のサンプルでは、メールで対象者に対して日付時刻、そして本文を記載したメールを送ります。
    本文中の赤字の部分、氏名、日付、時刻は、同じシート上のセルの値から、代入します。

    VBAメールの本文を作るFunction1
  2. 前回作成したメインのマクロです。
    For文を使って3行目から最終行までをメールを作るという繰り返し処理をします。

    VBAメールの本文を作るFunction2

    以下のコードはコピーして使えます。

        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
  3. 送信につかうメールアドレスを、通常メインで使うプライベートのアドレス以外に持っている仕事用のアドレスに変更する場合は、以下のようにします。
    SendUsingAccount property
    .SendUsingAccount = Seesion.Account("")

    VBAメールの本文を作るFunction3
  4. ファンクションの引数として使っている ws は、メールの詳細を記述したワークシートのことで、 r はその使う行数のことです。
    その2つを引数として受け取っています。
    サンプルでは引数の型を省略していますが、これは自分が使うという前提で省略しているわけですが、引数の型は省略しないようにしたほうが良いです。

    VBAメールの本文を作るFunction4

    関数に引数を渡す場合に、参照渡しと値渡しの2通りがあります。省略した場合は参照渡しとなります。
    参照渡しはByRef 、値渡しはByVal と書きます。意味はReference(参照)、Value(値)です。

  5. Functionで使う変数を設定し、それが何かをという値を変数に代入します。

    VBAメールの本文を作るFunction5
参照渡しと値渡し

値渡し(ByVal)は、関数に引数として渡された変数のコピーを関数内に作成します。
このため、関数内でこのコピーに対して変更を加えても、元の引数の値は変わりません。

一方、参照渡し(ByRef)は、関数に引数として渡された変数そのものを関数内で直接操作することができます。
つまり、引数の変数が直接関数によって変更されます。
したがって、関数内での変更は元の引数に反映されます。


本文に使う文章をReplace関数で変換する

  1. 次に本文で使っている氏名と日付、時間。この部分を今指定した変数と交換して行きます。
    簡単ですが重要なコードの部分です。

    VBAメールの本文を作るFunction6
     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
    
  2. ではマクロをF8キーを押しながら、ステップ実行で確認していきましょう。その前に O
    utlook は先に起動しておく必要があります。

    VBAメールの本文を作るFunction7
  3. 1つ目のメール作成をステップ実行で、コードを確認しながら、見てみました。
    最初のメールができましたね。

    VBAメールの本文を作るFunction8
  4. 残りはF5キーでまとめて実行します。

    VBAメールの本文を作るFunction9
  5. 今回のサンプルはメール送信が7件と少なかったです。 けれども実務ではこれが大量にあるかと思います。 100件200件のメールを送信する時に、送信漏れがあったり本文の記述漏れがあったりすると大変です。そういったことはエクセルで管理すると非常に効率的に安全にミスなくできるかと思います。

    VBAメールの本文を作るFunction10
  6. Format 関数を使って、日付や時刻を特定の形式に変換する

    今回のサンプルでは、結果的に、本文の日付を「yyyy/mm/dd」の形式で送信しました。
    シート上には、年月日と表示されていても、日付なので送信する際には、デフォルトの形で送信されたわけです。
    〇月〇日と和式で表示させたい場合は、Format関数を使って書式を設定してやります。

    VBAメールの本文の日付を「yyyy/mm/dd」から〇月〇日と和式で表示
    '元のコード
    '    hiduke = ws.Cells(r, 6).Value
    'Format関数を使ったコード
        hiduke = Format(ws.Cells(r, 6).Value, "m月d日")
  7. 同様に、時刻をシートには文字列で10時のように記述するのではなく、10:00と記載してある場合は、Excelは時刻のシリアル値としてとらえます。
    そこで記載通りに文字列でメールに10:00と書きたい時には、Format関数を使って書式を設定してやります。

    VBAメールの本文の時刻を10:00のようにしたい
  8. '    jikoku = ws.Cells(r, 7).Value
        jikoku = Format(ws.Cells(r, 7).Value, "hh:mm")
Format関数

Format関数は、数値や日付、時刻などのデータを特定の形式に整形するために使用するVBA関数です。
日付を "yyyy/mm/dd" の形式に整形したり、 "m月d日"のように成型することができます。

Format関数の基本的な構文
Format(Expression, [Format], [FirstDayOfWeek], [FirstWeekOfYear])