仅针对某些Outlook宏触发ItemSend

时间:2018-11-04 12:04:35

标签: vba events outlook mailitem

我如何修改以下代码以仅在myMailItem_ItemSend发送电子邮件时触发事件myMacro1,而在其他情况下(例如myMacro2)则不触发该事件?

特别是对于使用myMailItem对象的那些宏,应触发该事件。

Public WithEvents myMailItem As Outlook.MailItem

Public Sub Initialize_handler() 
    Set myMailItem = Outlook.MailItem
End Sub 

Private Sub myMailItem_ItemSend(ByVal Item As Object, Cancel As Boolean) 
    Dim prompt As String 
    prompt = "Are you sure you want to send " & Item.Subject & "?" 
    If MsgBox(prompt, vbYesNo + vbQuestion, "Send confirmation") = vbNo Then 
        Cancel = True 
    End If 
End Sub

'Should trigger the send confirmation msgbox
Private Sub myMacro1()
    Dim objApp As Outlook.Application
    Set objApp = Application
    Set myMailItem = objApp.ActiveInspector.CurrentItem.ReplyAll
    myMailItem.Display
End Sub

'Should NOT trigger the send confirmation msgbox
Private Sub myMacro2()
    Dim objApp As Outlook.Application
    Set objApp = Application
    Dim oEmail As Outlook.mailItem
    Set oEmail = objApp.ActiveInspector.CurrentItem.ReplyAll
    oEmail.Display
End Sub

您的帮助将不胜感激。

1 个答案:

答案 0 :(得分:2)

我会这样做:

  1. 在模块中定义全局变量,例如Dim TriggerMsgBox As Boolean。默认情况下,该变量为false。
  2. myMacro1()中将其初始化为True。仅在这种情况下,它将变为True。否则,它将是False
  3. myMailItem_ItemSend事件中使用它:如果变量为True(表示我们刚刚被myMacro1()传递了),则需要提示MsgBox。否则,您会过去。当然,不要忘记在点击False之后将变量重置为MsgBox,否则您将继续显示它。

在您的代码中,它将是:

Public WithEvents myMailItem As Outlook.MailItem
Dim TriggerMsgBox As Boolean '<-- NEW LINE OF CODE

Public Sub Initialize_handler() 
    Set myMailItem = Outlook.MailItem
End Sub 

Private Sub myMailItem_ItemSend(ByVal Item As Object, Cancel As Boolean) 
    Dim prompt As String 
    If TriggerMsgBox Then '<-- NEW LINE OF CODE
        TriggerMsgBox = False '<-- NEW LINE OF CODE
        prompt = "Are you sure you want to send " & Item.Subject & "?" 
        If MsgBox(prompt, vbYesNo + vbQuestion, "Send confirmation") = vbNo Then 
            Cancel = True 
        End If
    End If '<-- NEW LINE OF CODE
End Sub

'Should trigger the send confirmation msgbox
Private Sub myMacro1()
    Dim objApp As Outlook.Application
    Set objApp = Application
    Set myMailItem = objApp.ActiveInspector.CurrentItem.ReplyAll
    TriggerMsgBox = True '<-- NEW LINE OF CODE
    myMailItem.Display
End Sub

'Should NOT trigger the send confirmation msgbox
Private Sub myMacro2()
    Dim objApp As Outlook.Application
    Set objApp = Application
    Dim oEmail As Outlook.mailItem
    Set oEmail = objApp.ActiveInspector.CurrentItem.ReplyAll
    oEmail.Display
End Sub