您问题中的子例程有一个MailItem 作为参数。它被设计为由另一个决定应该检查并可能处理MailItem 的例程调用。如果没有其他例程,则无法使用您显示的例程。我不太了解您的问题,无法提供解决方案。相反,我提供了一些背景信息和指导,足以让您构建所需的宏。
有四种不同的方法可以选择MailItem 以供宏处理:
- 用户在文件夹中选择一封或多封电子邮件,然后调用宏来检查这些电子邮件。
- 例程向上或向下扫描已知文件夹,检查其中的
MailItems。
- 规则选择传入的电子邮件,“运行脚本”选项指定要运行的宏。
- 打开 Outlook 时自动运行的宏请求 Outlook 监视文件夹(例如收件箱)中的新项目,并在每次新项目到达时运行特定的宏。 “新项目”是您可以向 Outlook 监视器询问的众多事件之一。
大多数时候这四种方法是完全独立的;您必须选择最符合您当前要求的一个,而忽略其他的。话虽如此,我已经使用方法 1 选择了一封电子邮件,并将包含该电子邮件的文件夹标识为用户为方法 2 指定文件夹的简便方法。但是,这种混合和匹配这四种方法的机会很少。
我猜学生会将他们的作业通过电子邮件发送给您,您希望将其放入以该学生命名的光盘文件夹中。我怀疑方法 3 最合适。
识别出一封电子邮件后,您想对照您的联系人对其进行检查。不清楚您希望如何执行该检查,可能是因为您不知道您的选择是什么。
如果我不知道某个特定功能,我会使用我最喜欢的搜索引擎搜索“Outlook VBA xxxxxxxx”。这通常会带来很多不同的网站。可能其中一个是 Microsoft 网站,其余的是来自问答网站的教程或相关问题。我觉得微软网站就像一本字典;它告诉我这个词的意思,但不告诉我如何使用它。其他网站就像小说,可能包含一个句子,其中包含我想要的单词,但没有给出对该单词的解释。我通常必须查看其他一些站点以了解该功能,然后查看 Microsoft 站点以获取正式定义。
查看为“Outlook VBA 联系人”找到的站点,我构建了这个宏:
Option Explicit
Sub DemoContacts()
Dim FldrContacts As Outlook.Folder
Dim InxF As Long
' Session.GetDefaultFolder(olFolderContacts) returns the default folder for contacts.
' On my system, Outlook does not use the default folder. I had to look at "My
' Contacts" where a list told me that it saved my contacts in "OutlookOutlook".
' Note: "OutlookOutlook" is the name of a store. A store is disc file in which
' Outlook stores emails, task, contacts and so on.
'Set FldrContacts = Session.GetDefaultFolder(olFolderContacts)
Set FldrContacts = Session.Folders("OutlookOutlook").Folders("Contacts")
For InxF = 1 To FldrContacts.Items.Count
With FldrContacts.Items(InxF)
Debug.Print .Email1DisplayName & " " & .Email1Address
End With
Next
End Sub
上述宏为所选文件夹中的每个联系人显示两个属性。还有很多很多的属性,但我选择了我认为最有可能符合您要求的两个。有关方法和属性的完整列表,请参阅 https://docs.microsoft.com/en-us/office/vba/api/outlook.contactitem。
下一个宏,和你的一样,被设计为由另一个例程调用。稍后我将讨论调用例程。
Public Sub OutSomeProperties(ItemCrnt As Outlook.MailItem)
' Outputs selected properties of a MailItem to the Immediate Window.
' The Immediate Window can only display about 200 rows before the older
' rows start scrolling off the top. This means this routine is only
' suitable for displaying a small number of simple properties. Add or
' remove properties as necessary to meet the current requirement.
Dim InxA As Long
Dim InxR As Long
Debug.Print "=============================================="
With ItemCrnt
Debug.Print " Created: " & .CreationTime
Debug.Print " Receiver: " & .ReceivedByName
Debug.Print " Received: " & .ReceivedTime
For InxR = 1 To .Recipients.Count
Debug.Print "Recipient: " & .Recipients(InxR)
Next
Debug.Print " Sender: " & .Sender
Debug.Print " SenderEA: " & .SenderEmailAddress
Debug.Print " SenderNm: " & .SenderName
Debug.Print " SentOn: " & .SentOn
Debug.Print " Subject: " & .Subject
Debug.Print " To: " & .To
If .Attachments.Count > 0 Then
Debug.Print "Attachments:"
For InxA = 1 To .Attachments.Count
Debug.Print " " & InxA & ": " & .Attachments(InxA).DisplayName
Next
End If
End With
End Sub
第二个宏显示电子邮件的选定属性。
这两个宏背后的想法是,您可以发现与ContactItem 的属性之一匹配的MailItem 的属性,以便您可以链接它们。我的猜测是ContactItem 的Email1Address 将匹配MailItem 的SenderEmailAddress。
这是一个可能的调用例程:
Public Sub InvestigateEmails()
' Outputs all or selected properties of one or more emails.
Dim Exp As Explorer
Dim ItemCrnt As MailItem
Set Exp = Outlook.Application.ActiveExplorer
If Exp.Selection.Count = 0 Then
Call MsgBox("Please select one or more emails then try again", vbOKOnly)
Exit Sub
Else
For Each ItemCrnt In Exp.Selection
If ItemCrnt.Class = olMail Then
Call OutSomeProperties(ItemCrnt)
End If
Next
End If
End Sub
此宏使用方法 1 选择要处理的电子邮件。也就是说,用户选择一封或多封电子邮件,然后调用此宏来处理它们。我发现这是开发新电子邮件处理宏的最简单方法。我可以选择一封简单的电子邮件并单步执行宏来检查它如何处理电子邮件。然后,我可以逐步选择更复杂的电子邮件,直到宏可以处理任何复杂程度令我满意的电子邮件。
请注意,可以将签名和图像记录为 VBA 的附件,但不能为用户记录。您需要识别哪些附件是您想要保存的,哪些是您不想保存的。
发件人会重复使用姓名吗?如果 John Smith 总是将他的附件命名为“MyHomework.docx”,SaveAsFile 将在没有警告的情况下覆盖以前的作业。如果您不想覆盖以前的作业,则必须以某种方式使文件名唯一。
我建议的方法是:
- 使用宏
DemoContacts 调查ContactItem 的属性。
- 使用宏
InvestigateEmails 和 OutSomeProperties 调查 MailItem 的属性。
- 确定允许您将联系人与电子邮件匹配的属性,并确定您需要从联系人中提取的属性。
- 使用类似
SaveStudentHomework 的名称启动一个新宏。不要使用SaveAttachmentsToDisk 之类的名称。今天你正在保存作业附件。几个月后,您可能会保存不同类型的附件。你会怎么称呼那个宏?如果您为宏命名,则不太可能需要更改这些名称。
新宏的声明应为 Public Sub SaveStudentHomework (ItemCrnt As Outlook.MailItem),这将允许它与规则一起使用或作为事件例程使用。
- 此宏的第一个版本应该从电子邮件中提取要与联系人匹配的属性。遍历联系人并搜索匹配的联系人。使用
Debug.Print 确认成功。
- 您现在有了为
SaveAsFile 构建路径名的信息。如有必要,使用唯一名称保存所需的附件。
- 一旦
SaveStudentHomework 的工作令您满意,请创建规则并使用“运行脚本”链接宏。