メール誤送信は個人だけの問題ではなく会社や組織の信用を失う事態まで発展しかねない重大事故として取り扱われているケースが多いかと思います。
けど、いくら注意をしていたとしても、日々膨大なメールを利用していると、ヒヤリとする機会は多々あるでしょう。
そこで今回はOutlookのVBA(マクロ)を利用して、メール送信前に宛先を確認する方法を記載したいと思います。
ところで、本サイトの趣旨であるExcel事務作業の時短という観点から離れているのではとの意見があるかとおもいますが、リスク予防という点で、発生後の始末にかかる時間が抑えられると解釈してもらえばと思います。(ちょっと言い訳っぽいですね。。)
もくじ
マクロを設置する下準備をする。
以下を参考にVBAコードを配置する場所を表示させます。
Outlook VBAをはじめよう!
マクロを登録する
「開発」タブ>「Visual Basic」を押します。
「Visual Basic Editor」にて、[Project1] > [Microsoft Outlook Objects] > [ThisOutlookSession] を開きます。
右のコードエリアへ、以下のコードを貼り付けて保存します。
Private Sub Application_ItemSend(ByVal Item As Object, Cancel As Boolean)
Dim mailTo As String
Dim mailCc As String
mailTo = Item.To '宛先アドレス
mailCc = Item.CC 'Ccアドレス
Dim alertMsg As String '警告メッセージ
'";"区切りを改行へ変換する
mailTo = Replace(mailTo, ";", vbCrLf)
mailCc = Replace(mailCc, ";", vbCrLf)
alertMsg = "件名: " & Item.Subject & vbCrLf & vbCrLf & _
"To: " & vbCrLf & _
mailTo & vbCrLf & _
"Cc: " & vbCrLf & _
mailCc & vbCrLf & _
vbCrLf & "上記宛先へメールを送信してもよろしいですか?"
If MsgBox(alertMsg, vbYesNo + vbExclamation + vbDefaultButton2) <> vbYes Then
Cancel = True
End If
End Sub
試しにサンプルメールを作りチェックされるか確認をする
コードの説明はさておき、早速チェックされるか確認をしてみましょう。
適当なメールを作り、宛先、件名を入力します。
次に「送信」ボタンを押します。
そうすると警告メッセージが表示されたかと思います。
問題なければ「はい」を訂正したい場合は「いいえ」を押します。
解説です
簡単に解説します。
Private Sub Application_ItemSendはOutlookのメール作成時における送信ボタンを押下したときに発生するイベントとなります。
こちらにOutlook VBAのイベント一覧に掲載されていますので、詳細はこちらをご参照ください。
引数に指定されている「Item」は送信メールの情報が入っているオブジェクト型の変数です。
この「Item」の中にある宛先アドレスとCcアドレスを取得し、それぞれの変数へ格納しています。
次にアドレスが複数ある場合、”;”区切りでつながった情報で格納されているため、”;”を改行コードに置き換えアドレスの数分改行が入るようになっています。
その後警告メッセージにアドレスの変数の内容を表示させ、”はい”の場合はそのまま送信、”いいえ”の場合は引数のCancelでTrueを設定し送信中止となるようにしています。
最後に
今回のコードを適用すると、今後の新規または返信メールすべてにチェックができるようになり、これだけでもリスク防止策としては有効かと思います。
また、今回は宛先を表示させるというカンタンな機能だけですが、例えば自社以外のドメインが含まれていないかチェックしたり、Gmailドメインの場合は送信禁止にしたりなど機能拡張を行えば、より目的に則した利用ができると思います。
次回以降いろいろな使い方をとりあげていきたいと思います!
【質問】
“Private Sub Application_ItemSend(ByVal Item As Object, Cancel As Boolean)”
で”item”のプロパティが入力される認識でいいでしょうか?
【質問】
Dim mailTo As String
Dim mailCc As String
string型を宣言したのはアドレスが文字列だからですか?
【質問】
Item.To
Item.Cc
“『item』の変数の中身”、つまりアドレスが”;”で区切られた一文で格納されているということでいいですよね?
【質問】
“alertMsg = “件名: ” & Item.Subject”
が「送信前に宛先をチェックする」に変化する理由は何でしょうか?
最近vba_outlookの学習を始めましたが、学習に必要な情報が少なく悪戦苦闘しています、おすすめの勉強方法があればご教授お願いします。
ご質問ありがとうございます。
おっしゃる通りOutlookのVBAは情報が少ないですね…
情報がないところは独自解釈しているところもありますので、その点ご了承ください。
ご質問につきまして、以下インラインでご回答いたします。
【質問】
“Private Sub Application_ItemSend(ByVal Item As Object, Cancel As Boolean)”
で”item”のプロパティが入力される認識でいいでしょうか?
⇒引数に指定されている「Item」はオブジェクト型の変数でそこには送信メールのオブジェクトがまるまる入る形になります。
その後ToやCCプロパティなどでほしい情報だけを取得しています。
【質問】
Dim mailTo As String
Dim mailCc As String
string型を宣言したのはアドレスが文字列だからですか?
⇒はい、ご認識の通りです。
【質問】
Item.To
Item.Cc
“『item』の変数の中身”、つまりアドレスが”;”で区切られた一文で格納されているということでいいですよね?
⇒はい、ご認識の通りです。
【質問】
“alertMsg = “件名: ” & Item.Subject”
が「送信前に宛先をチェックする」に変化する理由は何でしょうか?
⇒「Item.Subject」のところで取得したメールオブジェクトの件名の値を返しているためとなります。こちらはメール件名の内容によって変更されます。
【Outlook VBA】カンタンに送信前に入力した宛先を確認するメッセージを表示する
を「ThisOutlookSession」に貼り付けて、動作を確認しました。が、いったんこれを無効(解放)しようとしましたところ、ThisOutlookSessionの開放がグレーアウトしていて実行できません。どうしたらこのマクロ(Application_ItemSend)を無効にできますか?コードを消すだけでいいのでしょうか?
ハングアウトする原因はわかりかねますが、セッション内に常駐している形となりますので、ThisOutlookSessionに張り付けたマクロを削除し、Outlookを再起動して、動作を確認してみてください。