【问题标题】:How can I automatically run a macro when an email is sent in Outlook?在 Outlook 中发送电子邮件时,如何自动运行宏?
【发布时间】:2020-06-23 15:08:48
【问题描述】:

下面的脚本运行良好,但我必须在每次打开 Outlook 时手动运行 Initialize_handler 例程才能使其工作。

Public WithEvents myOlApp As Outlook.Application

Public Sub Initialize_handler()
Set myOlApp = CreateObject("Outlook.Application")
End Sub

Private Sub myOlApp_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, "Sample") = vbNo Then
    Cancel = True
    End If
End Sub

据我所知,为了自动完成这项工作,我应该能够将以下脚本添加到 ThisOutlookSession。然而,这不起作用,我不知道为什么。

我的宏安全设置正确,它在启动时运行代码,但由于某种原因,在我手动打开 VBA 编辑器单击 Initialize_handler 并按 F5 之前它不起作用。

Private Sub Application_Startup()
  Initialize_handler
End Sub

【问题讨论】:

    标签: vba outlook


    【解决方案1】:

    这里描述的卷积方法https://msdn.microsoft.com/en-us/library/office/ff865076.aspx表示“示例代码必须放在类模块中”。

    我建议你只使用特殊的类模块 ThisOutlookSession。您可以使用自己的类模块进行试验,但如果您只想让它工作,那么在 ThisOutlookSession 中用它替换所有代码。

    Private Sub Application_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, "Sample") = vbNo Then
        Cancel = True
        End If
    End Sub
    

    【讨论】:

    • 这段代码即使手动运行也不会做任何事情。
    • 如果不传递参数,则无法运行需要参数 Item 的代码。不过,这不是主要问题。您是否在测试前重新启动了 Outlook?
    • 是的,但这并不重要,因为这段代码不应该做任何事情。如果你用这个替换所有代码,就不会调用它了。
    • 这个网站上有很多例子来证明这是 ItemSend 的标准用法。 stackoverflow.com/questions/23474306/…stackoverflow.com/questions/28698291/…stackoverflow.com/questions/32171589/…stackoverflow.com/questions/2522884/… 剩下的就是检查您的安全设置。
    • 感谢您的帮助。我一定有一些代码把它搞砸了。我吃饱了,删除了我所有的东西,包括其他一些模块,现在它确实像你说的那样工作。不知道我哪里出错了,但非常感谢你的帮助。
    【解决方案2】:

    你可以直接把它放在ThisOutlookSession:

    Private Sub Application_ItemSend(ByVal Item As Object, Cancel As Boolean)
        MsgBox "Sent somthing!"
    End Sub
    

    【讨论】:

    • 那行不通。事实上,即使手动执行,代码也不会自己做任何事情。
    • 正如@niton 指出的那样,如果不传入参数,您将无法手动调用它
    【解决方案3】:

    就这么简单。请注意,您需要将您的 outMail.Display 更改为 outMail.Display (True) ,完整代码如下:

    ...
    ...
    ...
    outMail.Display (True)
    
    On Error Resume Next
    bSent = outMail.sent 'This will NOT SEND. Used to get error.
    If Err <> 0 Then
        'Email was sent. Put followed actions here.
    Else
        'Email was not sent. Put followed actions here.
    End If
    On Error GoTo 0
    

    优点:

    • 你得到你想要的
    • 很简单。

    缺点:

    • Excel(或运行此代码的任何其他运行时)将冻结,直到您取消或发送电子邮件。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-05-10
      • 1970-01-01
      • 2013-01-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-11-20
      • 1970-01-01
      相关资源
      最近更新 更多