使用 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
方法 运行 会自动在后台运行它。
- 可以在任何位置(即超出某个文件夹的范围)搜索任何项目类型:邮件、约会、日历、便笺等。
Restrict
和 Find
/FindNext
方法可以应用于特定的 Items
集合(请参阅 [=19= 的 Items
属性 ] class 在 Outlook 中)。
- 完全支持 DASL 查询(自定义属性也可用于搜索)。您可以在 MSDN 的 Filtering 文章中阅读更多相关信息。为了提高搜索性能,如果为商店启用了即时搜索,则可以使用即时搜索关键字(请参阅商店 class 的
IsInstantSearchEnabled
属性)。
- 您可以随时使用
Search
class 的 Stop
方法停止搜索过程。
在 Advanced search in Outlook programmatically: C#, VB.NET 文章中阅读有关此方法的更多信息。
我已经使用 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
方法 运行 会自动在后台运行它。 - 可以在任何位置(即超出某个文件夹的范围)搜索任何项目类型:邮件、约会、日历、便笺等。
Restrict
和Find
/FindNext
方法可以应用于特定的Items
集合(请参阅 [=19= 的Items
属性 ] class 在 Outlook 中)。 - 完全支持 DASL 查询(自定义属性也可用于搜索)。您可以在 MSDN 的 Filtering 文章中阅读更多相关信息。为了提高搜索性能,如果为商店启用了即时搜索,则可以使用即时搜索关键字(请参阅商店 class 的
IsInstantSearchEnabled
属性)。 - 您可以随时使用
Search
class 的Stop
方法停止搜索过程。
在 Advanced search in Outlook programmatically: C#, VB.NET 文章中阅读有关此方法的更多信息。