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..." 需要放在脚本的顶部,在所有子元素之上。
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..." 需要放在脚本的顶部,在所有子元素之上。