VBA,MS Outlook,文件夹项目
VBA, MS Outlook, Folder Item
我想实现一个 VBA 应用程序,它使用选定的对象(电子邮件、任务、文件夹)。
我对 Application.ActiveExplorer.Selection.Item(i_item)
的尝试似乎 return 只有邮件、任务、日历条目或便笺,而不是文件夹(例如 'Inbox\')。
当用户选择一封电子邮件,然后启动 VBA 宏时,解决方案 Application.ActiveExplorer.Selection.Item(i_item)
会提供所需的结果。
但是,如果 Outlook 用户选择的最后一项是文件夹(例如 'Sent Mails')。然后 VBA makro 开始,宏应该接收文件夹项(无需额外的用户交互)。目前情况并非如此。上面的代码仍然发送电子邮件或任务。
如果上次选择是在文件夹(而不是电子邮件等)上,我该如何检查?
如何访问文件夹项目?
如果这不可能,我将切换回 Pickfolder
(如 Darren Bartrup-Cook 的提议)但这不是我首选的解决方案。
此程序会要求您 select 文件夹。
如果你中断代码并检查 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)。
我想获取选定的文件夹以更改其图标,所以我们的代码在某种程度上是相同的。
我注意到 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
还没有遇到问题。在您的情况下,您可以将选择存储在全局变量中,因此您始终知道最后选择了哪个文件夹。
我想实现一个 VBA 应用程序,它使用选定的对象(电子邮件、任务、文件夹)。
我对 Application.ActiveExplorer.Selection.Item(i_item)
的尝试似乎 return 只有邮件、任务、日历条目或便笺,而不是文件夹(例如 'Inbox\')。
当用户选择一封电子邮件,然后启动 VBA 宏时,解决方案 Application.ActiveExplorer.Selection.Item(i_item)
会提供所需的结果。
但是,如果 Outlook 用户选择的最后一项是文件夹(例如 'Sent Mails')。然后 VBA makro 开始,宏应该接收文件夹项(无需额外的用户交互)。目前情况并非如此。上面的代码仍然发送电子邮件或任务。
如果上次选择是在文件夹(而不是电子邮件等)上,我该如何检查? 如何访问文件夹项目?
如果这不可能,我将切换回 Pickfolder
(如 Darren Bartrup-Cook 的提议)但这不是我首选的解决方案。
此程序会要求您 select 文件夹。
如果你中断代码并检查 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)。
我想获取选定的文件夹以更改其图标,所以我们的代码在某种程度上是相同的。
我注意到 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
还没有遇到问题。在您的情况下,您可以将选择存储在全局变量中,因此您始终知道最后选择了哪个文件夹。