2015-08-03 7 views
0

Je souhaite implémenter une application VBA qui utilise l'objet sélectionné (E-mail, tâche, dossier).VBA, MS Outlook, Dossier Poste

Mon essai avec Application.ActiveExplorer.Selection.Item(i_item) semble retourner uniquement les mails, les tâches, les entrées de calendrier ou les notes mais jamais un dossier (par exemple 'Inbox'). Lorsque l'utilisateur sélectionne un e-mail, puis démarre la macro VBA, la solution Application.ActiveExplorer.Selection.Item(i_item) fournit les résultats souhaités.

Toutefois, si le dernier élément sélectionné par l'utilisateur Outlook était un dossier (par exemple, 'Mails envoyés'). Et le VBA makro a commencé par la suite, que la macro devrait recevoir l'élément de dossier (sans interaction supplémentaire de l'utilisateur). Ce n'est actuellement pas le cas. Le code ci-dessus délivre toujours l'e-mail, ou une tâche.

Comment vérifier si la dernière sélection était sur un dossier (pas un e-mail, etc.)? Comment accéder à l'élément Dossier?

Si ce n'est pas possible je vais revenir à Pickfolder (comme proposé par Darren Bartrup-Cook) mais ce n'est pas moi solution prefred.

Répondre

1

Je veux obtenir le dossier sélectionné afin de changer son icône, donc notre code est en quelque sorte identique. J'ai noté que Application.ActiveExplorer.Selection.Item(i_item) il n'est pas parfait, puisqu'il lance une exception pour les dossiers vides ou sur le calendrier etc. Donc j'utilise Application.ActiveExplorer.CurrentFolder.DefaultMessageClass (Application.ActiveExplorer.NavigationPane.CurrentModule.Name ou Application.ActiveExplorer.NavigationPane.CurrentModule.NavigationModuleType) afin de comprendre où je suis réellement.

Par cette approche, il est facile d'obtenir n'ont pas eu un problème avec encore en cours dossier sélectionné

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 

. Dans votre cas, vous pouvez stocker la sélection dans une variable globale, ainsi vous savez toujours quel dossier a été sélectionné en dernier.

+0

Cool. Fonctionne bien. Merci. – BerndGit

1

Cette procédure vous demandera de sélectionner le dossier.
Si vous interrompez le code et examinez le mFolderSelected ou MySelectedFolder alors vous devriez être en mesure de travailler quelque chose:

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: Ceci a été écrit pour être utilisé dans Excel et a la liaison tardive - vous Je vais devoir le mettre à jour pour fonctionner dans Outlook (pas besoin de référencer Outlook pour commencer).

+0

Merci Darren, je pourrais utiliser cela comme solution de contournement. Mon idée était légèrement différente. Je vais expliquer plus en détail dans l'EDIT ci-dessus. – BerndGit