使用 VBA 查看 Excel 中的 2 个 outlook 根文件夹

Look through 2 outlook root folders in Excel with VBA

我已经使用 VBA 从 Excel 设法访问 Outlook 中 2 个文件夹中的项目,但现在我想在这两个文件夹中搜索电子邮件地址 x@gmail.com我知道如何单独搜索每一个,但只搜索一次,然后对最近的进行排序。我坚持的部分是如何同时查看两个文件夹。

我正在使用 Microsoft Office 2016

显然,这条虚拟线并不能解决问题:Set olJoinedFldr = olCleanUp + olFldr

Private Sub CommandButton2_Click()

Dim olApp As Outlook.Application 'set app
Dim olNs As Object 'get namespace
Dim olFldr As Outlook.Folder 'to be the inbox
Dim olArchive As Outlook.Folder 'the archive folder
Dim olCleanUp As Outlook.Folder ' the archive subfolder we need
Dim olJoinedFldr As Object  'the to be made joined object to filter....
Dim olItems As Object 'filtered items based on search criteria
Dim olItemReply As Object 'the reply mail
Dim i As Long
Dim emailStr As String
Dim filter As String

Set olApp = CreateObject("Outlook.Application")
Set olNs = olApp.GetNamespace("MAPI")
Set olFldr = olNs.GetDefaultFolder(6) ' olFolderInbox

Set olArchive = olNs.Folders(CStr(olNs.Accounts.Item(1))) 'find email of current user
Set olCleanUp = olArchive.Folders("Archive").Folders("Cleanup") ' get the archive sub folder

Set olJoinedFldr = olCleanUp + olFldr

Set emailStr = "somebody@gmail.com"
filter = "[SenderEmailAddress] = """ & emailStr & """"  'this is the email from person x we are searching for in the 2 folders

' from here on it is currently searching just 1 folder
Set olItems = olFldr.Items.Restrict(filter) 'filter the items

olItems.Sort "[ReceivedTime]", True 'sort by date

If olItems.Count > 0 Then
    For i = 1 To olItems.Count
        If olItems(i).Class = 43 Then
            Set olItemReply = olItems(i).ReplyAll
            With olItemReply
                .HTMLBody = "<p Dear someone, <br><br></p>" & .HTMLBody
                .Display
            End With
        
        Exit For
    End If

Next
Else
' have code here to make a brand new email already
End If

Set olApp = Nothing
Set olNs = Nothing
Set olFldr = Nothing
Set olArchive = Nothing
Set olCleanUp = Nothing
Set olJoinedFldr = Nothing
Set olItems = Nothing
Set olItemReply = Nothing
Set i = Nothing
Set emailStr = Nothing
Set filter = Nothing


End Sub

除非使用 Application.AdvancedSearch 创建 Search 对象,否则无法搜索两个(或更多)文件夹。即便如此,它仍然是一个 PITA - 搜索是异步的,您需要使用事件来确定搜索何时完成。

您最好一次搜索一个文件夹,然后在您的代码中合并结果(如有必要)。

您需要使用 Application class 的 AdvancedSearch 方法。在 Outlook 中使用 AdvancedSearch 方法的主要好处是:

  • 搜索在另一个线程中执行。您不需要手动 运行 另一个线程,因为 AdvancedSearch 方法 运行 会自动在后台运行它。
  • 可以在任何位置(即超出某个文件夹的范围)搜索任何项目类型:邮件、约会、日历、便笺等。 RestrictFind/FindNext 方法可以应用于特定的 Items 集合(请参阅 [=19= 的 Items 属性 ] class 在 Outlook 中)。
  • 完全支持 DASL 查询(自定义属性也可用于搜索)。您可以在 MSDN 的 Filtering 文章中阅读更多相关信息。为了提高搜索性能,如果为商店启用了即时搜索,则可以使用即时搜索关键字(请参阅商店 class 的 IsInstantSearchEnabled 属性)。
  • 您可以随时使用 Search class 的 Stop 方法停止搜索过程。

Advanced search in Outlook programmatically: C#, VB.NET 文章中阅读有关此方法的更多信息。