BerndGit
BerndGit

Reputation: 1660

VBA, MS Outlook, Folder Item

I want to implement an VBA application, which uses the selected object (E-mail, task, folder).

My try with Application.ActiveExplorer.Selection.Item(i_item) seems to return only mails, tasks, calender entries or notes but never an folder (e.g. 'Inbox\'). When the user selects an e-mail, and then starts the VBA macro, the solution Application.ActiveExplorer.Selection.Item(i_item) delivers the desired results.

However, if the last item picked by the Outlook user was an folder (e.g. 'Sent Mails'). And the VBA makro started afterward, than the macro should recive the Folder Item (without additional user interaction). This is currently not the case. The code above still delivers the e-mail, or task.

How do I check, if the last selection was on an folder (not an e-mail, etc)? How do I access the Folder item?

If this is not possible I will switch back to Pickfolder (like proposd by Darren Bartrup-Cook) but this is not me prefred solution.

Upvotes: 0

Views: 987

Answers (2)

Stefan
Stefan

Reputation: 382

I want to get the selected folder in order to change its icon, so our code is somehow the same. I noticed that Application.ActiveExplorer.Selection.Item(i_item) it is not perfect, since it throws an exception for empty folders or on calendar etc. So I use Application.ActiveExplorer.CurrentFolder.DefaultMessageClass (Application.ActiveExplorer.NavigationPane.CurrentModule.Name or Application.ActiveExplorer.NavigationPane.CurrentModule.NavigationModuleType) in order to figure out where I actually am.

By that approach it is easy to get current selected folder

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

haven't got an problem with it yet. In your case, you can store the selection in a global variable, so you always know which folder was selected last.

Upvotes: 1

Darren Bartrup-Cook
Darren Bartrup-Cook

Reputation: 19712

This procedure will ask you to select the folder.
If you interrupt the code and examine the mFolderSelected or MySelectedFolder then you should be able to work something out:

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

NB: This was written to be used in Excel and has late binding - you'll need to update it to work in Outlook (no need to reference Outlook for a start).

Upvotes: 1

Related Questions