Outlookで指定時刻になったらメールを自動送信したいときはないでしょうか。
たとえば、日報など毎日同じタイミングで出すメールを自動で作成/送信したい時などです。
けど、そんな中で悩むことは、
・VBAでOutlookメールを作成/送信したいが方法がわからない。
ですよね。
今回はそんなお悩みを解決する
・VBAでOutlookメールを作成/送信する方法
についてまとめます!
もくじ
指定時間にメールを自動送信するイメージ
指定時間にメールを自動送信するイメージについて説明をします。
まず、Outlook VBA内にメールの件名や本文、宛先などを入力します。
.Subject = "業務日報" '件名を指定します。
'本文を指定します。
.Body = "宛先各位" & vbCrLf _
& "本日の業務内容について以下の通り報告いたします。" & vbCrLf & vbCrLf _
& "9:00:朝礼" & vbCrLf _
& "10:00:商品納品" & vbCrLf _
& "13:00:定例会" & vbCrLf _
& "15:00:定期作業" & vbCrLf _
& "17:00:日報作成" & vbCrLf & vbCrLf _
& "以上/A部タカヒロ"
Outlook側へVBAを実装します。
次に実装したVBAを定期的に実行していくようスケジューリングします。
スケジュール設定を行う箇所はOutlook予定表、
またはWindowsのタスクスケジューラの2つとなります。
それぞれスケジュールを設定し、指定時刻にメールが作成/送信されるかを確認していきます。
日常繰り返しているメール作成/送信作業が自動化できると便利ですね。
それでは早速やってみましょう!
Outlookメールを作成/送信するVBA
VBAの準備
Outlookメールを作成/送信するVBAの実装方法について説明をします。
今回のサンプルコードは以下の通りです。
「【Outlook VBA】メールを作成/送信する方法!Excelデータから作成も!」を抜粋したものです。
Sub Outlookのメールを新規作成する()
'Outlook用の定義
Dim objMail As Object
If MsgBox("Outlookメールを作成しますか?", vbYesNo + vbQuestion, "確認") = vbYes Then
Set objMail = CreateItem(olMailItem)
With objMail
.BodyFormat = 3 ' 「3」の場合リッチテキスト型となります。「1」はテキスト型、「2」は HTML型となります。
.Subject = "業務日報" '件名を指定します。
'本文を指定します。
.Body = "宛先各位" & vbCrLf _
& "本日の業務内容について以下の通り報告いたします。" & vbCrLf & vbCrLf _
& "9:00:朝礼" & vbCrLf _
& "10:00:商品納品" & vbCrLf _
& "13:00:定例会" & vbCrLf _
& "15:00:定期作業" & vbCrLf _
& "17:00:日報作成" & vbCrLf & vbCrLf _
& "以上/A部タカヒロ"
.To = "user1@extan.jp" 'Toを指定します。
.CC = "user2@extan.jp" 'CCを指定します。
.Display 'メールを表示します。
'.Send 'メールを送信します。
End With
Else
MsgBox "処理を中断します。"
End If
'オブジェクトを解放します。
Set objMail = Nothing
MsgBox "Outlookメールの作成/送信が完了しました!", vbInformation
End Sub
VBAの設定
VBAの設定箇所は以下の通りです。
「3」の場合リッチテキスト型となります。「1」はテキスト型、「2」は HTML型となります。
.BodyFormat = 3
件名を指定します。
.Subject = "業務日報(2021年12月10日)"
本文を指定します。改行は「vbCrLf」で指定して、文字列を&で結合するようにしてください。
.Body = "宛先各位" & vbCrLf _
& "本日の業務内容について以下の通り報告いたします。" & vbCrLf & vbCrLf _
& "9:00:朝礼" & vbCrLf _
& "10:00:商品納品" & vbCrLf _
& "13:00:定例会" & vbCrLf _
& "15:00:定期作業" & vbCrLf _
& "17:00:日報作成" & vbCrLf & vbCrLf _
& "以上/A部タカヒロ"
Toを指定します。
.To = "user1@extan.jp"
CCを指定します。
.CC = "user2@extan.jp"
VBAの実装手順
実装手順は以下の通りです。
「開発」タブ>「Visual Basic」を押します。
「Visual Basic Editor」にて、[Project1] > [Microsoft Outlook Objects] の ThisOutlookSessionをダブルクリックします。
右ペインのコードエリアへ、VBAコードを貼り付けて保存します。
こちらで完了です。
VBAの実行
VBAを実行してみましょう。
まずはメールが作成されるか確認をします。
「”Outlookメールの作成/送信が完了しました!”」と表示されたら完了です。
作成されたメールを確認してみましょう。
はい、件名、宛先、本文に指定した値が挿入されていますね!
つづいて送信をしてみましょう。
.Send
のコメントアウトを外し、Sendメソッドを有効化します。
実行してみましょう。
はい、送信されていますね!
つづいて、このVBAを指定時間に起動するようスケジュール登録をしていきましょう。
タスクスケジューラで指定時間にOutlook VBAを起動する
タスクスケジューラで指定時間にOutlook VBAを起動する方法について説明をします。
タスクスケジューラから直接OutlookのVBAを実行することはできませんので、コマンド実行できるバッチファイルを用意して
そこからOutlookのVBAを起動するようにします。
Outlook VBAを起動するバッチファイルを用意する
Outlook VBAを起動するバッチファイルを用意しましょう。
メモ帳などのテキストエディタで以下を入力します。
start outlook.exe /autorun <実行したいマクロ名を指定>
サンプルではマクロの名前は上記プロシージャ名の「Outlookのメールを新規作成する」とします。
拡張子を「.bat」にして任意の名前で保存します。
タスクスケジューラにタスクを登録する
タスクスケジューラにタスクを登録して、先ほど作成したバッチファイルを起動するようにしましょう。
検索欄に「タスクスケジューラ」と入力し、タスクスケジューラを起動します。
右ペインの基本タスクの作成をクリックします。
基本タスクの作成で名前の欄に任意の値を入力します。
トリガーでは起動したいスケジュールを登録します。
操作ではプログラムの開始を選択し、先ほど作成したバッチファイルを選択します。
これで設定完了です。
タスクスケジューラからOutlook VBAを実行する
タスクスケジューラからOutlook VBAを実行できるか確認をしましょう。
登録したタスクを右クリックし、「実行する」を選択します。
はい、Outlook VBAが実行されメールが作成/送信されましたね。
あとは、スケジュール通り実行されているか確認をしましょう。
Outlook予定表から指定時間にOutlook VBAを起動する
Outlook予定表から指定時間にOutlook VBAを起動する方法について説明をします。
タスクスケジューラから実行する際はOutlookアプリケーション自体の起動となりますが、Outlook予定表ではOutlookアプリケーションを起動させた状態で定期実行できます。
予定を登録する
まずはOutlook予定へOutlook VBAを実行する予定を登録しましょう。
件名はサンプルでは「メールの作成と送信」としていますが任意の名前をつけても問題ありません。
アラームを0分に指定します。
アラームを拾うVBAを実装する
つづいて特定のアラームを拾うVBAをOutlookへ登録します。
Outlookの開発タブからVisual Basicを起動し、左ペインのThisOutlookSessionをダブルクリックします。
右ペインのウインドウに以下を入力します。
Private Sub Application_Reminder(ByVal objItem As Object)
Dim strItemSubject As String
‘予定アイテムの件名を指定します。
strItemSubject = "<予定アイテムの件名を指定>"
‘予定アイテムの件名とアイテムのオブジェクトクラスが”olAppointment”(26番)だった場合の条件を設定します。
‘オブジェクトクラスの詳細は以下を参照してください。
‘https://docs.microsoft.com/ja-jp/office/vba/api/outlook.olobjectclass
If objItem.Subject = strItemSubject And objItem.Class = "26" Then
‘起動したいプロシージャを指定します。
Call <起動したいマクロ名を指定>
End If
End Sub
VBAを設定する
VBAの入力ができたら、VBAの設定を行っていきます。
先ほど登録した予定の件名「メールの作成と送信」を<予定アイテムの件名を指定>へ入力します。
こちらのコードを、
strItemSubject = "<予定アイテムの件名を指定>"
このように変更します。
strItemSubject = "メールの作成と送信"
次に起動したいプロシージャを指定します。
Call <起動したいマクロ名を指定>
サンプルでは「Outlookのメールを新規作成する」としていますので、この場合は
Call Outlookのメールを新規作成する
となります。
これで設定は完了です。
Outlook予定表から指定時間にOutlook VBAを起動
Outlook予定表から指定時間にOutlook VBAが起動されるか確認をしましょう。
はい、こちらも問題なくOutlook VBAが起動され、メール作成と送信ができていますね!
さいごに
いかがでしょうか。
今回は、
・VBAでOutlookメールを作成/送信する方法
についてまとめました。
また、他にも便利な方法がありますので、よろしければご参照頂ければと思います。
こんにちは
上記を参考に以下の通り入力してみたのですが、実行がされませんでした。
Private Sub Application_Reminder(ByVal objItem As Object)
Dim strItemSubject As String
‘予定アイテムの件名を指定します。
strItemSubject = “<カレンダーの件名>”
‘予定アイテムの件名とアイテムのオブジェクトクラスが”olAppointment”(26番)だった場合の条件を設定します。
‘オブジェクトクラスの詳細は以下を参照してください。
‘https://docs.microsoft.com/ja-jp/office/vba/api/outlook.olobjectclass
If objItem.Subject = strItemSubject And objItem.Class = “26” Then
‘起動したいプロシージャを指定します。
Call <Outlookのメールを新規作成する>
End If
End Sub
どこを直せばよいか分かりますでしょうか。
いつもご利用ありがとうございます。
マクロが起動できない件ですが、
以下のマクロ名および件名指定のところで、実態と合っていな可能性があります。
おそらく“<>“が不要かとおもいますので、ご確認いただけますでしょうか。
strItemSubject = “<カレンダーの件名>”
Call <Outlookのメールを新規作成する>
こんにちは
以下の通り入力をしてみたのですが、上手く起動出来ませんでした。
どこか間違っていますでしょうか?
Private Sub Application_Reminder(ByVal objItem As Object)
Dim strItemSubject As String
‘予定アイテムの件名を指定します。
strItemSubject = “<物量確認依頼>”
‘予定アイテムの件名とアイテムのオブジェクトクラスが”olAppointment”(26番)だった場合の条件を設定します。
‘オブジェクトクラスの詳細は以下を参照してください。
‘https://docs.microsoft.com/ja-jp/office/vba/api/outlook.olobjectclass
If objItem.Subject = strItemSubject And objItem.Class = “26” Then
‘起動したいプロシージャを指定します。
Call <Outlookのメールを新規作成する>
End If
End Sub
いつもご利用ありがとうございます。
マクロが起動できない件ですが、こちらも前回答と同様で、
以下のマクロ名および件名指定のところで、実態と合っていな可能性があります。
おそらく“<>“が不要かとおもいますので、ご確認いただけますでしょうか。
strItemSubject = “<物量確認依頼>”
Call <Outlookのメールを新規作成する>
初めまして。
こちらの記事を参考にアラームを拾うVBAを実装したのですが、初回は無事メールが届いたのですが、それ以降、スケジュールに予定を入れアラームが鳴っても、メールが作成・送信されませんでした。
解決策はございますでしょうか。
いつもご利用ありがとうございます。
アラームが鳴ってもメールが送信されない件ですが、
ThisOutlookSessionにコードがあるか、
Private Sub Application_Reminder(ByVal objItem As Object)となっているか、
またマクロの設定で「すべてのマクロを有効にする」にチェックがあるか
ご確認いただけますでしょうか。
また本ページのコードを使用している場合、
予定アイテムの件名とアイテムのオブジェクトクラスが”olAppointment”(26番)だった場合にマクロが起動されるようにしておりますので、それぞれの条件が合致しているか
また起動されるマクロにエラーがないか検証いただきたくお願いいたします。
タスクスケジューラのバッチファイルについて質問です。
上記記載の通りやってみたのですが、バッチファイルを起動した際、Outlookは起動するものの、VBAの処理がされませんでした。
普通にOutlook上でのVBA処理は可能です。
何か解決方法はございますでしょうか?
いつもご利用ありがとうございます。
タスクスケジューラでOutlookは起動するがVBAの処理がされない件につきまして、
マクロの設定で制限がある選択をしていると実行できない場合がありますので、
Outlookのオプション>トラストセンター>マクロの設定より
「すべてのマクロを有効にする」にチェックがあるか確認いただき、
ない場合はこちらをチェックした上、実行いただけますでしょうか。
ありがとうございます!
解決いたしました!
上記を参考に、VBAを搭載しましたがOutlookの予定時刻がきても
マクロが起動しませんでした。
なにか、間違っておりますでしょうか?
—————————————————————————
Private Sub Application_Reminder1(ByVal objItem As Object)
Dim strItemSubject1 As String
‘予定アイテムの件名を指定します。
strItemSubject1 = “自動配信メール”
‘予定アイテムの件名とアイテムのオブジェクトクラスが”olAppointment”(26番)だった場合の条件を設定します。
‘オブジェクトクラスの詳細は以下を参照してください。
‘https://docs.microsoft.com/ja-jp/office/vba/api/outlook.olobjectclass
If objItem.Subject = strItemSubject1 And objItem.Class = “olAppointment” Then
‘起動したいプロシージャを指定します。
Call 自動配信
End If
End Sub
Private Sub 自動配信()
‘ プロシージャの内容を記述します。
End Sub
いつもご利用ありがとうございます。
マクロが自動起動できない件ですが、ご提示いただいたコードの以下の箇所を修正し
再度ご確認いただけますでしょうか。
Private Sub Application_Reminder1(ByVal objItem As Object)
⇒修正:Private Sub Application_Reminder(ByVal objItem As Object)
If objItem.Subject = strItemSubject1 And objItem.Class = “olAppointment” Then
⇒修正:If objItem.Subject = strItemSubject1 And objItem.Class = “26” Then
※うまくいかなかったら、And objItem.Class = “26”を外すか、そもそも変数strItemSubject1と件名が一致しているかご確認ください。