今回はVBAで自動に作成したメールをOutlookの連絡帳に登録してあるアドレスに送信する方法を解説します。
メールは文章を書いたり、ファイルを添付したりと作るのに時間がかかるので、自動化できると楽ですね。
事前準備
まず、VBAでOutlookを操作するためには、参照設定をする方法とCreateObject()を使う方法の二通りありますが、下記の理由から通常は参照設定をする方法を推奨します。
参照設定とは
参照設定とは、VBAでプログラムを作成する際に特定の外部ライブラリやオブジェクトモデルを利用するための仕組みで、今回使用するOutlookのオブジェクトモデルを定義した『Microsoft Outlook Object Library』がこのオブジェクトモデルのひとつで、参照設定を行うことで、VBAエディタはそのライブラリ内のオブジェクト、メソッド、およびプロパティを認識し、コード補完機能やオブジェクトブラウザを利用できるようになって開発効率が上がります。
また、コードのエラーチェックが強化され、間違ったオブジェクト名やメソッド名を入力した際に即座にエラーを検出することができます。
参照設定の仕方
1.Excelを開き、Alt + F11を押してVBAエディタを開きます。
2.VBAエディタのメニューバーから「ツール」を選択し、「参照設定」をクリックします。
3.「参照設定」ダイアログが表示されるので、一覧から「Microsoft Outlook xx.0 Object Library」を見つけてチェックボックスをオンにします(xxはOutlookのバージョン番号)。
これで事前準備は完了です。次からコードを記述していきます。
VBAでOutlookを操作する準備
まず変数 OutlookApp を宣言し、Outlook.Applicationクラスのインスタンスを作成します。
ここでのOutlook.ApplicationはMicrosoft Outlookのアプリケーション全体を表し、具体的にはOutlookのインスタンスにアクセスし、そのインスタンスのメソッドやプロパティを操作するために使用します。
Dim OutlookApp As Outlook.Application
Set OutlookApp = New Outlook.Application
Outlookのデータにアクセスできる名前空間の取得
Outlookの名前空間を使うことで、Outlookのデータ(メール、連絡先、カレンダーなど)にアクセスできるようになります。VBAでは主にMAPI(Messaging Application Programming Interface)という名前空間を使用します。
OutlookアプリケーションオブジェクトのGetNamespaceメソッドで名前空間を取得します。
Dim olNamespace As Outlook.Namespace
Set olNamespace = OutlookApp.GetNamespace("MAPI")
名前空間(namespace)とは
名前空間(namespace)は、プログラム内で同じ名前の変数や関数が衝突しないように整理するための仕組みです。これにより、異なるスコープやモジュールで同じ名前を使用できるようになります。
VBAにおける名前空間とは、アプリケーション固有のオブジェクトモデルを通じて実現されていて、各アプリケーション(Excel、Word、Outlookなど)は独自のオブジェクトモデルを持っており、これが名前空間の役割を果たしています。
連絡先のアイテムの取得
フォルダ内のアイテムを管理するためのOutlook.Itemsオブジェクトを作成します。このオブジェクトはOutlookオブジェクトモデルにおいて、メール、連絡先、カレンダーアイテム、タスクなど、特定のフォルダに含まれるすべてのアイテムを管理することができます。
Dim olContacts As Outlook.Items
Set olContacts = olNamespace.GetDefaultFolder(olFolderContacts).Items
そしてNamespaceオブジェクトのGetDefaultFolderメソッドを使用して、デフォルトフォルダを取得し、フォルダ内のすべてのアイテムを表すItemsプロパティによって変数 olContacts にデータを格納します。
olFolderContactsは、連絡先フォルダを示すフォルダタイプで、その他にも下記の表のように、たくさんのフォルダタイプがあります。
主なフォルダタイプ
オブジェクト定義 | フォルダタイプ |
---|---|
olFolderInbox | 受信トレイ |
olFolderSentMail | 送信済みアイテム |
olFolderDrafts | 下書き |
olFolderCalendar | カレンダー |
olFolderContacts | 連絡先 |
olFolderOutbox | 送信トレイ |
連絡先のアイテムを操作するオブジェクトの作成
ContactItemオブジェクトは、Outlookの連絡先フォルダーに保存されている個々の連絡先アイテムを表します。このオブジェクトを使用することで、連絡先アイテムにアクセスし、そのプロパティやメソッドを操作することができます。
Dim olContact As Outlook.ContactItem
プロパティ | アイテム |
---|---|
FirstName | 名 |
LastName | 姓 |
Email1Address | メインのメールアドレス |
Phone1 | メインの電話番号 |
Address1 | メインの住所 |
メソッド | 用途 |
---|---|
Save | 変更を保存する |
Delete | 連絡先を削除する |
ただし、メールを送りたい連絡先がグループだった場合、もしくは、Outlookの連絡先フォルダにグループが含まれていた場合は注意が必要です。
連絡先グループはOutlook.DistListItemで操作する必要があり、個々のメールアドレスとグループが両方連絡帳にあった場合はループ抽出の際に型が一致しなくてエラーになってしまいます。これを回避するために、この場合は下記のように変数の宣言を設定して、If文などで型を確認してから代入します。
' 連絡先のアイテムを操作するオブジェクトの作成
Dim olContact As Object
・・・ 'For Each文でメールデータを抽出
' 連絡先グループを操作する場合
Dim olDistList As Outlook.DistListItem
If olContact.Class = olDistributionList Then
Set olDistList = olContact
End if
または
' 連絡先のアイテムを操作するオブジェクトの作成
Dim olContact As Object
・・・ 'For Each文でメールデータを抽出
’個々のメールを操作する場合
If TypeOf olContact Is Outlook.ContactItem Then
Dim olContactItem As Outlook.ContactItem
Set olContactItem = olContact
End if
メール送信用オブジェクトの作成
ここでは先に設定したOutlookアプリケーションオブジェクトOutlookAppのCreateItem( )を使って新しいメールアイテムのインスタンスを作成し、それを変数OutlookMailに設定します。
また、合わせてメールアドレスを格納する変数 recipient を作成します。
Dim OutlookMail As Outlook.MailItem
Set OutlookMail = OutlookApp.CreateItem(olMailItem)
' メールアドレスを格納する変数
Dim recipient As String
CreateItem( )は作成したOutlookAppオブジェクトのメソッドで新しいOutlookアイテムを作成するために使用されます。Outlookアイテムには下記のような種類があり、それぞれのアイテムを操作することができます。また、それぞれのアイテムには数値の定数を持ち、数値によって指定することも可能です。
定数 | アイテムの種類 | 用途 |
---|---|---|
0 | olMailItem | メールアイテム(電子メールメッセージ) |
1 | olAppointmentItem | 会議や予定の管理に使用する予定表アイテム |
2 | olContactItem | アドレス帳に連絡先を追加する際に使用する連絡先アイテム |
3 | olTaskItem | タスク管理やTo-Doリストに使用するタスクアイテム |
4 | olJournalItem | 作業ログや活動履歴を記録する際に使用するジャーナルアイテム |
5 | olNoteItem | 簡単なメモやリマインダーに使用するメモアイテム |
6 | olPostItem | フォルダに投稿するメッセージに使用する投稿アイテム |
7 | olDistributionListItem | 複数の連絡先をグループ化する際に使用する配布リストアイテム |
ここではメールの送信に使用するのでアイテムの種類はolMailItemに指定します。
送信するメールの作成
作成したOutlookMailオブジェクトは多くのプロパティとメソッドが使用でき、これらを使うことで詳細なメール操作が可能です。以下は主なプロパティの一覧です。
プロパティ名 | 用途 |
---|---|
To | メールの宛先(To)を表します。 |
CC | メールのCC(カーボンコピー)宛先を表します。 |
BCC | メールのBCC(ブラインドカーボンコピー)宛先を表します。 |
Subject | メールの件名を表します。 |
Body | メールの本文(テキスト形式)を表します。 |
BodyFormat | メール形式(テキスト形式:olFormatPlain、HTML形式:olFormatHTML、リッチテキスト:olFormatRichText) |
Attachments | メールに添付ファイルを追加するためのコレクションを表します。 |
メールを操作するメソッド
次の表はメールを操作するためのメソッドについての一覧です。
メソッド | 用途 |
---|---|
Display | メールアイテムを表示する。メールの内容を確認、編集するために使用。 |
Send | メールアイテムを送信する。 |
Save | メールアイテムを保存します。下書きとして保存する場合などに使用。 |
上記のプロパティとメソッドを使って送信するメールを設定します。
With OutlookMail
.To = recipient
.Subject = "テストメール"
.Body = "これはテストメールです。"
.Send ' メールを送信
End With
連絡先フォルダのメールアドレスを順番に取り出して送信
いよいよ諸々の準備ができたので、VBAのFor Each文で連絡先フォルダから1件、1件データを取り出して、メールを作成、送信処理を行っていきます。
ただ、メールを送る際いくつか注意があるのですが、Sendメソッドのみを使用するとメールの内容が表示されないまま送信されてしまうので、あらかじめよくメールの内容を確認するか、Displayメソッドで表示させてから手動で送信するようにすると間違いを防ぐことができます。
また、Outlook本体を立ち上げずにメールの送信処理をするとSendメソッドの場合は問題なく送られるのですが、Displayメソッドでメールフォームを表示させてから手動でメールを送信すると、メールが送信トレイに置かれたままになって送信されないことがありますので、この場合、Outlook本体は事前に立ち上げておいて下さい。
これで一連のプログラムが完成しました。ただ、連絡先にグループがないと仮定しています。
Sub SendEmailToContacts()
' Outlookアプリケーションオブジェクトを作成
Dim OutlookApp As Outlook.Application
Set OutlookApp = New Outlook.Application
' 名前空間を取得
Dim olNamespace As Outlook.Namespace
Set olNamespace = OutlookApp.GetNamespace("MAPI")
' 連絡先アイテムを取得
Dim olContacts As Outlook.Items
Set olContacts = olNamespace.GetDefaultFolder(olFolderContacts).Items
'連絡先のアイテムを操作するオブジェクトの作成
Dim olContact As Outlook.ContactItem
' メールアイテムを格納する変数
Dim OutlookMail As Outlook.MailItem
' メールアドレスを格納する変数
Dim recipient As String
' 全ての連絡先をループ
For Each olContact In olContacts
' メールアドレスを取得
recipient = olContact.Email1Address
' メールアドレスが存在する場合
If recipient <> "" Then
' 新しいメールアイテムを作成
Set OutlookMail = OutlookApp.CreateItem(olMailItem)
' メールのプロパティを設定
With OutlookMail
.To = recipient
.Subject = "テストメール"
.Body = "これはテストメールです。"
.Send ' メールを送信
End With
' OutlookMailオブジェクトを解放
Set OutlookMail = Nothing
End If
Next
' Outlookオブジェクトを解放
Set olContact = Nothing
Set olContacts = Nothing
Set olNamespace = Nothing
Set OutlookApp = Nothing
End Sub
For Each文で取得した連絡先アイテムの中から1件、1件のデータを取り出し、olContactオブジェクトに格納して、このオブジェクトのEmail1Addressプロパティでメールアドレスのみを変数 recipient に格納していきます。このデータをOutlookMailオブジェクトのToプロパティ(宛先)に順番に設定して、送信していく流れです。
コードの最後には作成したオブジェクトにNothingを代入して、オブジェクトを解放します。これにより不要なメモリやシステムリソースの占有を防ぎます。
これで本題のプログラムは完成しましたが、単純にメールを作成する際に使用することの多いファイルの添付やリンクの貼り方などをプラスアルファ確認してみます。
ファイルを添付する
Outlook.MailItemオブジェクトのAttachments.Addメソッドで指定したパスのファイルをメールに添付します。この際にパスは相対パスではなくフルパス(絶対パス)で指定して下さい。絶対パスを使用することでコードの可読性が向上し、メンテナンスが容易になります。相対パスを使用すると、どのディレクトリが基準になっているのかを把握する必要があり、コードの理解が難しくなって、ファイルが見つからない、誤ったファイルを参照するといったエラーを回避できます。
' メールのプロパティを設定
With OutlookMail
.To = "recipient@example.com"
.Subject = "テストメール"
.Body = "これはテストメールです。"
.BodyFormat = olFormatPlain
' 添付ファイルを追加
' メールを送信
.Send
End With
次はただメールに文章を書くだけでなく、リンクを貼る方法を解説します。
リンクを貼る
メール本文では伝えきれない詳細な情報を、リンク先のウェブページで提供できます。これにより、メール自体は短くシンプルに保ちつつ、必要な詳細を提供できます。
このリンクを貼り方にもOutlook.MailItemオブジェクトのBodyFormatプロパティを変更する方法と直接HTMLファイルを添付する方法がありますが、直接ファイルを添付する方法は添付ファイルに作成したHTMLを指定するだけなので、ここではBodyFormatプロパティを変更してHTMLの<a>タグを使ってリンクを貼る方法を解説します。
HTMLファイルとは
HTML(HyperText Markup Language)は、ウェブページの構造と内容を記述するための標準的なマークアップ言語で、HTMLは、テキスト、画像、リンク、フォームなどの要素を使用してウェブページを構築します。HTMLドキュメントは、ブラウザが解析して表示することで、ユーザーがインターネット上の情報にアクセスできるようにします。
HTMLの要素は開始タグと終了タグで囲まれており、その間に要素の内容が記述されます。HTML要素には属性を設定でき、属性は要素に追加の情報を提供します。たとえば、リンク先のURLを指定するhref属性や、画像ファイルのパスを指定するsrc属性などがあります(下記はHTMLの例)。
<!DOCTYPE html>
<html>
<head>
<title>画像の例</title>
</head>
<body>
<h1>画像を表示する例</h1>
<p>以下に画像が表示されます。</p>
<img src="https://www.example.com/image.jpg" alt="サンプル画像">
</body>
</html>
HTMLはウェブページやHTMLメールの作成に不可欠であり、適切に構造化されたHTMLドキュメントは、ユーザーがインターネット上で情報を効果的に閲覧できるようにします。
次にリンクを貼るために必要な<a>タグについての解説をします。
<a>タグとは
<a>タグ(アンカータグ)は、HTMLでハイパーリンクを作成するためのタグです。リンク先のURLやページ内の特定の位置を指定することで、ユーザーがクリックすることにより、他のウェブページやリソースに移動できるようになります。
<a>タグは、リンクテキストまたはリンクする要素を開始タグ <a>
と終了タグ </a>
で囲み、その中にリンク先を指定するhref属性を設定します。
<a href="URL">リンクテキスト</a>
以上を踏まえて送信メールを作成すると以下のようになります。
' メールのプロパティを設定
With OutlookMail
.Subject = "HTMLメールのテスト"
.To = "recipient@example.com"
= "<p>こんにちは、</p>" & _
"<p>こちらはテストメールです。以下のリンクをクリックしてください。</p>" & _
"<p> </p>" & _
"<p>よろしくお願いします。</p>"
' メールを送信
.Send
End With
BodyFormatをolFormatHTMLに設定し、HTMLBodyの中の必要な部分に<a>タグを配置してメールを作成することができました。
おわりに
VBAを使ってOutlookに登録してある連絡帳のメールアドレス宛に、連続してメールを送る方法について解説しました。もちろん、これらを応用して、より細かくメールを設定することもできますし、Excelシートのデータと連携することもできます。メールは業務で使用することが多いので、ぜひいろいろと工夫してみて下さい。
ご覧頂きありがとうございました。