2015-08-03 96 views
0

我想實現一個VBA應用程序,它使用選定的對象(電子郵件,任務,文件夾)。VBA,MS Outlook,文件夾項目

我的Application.ActiveExplorer.Selection.Item(i_item)嘗試似乎只返回郵件,任務,日曆條目或筆記,但從來沒有一個文件夾(例如'收件箱\')。 當用戶選擇一封電子郵件,然後啓動VBA宏時,解決方案Application.ActiveExplorer.Selection.Item(i_item)可提供所需的結果。

但是,如果Outlook用戶選擇的最後一個項目是一個文件夾(例如「發送郵件」)。然後VBA makro開始,比宏應該收回文件夾項目(沒有額外的用戶交互)。目前情況並非如此。上面的代碼仍然提供電子郵件或任務。

如何檢查,如果最後一個選擇是在一個文件夾(而不是電子郵件等)? 如何訪問文件夾項目?

如果這是不可能的,我會切換回Pickfolder(就像Darren Bartrup-Cook提議的那樣),但這不是我預先解決的問題。

回答

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 

沒有得到一個問題呢。就你而言,你可以將選擇存儲在一個全局變量中,這樣你總能知道最後選擇了哪個文件夾。

+0

很酷。工作正常。謝謝。 – BerndGit

1

此過程將要求您選擇文件夾。
如果中斷代碼並檢查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開始)。

+0

謝謝Darren,我可以用它作爲解決方法。我的想法稍有不同。我會在上面的編輯中更詳細地解釋。 – BerndGit