是否可以根据它的名称选择一个文件夹而不是它的路径? VBA - Outlook

时间:2015-05-26 10:12:05

标签: vba outlook directory outlook-vba

最近我正在尝试创建一个选择特定文件夹的功能。

我在一个用户测试了这个并且它可以工作。但问题是我还想在其他用户使用此功能,但不必根据文件夹结构重写该功能。

该功能适用​​于所有文件夹名称(相同名称)。 它由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")

然而,主要帐户/文件夹William不会出现在其他用户身上。我的问题是,如何调整它以便只查找每个用户都相同的#MemoScan文件夹?这甚至可能吗?

如果我退出主William命名空间,则无法找到#MemoScan文件夹。

此特定用户的文件夹结构如下:

enter image description here

1 个答案:

答案 0 :(得分:2)

Namespace类提供Stores属性,该属性返回Stores集合对象,该对象表示当前配置文件中的所有Store对象。 Store类提供GetRootFolder方法,该方法返回表示Store的根级文件夹的Folder对象。您可以使用GetRootFolder方法枚举Store的根文件夹的子文件夹。与包含当前配置文件中所有商店的所有文件夹的NameSpace.Folders不同,Store.GetRootFolder.Folders允许您枚举当前配置文件中给定Store对象的所有文件夹。

 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中当前选定的文件夹运行代码。 Explorer类的CurrentFolder属性返回一个Folder对象,该对象表示资源管理器中显示的当前文件夹。