【问题标题】:Is it possible to select a folder based on it's name rather then on it's path? VBA - Outlook是否可以根据名称而不是路径选择文件夹? VBA - 展望
【发布时间】:2015-08-07 22:50:40
【问题描述】:

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

我在一位用户身上进行了测试,它可以工作。然而,问题是我也想在其他用户处使用此功能,但不必根据他们的文件夹结构重写该功能。

该功能适用​​于几个文件夹名称,它们都有(相同的名称)。 它包含 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 文件夹。

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

【问题讨论】:

标签: vba outlook directory


【解决方案1】:

Namespace 类提供Stores 属性,该属性返回代表当前配置文件中所有Store 对象的Stores 集合对象。 Store 类提供了GetRootFolder 方法,该方法返回一个表示Store 根级文件夹的Folder 对象。您可以使用 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 中当前选定的文件夹运行代码。 Explorer 类的CurrentFolder 属性返回一个Folder 对象,该对象表示资源管理器中显示的当前文件夹。

【讨论】:

    猜你喜欢
    • 2016-09-30
    • 2017-01-27
    • 2017-04-20
    • 2021-10-15
    • 2021-02-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-28
    相关资源
    最近更新 更多