【问题标题】:Trigger ItemSend for certain outlook macros only仅针对某些 Outlook 宏触发 ItemSend
【发布时间】:2019-04-08 00:00:00
【问题描述】:

如何修改下面的代码来触发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

我们将不胜感激。

【问题讨论】:

  • 您的意思是您希望事件myMailItem_ItemSend 仅在电子邮件由myMacro1()myMacro2() 发送时触发,而不是每次发送电子邮件时触发(即使是手动发送)?
  • 没有。仅适用于 myMacro1(),不适用于 myMacro2(),也不适用于默认的 Outlook 回复功能。

标签: vba events outlook mailitem


【解决方案1】:

我会这样做:

  1. 在您的模块中定义一个全局变量,例如Dim TriggerMsgBox As Boolean。默认情况下,该变量将为 false。
  2. myMacro1() 中将其初始化为True。只有在这种情况下,它才会变成True。否则,它将是False
  3. myMailItem_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

【讨论】:

  • 感谢您的帮助。是否有使用 myMailItem 的替代方法?为此目的公开了 myMailItem。
  • @Barok 这是在 Outlook 中发送电子邮件时要触发的事件。如果您不想使用它,您应该编写自己的宏来模拟此处触发的事件的捕获。它会更安全(因为您可以将其控制在 100%),但不一定更干净(该事件由 Microsoft 提供以捕获和处理电子邮件的发送:这就是您使用它的方式,所以我认为您的代码很好)。
  • 好的。也许仍然可以添加:如果 myMailItem 为 Nothing,则在 myMailItem_ItemSend 的第一行退出 Sub。
  • @Barok 你是对的,这肯定是要添加的检查,但它不会解决你的问题。这只是另一回事。
  • @Barok 您无法测试 myMailItem,就好像它是来自 myMacro1 的对象一样。 ByVal Item As Object 中的项目是为 myMacro1 和 myMacro2 触发 ItemSend 和手动发送的项目。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-08-24
  • 1970-01-01
  • 2019-03-12
  • 2021-02-26
  • 1970-01-01
  • 2023-04-03
相关资源
最近更新 更多