Outlook 一次可以处理多个宏/事件处理程序吗?我可以将 2 个宏合并为一个吗?

Can Outlook handle more than one Macro / event handler at a time? Can I combine 2 macros into one?

ThisOutlookSession 中的这些代码在我单独粘贴它们时按预期工作,但如果我一起尝试它们,则会出现错误。

下面的第一个代码使我每次点击发送电子邮件时,都会弹出一个窗口询问我是否要继续发送:

Private Sub Application_ItemSend(ByVal Item As Object, Cancel As Boolean)
    If MsgBox("Do you want to continue sending the mail?", vbOKCancel) <> vbOK Then
        Cancel = True
End Sub

下面的第二个代码使得在发送电子邮件后(一旦它进入我的已发送文件夹)我会收到一个弹出窗口,询问我是否要打印电子邮件。

Private Declare Function ShellExecute Lib "shell32.dll" Alias _
"ShellExecuteA" (ByVal hwnd As Long, ByVal lpOperation As
String, _
ByVal lpFile As String, ByVal lpParameters As String, _
ByVal lpDirectory As String, ByVal nShowCmd As Long) As
Long
Private WithEvents Items As Outlook.Items

Private Sub Application_Startup()
Dim Ns As Outlook.NameSpace
Dim Folder As Outlook.MAPIFolder
Set Ns = Application.GetNamespace("MAPI")
Set Folder = Ns.GetDefaultFolder(olFolderSentMail)
Set Items = Folder.Items
End Sub

Private Sub Items_ItemAdd(ByVal Item As Object)
If TypeOf Item Is Outlook.MailItem Then
If MsgBox("Print email?", vbYesNo Or vbQuestion) = vbYes
Then
Item.PrintOut
End If
End If

End Sub

我希望在点击发送时弹出 window,在发送邮件后弹出第二个 window。我尝试将这两个代码全部粘贴到 ThisOutlookSession 中。我收到这个错误

有没有人知道我如何让它工作,或者这是否可能?

我将您的代码放入代码错误中,并弹出了一些错误。不用担心。它们很容易修复。它看起来像一些在一行上的原始代码被分成多行并且无法正确阅读。试试这个:

Private Declare Function ShellExecute Lib "shell32.dll" Alias _
    "ShellExecuteA" (ByVal hwnd As Long, ByVal lpOperation As String, _
    ByVal lpFile As String, ByVal lpParameters As String, _
    ByVal lpDirectory As String, ByVal nShowCmd As Long) As Long

Private WithEvents Items As Outlook.Items


Private Sub Application_ItemSend(ByVal Item As Object, Cancel As Boolean)
    If MsgBox("Do you want to continue sending the mail?", vbOKCancel) <> vbOK Then
        Cancel = True
    End If
End Sub



Private Sub Application_Startup()
    Dim Ns As Outlook.NameSpace
    Dim Folder As Outlook.MAPIFolder
    Set Ns = Application.GetNamespace("MAPI")
    Set Folder = Ns.GetDefaultFolder(olFolderSentMail)
    Set Items = Folder.Items
End Sub

Private Sub Items_ItemAdd(ByVal Item As Object)
    If TypeOf Item Is Outlook.MailItem Then
        If MsgBox("Print email?", vbYesNo Or vbQuestion) = vbYes _
           Then
            Item.PrintOut
        End If
    End If

End Sub

现在开始解释。您的原始代码中的以下内容实际上是 1 行代码:

Private Declare Function ShellExecute Lib "shell32.dll" Alias _
"ShellExecuteA" (ByVal hwnd As Long, ByVal lpOperation As
String, _
ByVal lpFile As String, ByVal lpParameters As String, _
ByVal lpDirectory As String, ByVal nShowCmd As Long) As
Long

您可以使用 space 和行尾的下划线将一长行代码拆分为多行。像这样的一些区域缺少 space 和下划线。您可以将它们添加到行尾或将文本移动到一行。两者我都做了一点。

同样的问题发生在这里:

If MsgBox("Print email?", vbYesNo Or vbQuestion) = vbYes
Then

这需要一行代码。所以以下两种方法都有效,但第一种更常见,也更容易阅读:

If MsgBox("Print email?", vbYesNo Or vbQuestion) = vbYes Then

...等同于

If MsgBox("Print email?", vbYesNo Or vbQuestion) = vbYes _
Then

最后,不是 "subs" 的部分,如 "Private Declare..." 和 "Private WithEvents..." 需要放在脚本的顶部,在所有子元素之上。