【簡単Excelマクロ・VBA】複数のOutlookメールを一括作成する|アプリ事例 #002
いつもありがとうございます。
ノンプログラマー向けの「Excelマクロ・VBAアプリ事例解説シリーズ」へようこそ。
本稿では、「複数の Outlook メールを一括で作成するアプリ」の解説をいたします。
メールを、複数の送り先に一括で送りたいときはないでしょうか。
例えば、あなたがマネージャーであれば、部下への面談の結果や、月次や半期に一度の成果評価結果などを送るときです。
営業担当であれば、多数の顧客へのメールなどが該当するでしょう。
VBAで自分に合ったアプリを作成し、仕事量は半分に、成果は2倍にしていきましょう。
初心者でも理解しやすいように、分かりやすく解説していきます。ぜひご覧ください。
ことばの意味
- ノンプログラマー
プログラミングを本職としない人たちのことです。 - マクロ
VBAを使って作成される「機能」のことです。 - VBA
Visusal Basic for Application の略で、プログラミング言語のことです。
関連記事
VBAで複数のOutlookメールを一括で作成する方法
アプリの仕様
Excelシートに入力されたデータを基に、Outlookメールを自動作成します。データの件数に応じて、メールは自動的に複数作成されますが、送信は行わず、ユーザーが内容を確認して手動で送信する仕様とします。
前提条件
以下のように、プログラムを記述する「メールを作成する.xlsm」と同階層に、メールへの添付ファイル「添付ファイルA~C」があるとします。
Excelシートの設計
まず、複数のOutlookメールを送信するために、プログラムが参照するExcelシートを、上述の「メールを作成する.xlsm」内に作成します。次のようなシートを作成しましょう。ここでは例として、3件(3行)のデータを入力しています。なお、添付ファイルのパスは絶対パスで入力してください。
A列にメールアドレス、B列にメールの件名、C列にメールの本文、D列に添付ファイルのパスを入力します。
コードの実装
上述の「前提条件」と「Excelシートの設計」を基に、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)
ここでは、Excelの最初のワークシート(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形式の場合、Excelの改行記号であるvbLf
をHTML形式の<br>
に置換し、本文と署名をメール本文に追加しています。HTML形式でない場合には、本文をHTML形式に変換してから処理を行っています。
この改行記号の置換は、Excelのセル内でAlt+Enterなどで入力された改行(vbLf
)を、HTML形式で表示されるメールにおいて正しく改行として表示するために行っています。HTMLでは改行が<br>
タグとして扱われるため、この置換を行わないと、Excelのセル内での改行がメール内では無視されてしまいます。
' 添付ファイルが存在する場合は添付
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使用経験約20年
実務に使用するマクロを多数作成してきました。 - Python 3 エンジニア認定基礎試験
経済産業省が定めたガイドライン「ITスキル標準(ITSS)」に掲載されている民間資格です。
VBAプログラミングスキルアップのための参考情報
ここでは参考図書を紹介いたしますが、これらに限らず自分に合うものを選ぶことが重要だと考えております。皆様の、より一層のご成功を心よりお祈りしております。
VBAプログラミングのスキルアップ
学習用としてもハンドブックとしても役立つ便利な書籍がこちらです。価格はやや高めですが、その内容は非常に充実しています。相応のスキルを身に付けるためには、こうしたしっかりとした書籍を一冊持っておくと良いでしょう。
入門書に関しては、どの書籍も大きな違いはありません。あまり迷うことに時間をかけるよりは、手頃なものを一冊選んでみると良いでしょう。VBAの入門書は数多く出版されていますので、興味がある方はぜひチェックしてみてください。
甲乙つけがたい場合、私はインプレス社の「いちばんやさしい」シリーズを選ぶことが多いです。
\チェックしてみよう/
\チェックしてみよう/
\チェックしてみよう/
VBAのプログラミング能力を客観的に証明したい場合には「VBAエキスパート試験」があります。この試験はVBAの知識を公式に認定するものです。VBAの総合的な能力獲得を目指す方に適しています。以下の公式テキストが販売されております。
プログラミングの一般教養
「独学プログラマー」というプログラミングの魅力を解説した書籍があります。これはVBAではなくPythonを題材としていますが、プログラミングの基本的な知識や思考法、仕事の進め方まで幅広く学べます。
こちらの記事でも紹介しております。もしよろしければご覧ください。