我想实现一个VBA应用程序,它使用所选对象(电子邮件,任务,文件夹)。
我对Application.ActiveExplorer.Selection.Item(i_item)
的尝试似乎只返回邮件,任务,日历条目或备注,但从不返回文件夹(例如'收件箱\')。
当用户选择电子邮件,然后启动VBA宏时,解决方案Application.ActiveExplorer.Selection.Item(i_item)
会提供所需的结果。
但是,如果Outlook用户选择的最后一个项目是文件夹(例如'已发送邮件')。然后VBA makro启动,而宏应该重新启动文件夹项(没有额外的用户交互)。目前情况并非如此。上面的代码仍然提供电子邮件或任务。
如何检查最后一个选项是否在文件夹(不是电子邮件等)上? 如何访问“文件夹”项?
如果不可能,我会切换回Pickfolder
(就像Darren Bartrup-Cook提出的那样),但这不是我预先解决的问题。
答案 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.DefaultMessageClass
(Application.ActiveExplorer.NavigationPane.CurrentModule.Name
或Application.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
尚未遇到问题。在您的情况下,您可以将选择存储在全局变量中,以便始终知道最后选择了哪个文件夹。