VBA,MS Outlook,文件夹项目

时间:2015-08-03 11:08:27

标签: vba outlook-2013

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

我对Application.ActiveExplorer.Selection.Item(i_item)的尝试似乎只返回邮件,任务,日历条目或备注,但从不返回文件夹(例如'收件箱\')。 当用户选择电子邮件,然后启动VBA宏时,解决方案Application.ActiveExplorer.Selection.Item(i_item)会提供所需的结果。

但是,如果Outlook用户选择的最后一个项目是文件夹(例如'已发送邮件')。然后VBA makro启动,而宏应该重新启动文件夹项(没有额外的用户交互)。目前情况并非如此。上面的代码仍然提供电子邮件或任务。

如何检查最后一个选项是否在文件夹(不是电子邮件等)上? 如何访问“文件夹”项?

如果不可能,我会切换回Pickfolder(就像Darren Bartrup-Cook提出的那样),但这不是我预先解决的问题。

2 个答案:

答案 0 :(得分:1)

此过程将要求您选择文件夹 如果您中断代码并检查 mFolderSelected MySelectedFolder ,那么您应该能够解决问题:

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)。

答案 1 :(得分:1)

我想获取所选文件夹以更改其图标,因此我们的代码在某种程度上是相同的。 我注意到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

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