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


いつもありがとうございます!
皆さん、こんにちは。ご覧いただきありがとうございます。
“日々の業務にちょうどいい自動化を”──
業務改善アプリケーションの作成を行っている「ソフトデザイン工房」 です。
メールを、複数の送り先に一括で送りたいときはないでしょうか。
例えば、あなたがマネージャーであれば、部下への面談の結果や、月次や半期に一度の成果評価結果などを送るときです。
営業担当であれば、多数の顧客へのメールなどが該当するでしょう。
この記事が、あなたのVBAマクロの価値をさらに高める一助となれば幸いです。
VBAを活用して、自分自身や身近なコミュニティに合ったアプリケーションを作成し、仕事量は半分に、成果は2倍に──そんな未来を目指すあなたを応援しています。
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アプリケーションが無駄に保持され続けるのを防ぎます。

以上で解説は終了です。ありがとうございました。
VBAスキルアップの参考情報
近年は、ChatGPTをはじめとするAIの登場によって、学習のスタイルが大きく変わりました。
分からないことがあれば、AIに尋ねれば答えがすぐに見つかる時代です。
とはいえ、AIを使いこなすには、自分自身の基本的な知識や理解力が欠かせません。
全体像をつかむためには、やはり書籍などで体系的に学んでおくことが今でも有効です。
そのうえでAIを活用すれば、自分の理解度に合わせた的確な解説や、応用のヒントを得ることができます。
「学んで基礎を築く → AIで補い発展させる」──このサイクルを重ねることで、VBAスキルは着実に高まっていくでしょう。
VBAのスキルアップ
VBAを学び始めるなら
入門書は、どれを選んでも大きな差はないように感じます。
どれを選ぶかに悩むことに時間をかけるよりも、まずは手頃な一冊を手に取って進めてみるのがおすすめです。
もし迷ったときには、私はインプレス社の「いちばんやさしい」シリーズを選ぶことが多いです。
基礎を超えて力をつけたいなら
私は上級者を目指していましたので、入門書にとどまらず、このような内容の濃い一冊を選んで学んでいました。
今は誰でもAIを活用できる時代になりましたが、上級者を目指す方にとっては、AIをより上手に活用するという意味でも、こうした本は今なお価値があります。
このレベルの本を一冊持っておくことに、損はないでしょう。
資格で能力を証明したいなら
VBAのプログラミング能力を客観的に示したい場合には「VBAエキスパート試験」があります。
特に「スタンダード」の方は上級者向けです。
あなたが社内業務の改善を行う立場であっても、VBAで作成したシステムをお客様に納める立場であっても、この資格は信頼や安心につながるでしょう。
以下の公式テキストが販売されています。
プログラミングの一般教養
「独学プログラマー」というプログラミングの魅力を解説した書籍があります。
これはVBAではなくPythonを題材としていますが、プログラミングの基本的な知識や思考法、仕事の進め方まで幅広く学べます。
今はAIにコードを尋ねれば、答えが返ってくる時代です。
しかし、この本からは「コード」以上に、プログラミングに向き合う姿勢や考え方を学ぶことができるでしょう。
こちらの記事でも紹介しています。もしよろしければご覧ください。
【初心者歓迎】無料相談受付中

いつもありがとうございます!
限られた時間をより良く使い、日本の生産性を高めたい──
みんなの実用学を運営するソフトデザイン工房では、業務整理や業務改善アプリケーション作成のご相談を承っております。
お気軽にご相談ください。
こちらの記事でも紹介しております。
おわりに


ご覧いただきありがとうございました!
この記事では、複数の Outlook メールを一括で作成するアプリを紹介しました。
お問い合わせやご要望がございましたら、「お問い合わせ/ご要望」フォームまたはコメント欄よりお知らせください。
この記事が皆様のお役に立てれば幸いです。
なお、当サイトでは様々な情報を発信しております。よろしければトップページもあわせてご覧ください。
この記事を書いた人






