VBA,MS Outlook,文件夹项目

VBA, MS Outlook, Folder Item

我想实现一个 VBA 应用程序,它使用选定的对象(电子邮件、任务、文件夹)。

我对 Application.ActiveExplorer.Selection.Item(i_item) 的尝试似乎 return 只有邮件、任务、日历条目或便笺,而不是文件夹(例如 'Inbox\')。 当用户选择一封电子邮件,然后启动 VBA 宏时,解决方案 Application.ActiveExplorer.Selection.Item(i_item) 会提供所需的结果。

但是,如果 Outlook 用户选择的最后一项是文件夹(例如 'Sent Mails')。然后 VBA makro 开始,宏应该接收文件夹项(无需额外的用户交互)。目前情况并非如此。上面的代码仍然发送​​电子邮件或任务。

如果上次选择是在文件夹(而不是电子邮件等)上,我该如何检查? 如何访问文件夹项目?

如果这不可能,我将切换回 Pickfolder(如 Darren Bartrup-Cook 的提议)但这不是我首选的解决方案。

此程序会要求您 select 文件夹。
如果你中断代码并检查 mFolderSelectedMySelectedFolder 那么你应该能够解决问题:

Public Sub Test()

    Dim MySelectedFolder As Variant
    Set MySelectedFolder = PickFolder

End Sub

Public Function PickFolder() As Object

    Dim oOutlook As Object          'Outlook.Application
    Dim nNameSpace As Object        'Outlook.Namespace
    Dim mFolderSelected As Object   'Outlook.MAPIFolder

    On Error GoTo ERROR_HANDLER

    Set oOutlook = CreateObject("Outlook.Application")
    Set nNameSpace = oOutlook.GetNameSpace("MAPI")

    Set mFolderSelected = nNameSpace.PickFolder

    '''''''''''''''''''''''''''''''''''''''''''''''''''''''''
    'The commented out code will return only email folders. '
    '''''''''''''''''''''''''''''''''''''''''''''''''''''''''
    If Not mFolderSelected Is Nothing Then
'        If mFolderSelected.DefaultItemType = 0 Then
            Set PickFolder = mFolderSelected
'        Else
'            Set PickFolder = Nothing
'        End If
    Else
        Set PickFolder = Nothing
    End If

    Set nNameSpace = Nothing
    Set oOutlook = Nothing

    On Error GoTo 0
    Exit Function

ERROR_HANDLER:
    Select Case Err.Number

        Case Else
            MsgBox "Error " & Err.Number & vbCr & _
                " (" & Err.Description & ") in procedure PickFolder."
            Err.Clear
    End Select

End Function

注意:这是为在 Excel 中使用而编写的,具有后期绑定 - 您需要更新它才能在 Outlook 中使用(开始时无需参考 Outlook)。

我想获取选定的文件夹以更改其图标,所以我们的代码在某种程度上是相同的。 我注意到 Application.ActiveExplorer.Selection.Item(i_item) 它并不完美,因为它会为空文件夹或日历等抛出异常。 所以我使用 Application.ActiveExplorer.CurrentFolder.DefaultMessageClassApplication.ActiveExplorer.NavigationPane.CurrentModule.NameApplication.ActiveExplorer.NavigationPane.CurrentModule.NavigationModuleType)来确定我实际所在的位置。

通过这种方法很容易得到当前选择的文件夹

Dim folder As Outlook.MAPIFolder
Dim folderPath As String, currItemType As String
Dim i As Integer

currItemType = Application.ActiveExplorer.CurrentFolder.DefaultMessageClass
If currItemType = "IPM.Note" Then  'mail Item types    https://msdn.microsoft.com/en-us/library/office/ff861573.aspx
    Set folder = Application.ActiveExplorer.CurrentFolder
    folderPath = folder.Name
    Do Until folder.Parent = "Mapi"
      Set folder = folder.Parent
      folderPath = folder.Name & "\" & folderPath
    Loop
Debug.Print folderPath
End If

还没有遇到问题。在您的情况下,您可以将选择存储在全局变量中,因此您始终知道最后选择了哪个文件夹。