【簡単エクセルマクロ・VBA】複数のOutlookメールを一括作成する|アプリ事例 #002

アフィリエイト広告を利用しています。
【QRコード】PC<-->スマホの切り替えにご利用ください
【QRコード】PC<-->スマホの切り替えにご利用ください
運営者・ポテ

いつもありがとうございます。

これは、ノンプログラマー向けの「エクセルマクロVBAアプリ事例紹介シリーズ」です。

本稿では、「複数の Outlook メールを一括で作成するアプリ」の解説をいたします。


メールを、複数の送り先に一括で送りたいときはないでしょうか。

例えば、あなたがマネージャーであれば、部下への面談の結果や、月次や半期に一度の成果評価結果などを送るときです。

営業担当であれば、多数の顧客へのメールなどが該当するでしょう。

VBAで自分に合ったアプリを作成し、仕事量は半分に、成果は2倍にしていきましょう。

初心者でも理解しやすいように、分かりやすく解説していきます。ぜひご覧ください。


ことばの意味
  • ノンプログラマー
    プログラミングを本職としない人たちのことです。
  • マクロ
    VBAを使って作成される「機能」のことです。
  • VBA
    Visusal Basic for Application の略で、プログラミング言語のことです。
関連記事
筆者の記事関連経験/資格
  • VBA使用経験約20年
    製品開発・生産技術系のフィールドで実務に使用するマクロを多数作成してきました。
  • Python 3 エンジニア認定基礎試験 合格
    一般社団法人Pythonエンジニア育成推進協会によって運営・認定されている民間資格で、経済産業省が定めたガイドライン「ITスキル標準(ITSS)」に掲載されています。

VBAで複数のOutlookメールを一括で作成する方法

アプリの仕様

エクセルシートに入力されたデータを基に、Outlookメールを自動作成します。データの件数に応じて、メールは自動的に複数作成されますが、送信は行わず、ユーザーが内容を確認して手動で送信する仕様とします。

前提条件

以下のように、プログラムを記述する「メールを作成する.xlsm」と同階層に、メールへの添付ファイル「添付ファイルA~C」があるとします。

エクセルシートの設計

まず、複数のOutlookメールを送信するために、プログラムが参照するエクセルシートを、上述の「メールを作成する.xlsm」内に作成します。次のようなシートを作成しましょう。ここでは例として、3件(3行)のデータを入力しています。なお、添付ファイルのパスは絶対パスで入力してください。

A列にメールアドレス、B列にメールの件名、C列にメールの本文、D列に添付ファイルのパスを入力します。

コードの実装

上述の「前提条件」と「エクセルシートの設計」を基に、Outlookメールを一括作成するコードと、その実行結果を以下に示します。

Sub CreateEmails()


    ' 使用ライブラリ
    ' Microsoft Outlook xx.x Object Library


    ' 変数の宣言
    Dim outlook_app As Outlook.Application     ' Outlookアプリケーションのオブジェクト
    Dim outlook_mail As Outlook.MailItem       ' Outlookメールのオブジェクト
    Dim ws As Worksheet                        ' データが格納されているワークシート
    Dim last_raw As Long                       ' データが格納されている最終行の行番号
    Dim row_idx As Long                        ' ループで使用する行番号のカウンタ
    Dim email_address As String                ' 送信先メールアドレス
    Dim subject As String                      ' メールの件名
    Dim body As String                         ' メールの本文
    Dim attachment_path As String              ' 添付ファイルのパス
    Dim signature As String                    ' メールの署名


    ' Outlookアプリケーションを初期化
    Set outlook_app = New Outlook.Application


    ' データが格納されているシートを変数に代入
    Set ws = ThisWorkbook.Worksheets(1)


    ' 最終行を取得
    last_raw = ws.Cells(ws.Rows.Count, 1).End(xlUp).Row


    ' Outlookメールの署名を取得する
    Set outlook_mail = outlook_app.CreateItem(olMailItem)
    outlook_mail.Display
    signature = outlook_mail.HTMLBody
    outlook_mail.Close olDiscard


    ' メール作成の繰り返し処理を実行
    For row_idx = 6 To last_raw

        ' 各行からメールアドレス、件名、本文、添付ファイルパスを取得
        email_address = ws.Cells(row_idx, 1).Value
        subject = ws.Cells(row_idx, 2).Value
        body = ws.Cells(row_idx, 3).Value
        attachment_path = ws.Cells(row_idx, 4).Value


        ' 添付ファイルパスの先頭の引用符を削除
        If Left(attachment_path, 1) = """" Then

            attachment_path = Mid(attachment_path, 2)

        End If


        ' 添付ファイルパスの末尾の引用符を削除
        If Right(attachment_path, 1) = """" Then

            attachment_path = Left(attachment_path, Len(attachment_path) - 1)

        End If


        ' 新しいメールアイテムを作成
        Set outlook_mail = outlook_app.CreateItem(olMailItem)


        With outlook_mail

            ' 送信先、件名を設定
            .To = email_address
            .subject = subject


            ' 本文にHTMLタグが含まれているか確認し、改行を <br> に置換、署名を追加
            If InStr(body, "<html>") > 0 Then

                .HTMLBody = Replace(body, vbLf, "<br>") & signature

            Else

                ' HTML形式にして本文の改行を <br> に置換し、署名を追加
                .HTMLBody = "<html><body>" & Replace(body, vbLf, "<br>") & "<br>" & signature & "</body></html>"

            End If


            ' 添付ファイルが存在する場合は添付
            If attachment_path <> "" Then

                If Dir(attachment_path) <> "" Then

                    .Attachments.Add attachment_path

                Else

                    ' 添付ファイルが見つからない場合、エラーメッセージを表示
                    MsgBox "添付ファイルのパスが見つかりません:" & attachment_path & vbCrLf & _
                           "添付ファイルの添付をスキップします", vbExclamation, "エラー"

                End If

            End If


            ' メールを表示
            .Display

        End With

    Next row_idx


    ' メール送信準備完了メッセージを表示
    MsgBox "メールの草稿の準備が完了しました。各メールの内容を確認して送信してください。"
    
    
    ' Outlookアプリケーションオブジェクトを解放
    Set outlook_app = Nothing


End Sub

解説していきます。

    ' 使用ライブラリ
    ' Microsoft Outlook xx.x Object Library

これはコードの一部ではありませんが、この コードを実行するために必要なライブラリをコメントとして記載しています。

このコードでは、Outlookアプリケーション操作するのための Microsoft Outlook xx.x Object Libraryが必要です。このライブラリを参照設定することで。メールの作成、送信、メールボックスやカレンダの操作など、Outlookのさまざまな機能にアクセスできるようになります。

ライブラリの参照設定は以下の手順で行うことができます。

VBE画面から「ツール」--> 「参照設定」を開きます。

参照設定の挿絵

Microsoft Outlook xx.x Object Library にチェックを入れて「OK」を押します。なお、これらのライブラリを初めて設定する場合、上位には表示されていません。アルファベット順に従ってリストの下の方に表示されていますので、慌てずに探してください。

参照設定の挿絵

以上で、ライブラリの参照設定は終わりです。

    ' 変数の宣言
    Dim outlook_app As Outlook.Application     ' Outlookアプリケーションのオブジェクト
    Dim outlook_mail As Outlook.MailItem       ' Outlookメールのオブジェクト
    Dim ws As Worksheet                        ' データが格納されているワークシート
    Dim last_raw As Long                       ' データが格納されている最終行の行番号
    Dim row_idx As Long                        ' ループで使用する行番号のカウンタ
    Dim email_address As String                ' 送信先メールアドレス
    Dim subject As String                      ' メールの件名
    Dim body As String                         ' メールの本文
    Dim attachment_path As String              ' 添付ファイルのパス
    Dim signature As String                    ' メールの署名

ここでは、コード内で使用する変数が宣言されています。変数は Dim 変数名 As データ型 の構文で宣言します。これにより、各変数は As 以降で指定したデータ型のデータを格納できるようになります。

例えば、outlook_app はOutlookアプリケーションのオブジェクトを格納する変数です。尚、各変数の用途については、各変数宣言の右側にコメントを記載しています。

    ' Outlookアプリケーションを初期化
    Set outlook_app = New Outlook.Application

ここでは、Outlook.Application のインスタンス(実体)作成し、そのインスタンスを変数outlook_appに格納しています。これにより、Outlookを操作できる状態になります。

なお、インスタンスとは、設計図( プログラミングの世界ではクラスと呼ばれる)に基づいて作成された「実体」のことです。

    ' データが格納されているシートを変数に代入
    Set ws = ThisWorkbook.Worksheets(1)

ここでは、エクセルの最初のワークシート(Worksheets(1))を変数wsに代入しています。このシートからメールに必要なデータ(アドレス、件名など)を取得します。

    ' 最終行を取得
    last_raw = ws.Cells(ws.Rows.Count, 1).End(xlUp).Row

ここでは、データの最終行を取得しています。つまり、どの範囲までメール作成のデータが存在するかを確認しています。

    ' Outlookメールの署名を取得する
    Set outlook_mail = outlook_app.CreateItem(olMailItem)
    outlook_mail.Display
    signature = outlook_mail.HTMLBody
    outlook_mail.Close olDiscard

ここでは、既定の署名を取得するため、一時的に仮のメールを作成し、署名を取得した後にそのメールを破棄しています。取得した署名は変数 signature に格納され、後のコードでメール本文に追加されます。

    ' メール作成の繰り返し処理を実行
    For row_idx = 6 To last_raw

ここでは、ワークシートの6行目から最終行までを順に処理するForステートメントを開始しています。

        ' 各行からメールアドレス、件名、本文、添付ファイルパスを取得
        email_address = ws.Cells(row_idx, 1).Value
        subject = ws.Cells(row_idx, 2).Value
        body = ws.Cells(row_idx, 3).Value
        attachment_path = ws.Cells(row_idx, 4).Value

ここでは、ワークシートの各行からメールアドレス、件名、本文、添付ファイルのパスを取得しています。

        ' 添付ファイルパスの先頭の引用符を削除
        If Left(attachment_path, 1) = """" Then

            attachment_path = Mid(attachment_path, 2)

        End If


        ' 添付ファイルパスの末尾の引用符を削除
        If Right(attachment_path, 1) = """" Then

            attachment_path = Left(attachment_path, Len(attachment_path) - 1)

        End If

ここでは、添付ファイルのパスが引用符で囲まれている場合、先頭と末尾の引用符を削除しています。これにより、正しいパスを扱えるようにしています。

Shift + 右クリック のメニューからパスを取得すると、そのパスが引用符で囲まれているために、このコードを実装しています。

パスのコピーの挿絵
        ' 新しいメールアイテムを作成
        Set outlook_mail = outlook_app.CreateItem(olMailItem)

ここでは、新しいメールアイテムを作成しています。これは、後で宛先や本文、添付ファイルなどを設定するための準備です。

        With outlook_mail

ここでは、メールアイテムに対して一連の設定を行うためのWithステートメントを開始しています。

            ' 送信先、件名を設定
            .To = email_address
            .subject = subject

ここでは、メールの宛先と件名に、それぞれの変数に格納されている値を代入しています。

            ' 本文にHTMLタグが含まれているか確認し、改行を <br> に置換、署名を追加
            If InStr(body, "<html>") > 0 Then

                .HTMLBody = Replace(body, vbLf, "<br>") & signature

            Else

                ' HTML形式にして本文の改行を <br> に置換し、署名を追加
                .HTMLBody = "<html><body>" & Replace(body, vbLf, "<br>") & "<br>" & signature & "</body></html>"

            End If

ここでは、本文がHTML形式かどうかを確認し、それに応じて処理を分岐しています。

HTML形式の場合、エクセルの改行記号であるvbLfをHTML形式の<br>に置換し、本文と署名をメール本文に追加しています。HTML形式でない場合には、本文をHTML形式に変換してから処理を行っています。

この改行記号の置換は、エクセルのセル内でAlt+Enterなどで入力された改行(vbLf)を、HTML形式で表示されるメールにおいて正しく改行として表示するために行っています。HTMLでは改行が<br>タグとして扱われるため、この置換を行わないと、エクセルのセル内での改行がメール内では無視されてしまいます。

            ' 添付ファイルが存在する場合は添付
            If attachment_path <> "" Then

                If Dir(attachment_path) <> "" Then

                    .Attachments.Add attachment_path

                Else

                    ' 添付ファイルが見つからない場合、エラーメッセージを表示
                    MsgBox "添付ファイルのパスが見つかりません:" & attachment_path & vbCrLf & _
                           "添付ファイルの添付をスキップします", vbExclamation, "エラー"

                End If

            End If

ここでは、添付ファイルが指定されている場合、そのファイルが存在するかを確認し、存在する場合は添付ファイルとしてメールに追加しています。ファイルが見つからない場合は、警告メッセージを表示します。

            ' メールを表示
            .Display

ここでは、作成したメールを表示し、送信する前に内容を確認できるようにしています。

        End With

ここでは、Withステートメントを終了しています。Withブロック内で指定したオブジェクト(Outlook_mail)に対する設定が完了したことを意味します。

    Next row_idx

ここでは、1つのメールが完成すると次の行(データ)に移り、次のメールを作成するためのループ処理を行っています。

    ' メール送信準備完了メッセージを表示
    MsgBox "メールの草稿の準備が完了しました。各メールの内容を確認して送信してください。"

ここでは、すべてのメール作成が完了したことを示すメッセージボックスを表示しています。

    ' Outlookアプリケーションオブジェクトを解放
    Set outlook_app = Nothing

ここでは、Outlookアプリケーションを解放しています。

つまり、Outlookアプリケーションのインスタンスに対する参照を切り、不要になったオブジェクトを解放しています。

この操作は必須ではありませんが、 コーディングの良い習慣として、使用が終わったオブジェクトは開放することが推奨されます。

これにより、メモリの使用効率を改善し、Outlookアプリケーションが無駄に保持され続けるのを防ぎます。

以上で解説は終了です。

おわりに

運営者・ポテ

ご覧いただきありがとうございました。

本稿では、複数の Outlook メールを一括で作成するアプリを紹介いたしました。

お問い合わせやご要望等ございましたら、「お問い合わせ/ご要望」またはコメントにて、ご連絡いただければ幸いでございます。

皆様の人生がより一層素晴らしいものになるよう、少しでもお役に立てれば幸いでございます。

尚、当サイトでは様々な情報を発信しております。もしよろしければ、トップページもご確認いただけると幸いでございます。

>>トップページ

VBAプログラミングスキルアップのための参考情報

ここでは参考図書を紹介いたしますが、これらに限らず自分に合うものを選ぶことが重要だと考えております。皆様の、より一層のご成功を心よりお祈りしております。

VBAプログラミングのスキルアップ

学習用としてもハンドブックとしても役立つ便利な書籍がこちらです。価格はやや高めですが、その内容は非常に充実しています。相応のスキルを身に付けるためには、こうしたしっかりとした書籍を一冊持っておくと良いでしょう。



入門書に関しては、どの書籍も大きな違いはありません。あまり迷うことに時間をかけるより、手頃なものを一冊選んでみると良いでしょう。VBAの入門書は数多く出版されていますので、興味がある方はぜひチェックしてみてください。

私は、迷った場合は、インプレス社の「いちばんやさしい」シリーズを購入することが多いです。

>>Amazon で VBA の書籍をでチェックする

>>楽天市場 で VBA の書籍をチェックする

>>Yahoo!ショッピングでVBAの書籍をチェックする


VBAのプログラミング能力を客観的に証明したい場合には「VBAエキスパート試験」があります。この試験はVBAの知識を公式に認定するものです。VBAの総合的な能力獲得を目指す方に適しています。以下の公式テキストが販売されております。



プログラミングの一般教養

「独学プログラマー」というプログラミングの魅力を解説した書籍があります。これはVBAではなくPythonを題材としていますが、プログラミングの基本的な知識や思考法、仕事の進め方まで幅広く学べます。


こちらの記事でも紹介しております。もしよろしければご覧ください。

【QRコード】PC<-->スマホの切り替えにご利用ください
【QRコード】PC<-->スマホの切り替えにご利用ください

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です