Vba 仅针对某些outlook宏触发ItemSend

Vba 仅针对某些outlook宏触发ItemSend,vba,events,outlook,mailitem,Vba,Events,Outlook,Mailitem,仅当电子邮件由myMacro1发送时,我如何修改以下代码以触发事件myMailItem\u ItemSend,而不是在其他情况下(例如myMacro2) 特别是对于那些使用myMailItem对象的宏,应该触发该事件 Public WithEvents myMailItem As Outlook.MailItem Public Sub Initialize_handler() Set myMailItem = Outlook.MailItem End Sub Private Su

仅当电子邮件由myMacro1发送时,我如何修改以下代码以触发事件
myMailItem\u ItemSend
,而不是在其他情况下(例如
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
非常感谢您的帮助。

我愿意:

  • 在模块中定义一个全局变量,例如
    Dim triggersgbox为Boolean
    。默认情况下,该变量将为false
  • myMacro1()
    中将其初始化为True。只有在这种情况下,它才会变成
    True
    。否则,它将是
    False
  • myMailItem\u ItemSend
    事件中使用它:如果变量
    True
    (意味着我们刚刚经过
    myMacro1()
    ),则需要提示
    MsgBox
    。否则,你就会路过。当然,在点击
    MsgBox
    后,不要忘记将变量重置为
    False
    ,否则您将在以后继续显示它
  • 在您的代码中,它将是:

    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
    
    Public,事件myMailItem作为Outlook.MailItem
    Dim TriggerMsgBox作为布尔值“我会这样做:

  • 在模块中定义一个全局变量,例如
    Dim triggersgbox为Boolean
    。默认情况下,该变量将为false
  • myMacro1()
    中将其初始化为True。只有在这种情况下,它才会变成
    True
    。否则,它将是
    False
  • myMailItem\u ItemSend
    事件中使用它:如果变量
    True
    (意味着我们刚刚经过
    myMacro1()
    ),则需要提示
    MsgBox
    。否则,你就会路过。当然,在点击
    MsgBox
    后,不要忘记将变量重置为
    False
    ,否则您将在以后继续显示它
  • 在您的代码中,它将是:

    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
    
    Public,事件myMailItem作为Outlook.MailItem
    
    Dim TriggermsBox As Boolean'您的意思是,您希望仅当电子邮件由
    myMacro1()
    myMacro2()
    发送时触发事件
    myMailItem\u ItemSend
    ,而不是每次发送电子邮件时(即使是手动发送)?否。仅适用于myMacro1(),不适用于myMacro2()也不是默认的outlook replyall函数。您的意思是,您希望只有通过
    myMacro1()
    myMacro2()
    发送电子邮件时才会触发事件
    myMailItem\u ItemSend
    ,而不是每次发送电子邮件时(即使是手动发送)?否。仅适用于myMacro1(),不适用于myMacro2()也不是默认的outlook回复功能。谢谢您的帮助。有没有其他方法使用myMailItem?myMailItem已为此公开。@Barok在Outlook中发送电子邮件时将触发此事件。如果您不想使用它,您应该编写自己的宏来模拟此处触发的事件捕获。它会更安全(因为你会将其控制在100%),但不一定更干净(该活动由Microsoft提供,用于捕获和处理电子邮件的发送:这就是你使用它的方式,因此我认为你的代码很好)。也许还有一种选择是添加:如果myMailItem为Nothing,则在myMailItem_ItemSend的第一行退出Sub。@Barok您是对的,这肯定是要添加的检查,但它不能解决您的问题。这只是另一件事。@Barok您不能像测试myMacro1中的对象一样测试myMailItem。
    ByVal item As Object
    中的项是触发myMacro1和myMacro2的itemssend以及手动发送的项。感谢您的帮助。有没有其他方法使用myMailItem?myMailItem已为此公开。@Barok在Outlook中发送电子邮件时将触发此事件。如果您不想使用它,您应该编写自己的宏来模拟此处触发的事件捕获。它会更安全(因为你会将其控制在100%),但不一定更干净(该活动由Microsoft提供,用于捕获和处理电子邮件的发送:这就是你使用它的方式,因此我认为你的代码很好)。也许还有一种选择是添加:如果myMailItem为Nothing,则在myMailItem_ItemSend的第一行退出Sub。@Barok您是对的,这肯定是要添加的检查,但它不能解决您的问题。这只是另一件事。@Barok您不能像测试myMacro1中的对象一样测试myMailItem。
    ByVal item As Object
    中的项是触发myMacro1和myMacro2的ItemSend以及手动发送的项。