Outlook VBA:自動で動作するマクロを作る(イベントマクロ)

イベントマクロについて解説します。

目次

イベントマクロとは

イベントマクロとは、何かの動作をトリガーにして自動的に動作するマクロのこと。

たとえば、メール受信時にxxする、という処理を実行するマクロのこと。

Excel VBAにもイベントマクロの機能はありますが、実際に使うのは、

  • Excel起動時にxx する
  • Excel終了持にxx する
  • Excelの更新時に xx する

ぐらいかと。

対して、Outlookでは、「xxしたらxxする」という状況が生まれやすいので、Outlookとイベントマクロとは相性がよいです。

Outlookでイベントマクロを使いこなせれば、業務の効率化に大きく寄与するので、ぜひ活用してください。

イベントマクロの実装方法

STEP
VBEを開く
STEP
ThisOutlookSessionを開く

「標準モジュール」を選ばないようにご注意ください

STEP
オブジェクトボックスとプロシージャボックスで希望のイベントを選択

オブジェクトボックスには、以下の2つがあります。

オブジェクト説明プロシージャ例
Applicationアプリケーションレベルのイベントメールを送信持:ItemSend
メールを受信持:NewMailEx
Outlook起動持;Startup
Outlook終了時;Quit
myMailItemアイテムレベルのイベント選択中のメールアイテムを閉じたとき

左側のオブジェクトボックスを選び、続いて右側のプロシージャを選びます。

イベントマクロの書式

Private Sub オブジェクト_イベント(引数)
処理
End Sub

STEP
イベントマクロ内にコードを記述

STEP3でオブジェクトボックスとプロシージャボックスを選択すると、コードウィンドウ内に関数の枠が自動で入力されるので、そこにコードを記述していきます。

アプリケーションレベルのイベント

以下などがります。

オブジェクト型式説明引数
ItemSendメールを送信持Item: 送信メール、
Cancel:Trueにすると送信キャンセル
NewMailExメールを受信持EntryIDCollection:エントリID
StartupOutlook起動持無し
QuitOutlook終了時無し

アイテムレベルのイベント

アイテムレベルのイベントとは、メールアイテムオブジェクトなどの個別アイテムの動作をトリガとして動作します。

このアイテムレベルのイベントは多くの種類があります。詳細は以下をご覧ください。

>> Outlook VBA リファレンス

アイテムレベルのイベントを作成するのは事前準備が必要です。

WithEventsステートメントを使って、イベントに応答磨るアイテムオブジェクトを作り、そのアイテムオブジェクトに対象の個別アイテムをセットする必要があります。

Private WithEvents オブジェクト名 As オブジェクト型

オブジェクト名

オブジェクト名は好きな名前をつけて良いけど、「MyMailItem」のように「my + オブジェクト型」で記述されることがほどんど。

オブジェクト型

オブジェクト型式内容
MailItemメールアイテム
ApplicationItem予定表アイテム
TaskItemタスクアイテム
Itemsアイテムコレクションオブジェクト
Inspectorsインスペクター

特定のメール受信時に特定の処理を行う

メール受信時にメッセージボックスを表示させる

やりたいこと
  • Outlookで実行するVBAマクロ
  • メール受信時に自動で実行されるイベントマクロ
  • 件名に「リリース情報」が含まれたメールを受信したら、メッセージボックスを表示させる

メッセージボックスを表示させるには、Outlookがアクティブ(画面上に表示)になっている必要があるので、実用度は低いかと。

サンプルコードは以下のとおり。

以下のコードはOutlookのVBEでThisOutlookSessionモジュールに追加してください。

' OutlookのVBAエディターでThisOutlookSessionに追加
Private Sub Application_NewMailEx(ByVal EntryIDCollection As String)
    ' 受信メールのIDコレクションを分割
    Dim arrEntryIDs() As String
    Dim EntryID As Variant
    arrEntryIDs = Split(EntryIDCollection, ",")
    
    ' 受信メールを確認
    Dim ns As Outlook.Namespace
    Dim itm As Outlook.MailItem
    Set ns = Application.GetNamespace("MAPI")
    
    For Each EntryID In arrEntryIDs
        Set itm = ns.GetItemFromID(EntryID)
        
        ' メールアイテムの場合
        If TypeName(itm) = "MailItem" Then
            ' 件名に「リリース情報」が含まれているか確認
            If InStr(itm.Subject, "リリース情報") > 0 Then
                ' メッセージボックスを表示
                MsgBox "件名に「リリース情報」が含まれたメールを受信しました。", vbInformation, "新しいメール"
            End If
        End If
    Next EntryID
End Sub

メール受信時にメールを移動させる

やりたいこと
  • Outlookで実行するVBAマクロ
  • メール受信時に自動で実行されるイベントマクロ
  • 宛先が「sample@aaa.com」のメールを受信したら、そのメールを、「重要」フォルダに移動させる

サンプルコードは以下のとおり。

以下のコードはOutlookのVBEでThisOutlookSessionモジュールに追加してください。

' OutlookのVBAエディターでThisOutlookSessionに追加
Private Sub Application_NewMailEx(ByVal EntryIDCollection As String)
    ' 受信メールのIDコレクションを分割
    Dim arrEntryIDs() As String
    Dim EntryID As Variant
    arrEntryIDs = Split(EntryIDCollection, ",")
    
    ' 受信メールを確認
    Dim ns As Outlook.Namespace
    Dim itm As Outlook.MailItem
    Dim destFolder As Outlook.Folder
    Set ns = Application.GetNamespace("MAPI")
    Set destFolder = ns.GetDefaultFolder(olFolderInbox).Folders("重要")
    
    For Each EntryID In arrEntryIDs
        Set itm = ns.GetItemFromID(EntryID)
        
        ' メールアイテムの場合
        If TypeName(itm) = "MailItem" Then
            ' 宛先に「sample@aaa.com」が含まれているか確認
            If InStr(itm.To, "sample@aaa.com") > 0 Then
                ' メールを「重要」フォルダに移動
                itm.Move destFolder
            End If
        End If
    Next EntryID
End Sub

メール受信時にExcelに出力する

やりたいこと
  • Outlookで実行するVBAマクロ
  • メール受信時に自動で実行されるイベントマクロ
  • 差出人が「sample@aaa.com」のメールを受信したら、そのメールをExcelに出力する
  • 出力するExcelは、デスクトップに保存された「important.xls」とする
  • ExcelのB列に件名、C列に受信日時を出力する

サンプルコードは以下のとおり。

以下のコードはOutlookのVBEでThisOutlookSessionモジュールに追加してください。

Private Sub Application_NewMailEx(ByVal EntryIDCollection As String)
    Dim arrEntryIDs() As String
    Dim EntryID As Variant
    arrEntryIDs = Split(EntryIDCollection, ",")
    
    Dim ns As Outlook.Namespace
    Dim itm As Outlook.MailItem
    Set ns = Application.GetNamespace("MAPI")
    
    For Each EntryID In arrEntryIDs
        Set itm = ns.GetItemFromID(EntryID)
        
        If TypeName(itm) = "MailItem" Then
            If itm.SenderEmailAddress = "sample@aaa.com" Then
                Call ExportMailToExcel(itm)
            End If
        End If
    Next EntryID
End Sub

Private Sub ExportMailToExcel(mail As Outlook.MailItem)
    Dim xlApp As Object
    Dim xlWB As Object
    Dim xlSheet As Object
    Dim desktopPath As String
    Dim filePath As String
    
    ' デスクトップのパスを取得
    desktopPath = CreateObject("WScript.Shell").SpecialFolders("Desktop")
    filePath = desktopPath & "\important.xls"
    
    ' Excelアプリケーションを起動
    On Error Resume Next
    Set xlApp = GetObject(, "Excel.Application")
    If xlApp Is Nothing Then
        Set xlApp = CreateObject("Excel.Application")
    End If
    On Error GoTo 0
    
    ' Excelファイルを開く
    Set xlWB = xlApp.Workbooks.Open(filePath)
    Set xlSheet = xlWB.Sheets(1)
    
    ' 最終行を取得して新しい行にデータを追加
    Dim lastRow As Long
    lastRow = xlSheet.Cells(xlSheet.Rows.Count, "B").End(-4162).Row + 1 ' -4162はxlUpの値
    
    ' メール情報をExcelに出力
    xlSheet.Cells(lastRow, 2).Value = mail.Subject
    xlSheet.Cells(lastRow, 3).Value = mail.ReceivedTime
    
    ' 保存してExcelを閉じる
    xlWB.Save
    xlWB.Close SaveChanges:=False
    xlApp.Quit
    
    ' オブジェクトの解放
    Set xlSheet = Nothing
    Set xlWB = Nothing
    Set xlApp = Nothing
End Sub

コードの説明

  1. Application_NewMailEx サブルーチンは、新しいメールが受信されたときに自動的に呼び出されます。
  2. EntryIDCollection を分割して各メールアイテムを取得し、差出人が「sample@aaa.com」のメールをチェックします。
  3. 該当するメールが見つかった場合、ExportMailToExcel サブルーチンを呼び出して、メールの件名と受信日時をExcelに出力します。
  4. ExportMailToExcel サブルーチンは、Excelを起動し、デスクトップに保存された「important.xls」ファイルを開きます。
  5. ExcelファイルのB列に件名、C列に受信日時を追加し、ファイルを保存します。

メール送信時に注意喚起する

やりたいこと
  • Outlookで実行するVBAマクロ
  • メール送信時に自動で実行されるイベントマクロ
  • メール送信時に、「添付忘れない?送信してよい?」とメッセージボックスを表示させる
  • Noが選択されたらメールの送信をキャンセルする

サンプルコードは以下のとおり。

以下のコードはOutlookのVBEでThisOutlookSessionモジュールに追加してください。

' OutlookのVBAエディターでThisOutlookSessionに追加
Private Sub Application_ItemSend(ByVal Item As Object, Cancel As Boolean)
    ' 送信アイテムがメールの場合
    If TypeName(Item) = "MailItem" Then
        Dim mail As Outlook.MailItem
        Set mail = Item
        
        ' メッセージボックスを表示して、ユーザーの選択を確認
        Dim result As VbMsgBoxResult
        result = MsgBox("添付忘れない?送信してよい?", vbYesNo + vbQuestion, "メール送信確認")
        
        ' Noが選択された場合、送信をキャンセル
        If result = vbNo Then
            Cancel = True
            MsgBox "メールの送信がキャンセルされました。", vbInformation, "送信キャンセル"
        End If
    End If
End Sub
よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!
目次