是否可以 select 基于名称而不是路径的文件夹? VBA - 展望
Is it possible to select a folder based on it's name rather then on it's path? VBA - Outlook
最近我正在尝试创建一个选择特定文件夹的功能。
我在一个用户身上测试过这个并且它有效。然而,问题是我也想在其他用户身上使用这个功能,但不必根据他们的文件夹结构重写这个功能。
该功能适用于所有文件夹名称(相同名称)。
它由 1 个主文件夹组成:#MemoScan 和 4 个子文件夹。
根据这些文件夹名称,我想统计其中有多少邮件。
我创建了以下函数来执行此操作:
Function HowManyEmails() As Integer
Dim objOutlook As Object, objnSpace As Object, MyCurrentFolder As MAPIFolder
Dim EmailCount As Integer
Set objOutlook = CreateObject("Outlook.Application")
Set objnSpace = objOutlook.GetNamespace("MAPI")
Set MyCurrentFolder = objnSpace.folders("William").folders("#MemoScan")
sFolder = MyCurrentFolder
For Each Folder In MyCurrentFolder.folders
sFolder = Folder
sSubmap = Right(sFolder, Len(sFolder) - 1)
For Each Item In Folder.Items
If TypeName(Item) = "MailItem" Then
EmailCount = EmailCount + 1
End If
Next Item
Next Folder
HowManyEmails = EmailCount
End Function
如您所见,需要检查的文件夹是硬编码的(必须是因为它在关闭 outlook 事件时运行并且未选择任何内容)。
现在的路径是:objnSpace.folders("William").folders("#MemoScan")
然而,主要 account/folder William
不会出现在其他用户那里。我的问题是,我如何调整它以使其只查找每个用户都相同的 #MemoScan
文件夹?这可能吗?
如果我离开主 William
命名空间,它将无法找到 #MemoScan
文件夹。
该特定用户的文件夹结构如下:
命名空间 class 提供了 Stores property which returns a Stores collection object that represents all the Store objects in the current profile. The Store class provides the GetRootFolder 方法,其中 returns 一个文件夹对象表示商店的根级文件夹。您可以使用 GetRootFolder 方法枚举 Store 根文件夹的子文件夹。与包含当前配置文件中所有商店的所有文件夹的 NameSpace.Folders 不同,Store.GetRootFolder.Folders 允许您枚举当前配置文件中给定商店对象的所有文件夹。
Sub EnumerateFoldersInStores()
Dim colStores As Outlook.Stores
Dim oStore As Outlook.Store
Dim oRoot As Outlook.Folder
On Error Resume Next
Set colStores = Application.Session.Stores
For Each oStore In colStores
Set oRoot = oStore.GetRootFolder
Debug.Print (oRoot.FolderPath)
EnumerateFolders oRoot
Next
End Sub
Private Sub EnumerateFolders(ByVal oFolder As Outlook.Folder)
Dim folders As Outlook.folders
Dim Folder As Outlook.Folder
Dim foldercount As Integer
On Error Resume Next
Set folders = oFolder.folders
foldercount = folders.Count
'Check if there are any folders below oFolder
If foldercount Then
For Each Folder In folders
Debug.Print (Folder.FolderPath)
EnumerateFolders Folder
Next
End If
End Sub
您还可以 运行 针对 Outlook 中当前选定文件夹的代码。 CurrentFolder 属性 Explorer class returns Folder 对象,代表当前显示在资源管理器中的文件夹。
最近我正在尝试创建一个选择特定文件夹的功能。
我在一个用户身上测试过这个并且它有效。然而,问题是我也想在其他用户身上使用这个功能,但不必根据他们的文件夹结构重写这个功能。
该功能适用于所有文件夹名称(相同名称)。 它由 1 个主文件夹组成:#MemoScan 和 4 个子文件夹。
根据这些文件夹名称,我想统计其中有多少邮件。
我创建了以下函数来执行此操作:
Function HowManyEmails() As Integer
Dim objOutlook As Object, objnSpace As Object, MyCurrentFolder As MAPIFolder
Dim EmailCount As Integer
Set objOutlook = CreateObject("Outlook.Application")
Set objnSpace = objOutlook.GetNamespace("MAPI")
Set MyCurrentFolder = objnSpace.folders("William").folders("#MemoScan")
sFolder = MyCurrentFolder
For Each Folder In MyCurrentFolder.folders
sFolder = Folder
sSubmap = Right(sFolder, Len(sFolder) - 1)
For Each Item In Folder.Items
If TypeName(Item) = "MailItem" Then
EmailCount = EmailCount + 1
End If
Next Item
Next Folder
HowManyEmails = EmailCount
End Function
如您所见,需要检查的文件夹是硬编码的(必须是因为它在关闭 outlook 事件时运行并且未选择任何内容)。
现在的路径是:objnSpace.folders("William").folders("#MemoScan")
然而,主要 account/folder William
不会出现在其他用户那里。我的问题是,我如何调整它以使其只查找每个用户都相同的 #MemoScan
文件夹?这可能吗?
如果我离开主 William
命名空间,它将无法找到 #MemoScan
文件夹。
该特定用户的文件夹结构如下:
命名空间 class 提供了 Stores property which returns a Stores collection object that represents all the Store objects in the current profile. The Store class provides the GetRootFolder 方法,其中 returns 一个文件夹对象表示商店的根级文件夹。您可以使用 GetRootFolder 方法枚举 Store 根文件夹的子文件夹。与包含当前配置文件中所有商店的所有文件夹的 NameSpace.Folders 不同,Store.GetRootFolder.Folders 允许您枚举当前配置文件中给定商店对象的所有文件夹。
Sub EnumerateFoldersInStores()
Dim colStores As Outlook.Stores
Dim oStore As Outlook.Store
Dim oRoot As Outlook.Folder
On Error Resume Next
Set colStores = Application.Session.Stores
For Each oStore In colStores
Set oRoot = oStore.GetRootFolder
Debug.Print (oRoot.FolderPath)
EnumerateFolders oRoot
Next
End Sub
Private Sub EnumerateFolders(ByVal oFolder As Outlook.Folder)
Dim folders As Outlook.folders
Dim Folder As Outlook.Folder
Dim foldercount As Integer
On Error Resume Next
Set folders = oFolder.folders
foldercount = folders.Count
'Check if there are any folders below oFolder
If foldercount Then
For Each Folder In folders
Debug.Print (Folder.FolderPath)
EnumerateFolders Folder
Next
End If
End Sub
您还可以 运行 针对 Outlook 中当前选定文件夹的代码。 CurrentFolder 属性 Explorer class returns Folder 对象,代表当前显示在资源管理器中的文件夹。