【问题标题】:VBA, MS Outlook, Folder ItemVBA、MS Outlook、文件夹项
【发布时间】:2015-08-14 16:48:08
【问题描述】:

我想实现一个 VBA 应用程序,它使用选定的对象(电子邮件、任务、文件夹)。

我对@9​​87654321@ 的尝试似乎只返回邮件、任务、日历条目或笔记,但从不返回文件夹(例如“收件箱”)。 当用户选择一封电子邮件,然后启动 VBA 宏时,Application.ActiveExplorer.Selection.Item(i_item) 解决方案会提供所需的结果。

但是,如果 Outlook 用户选择的最后一项是文件夹(例如“已发送邮件”)。然后 VBA makro 启动,比宏应该接收文件夹项(无需额外的用户交互)。目前情况并非如此。上面的代码仍然传递电子邮件或任务。

我如何检查最后一个选择是否在文件夹(不是电子邮件等)上? 如何访问文件夹项?

如果这不可能,我会切换回Pickfolder(就像 Darren Bartrup-Cook 提出的建议),但这不是我喜欢的解决方案。

【问题讨论】:

    标签: vba outlook-2013


    【解决方案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
    

    还没有遇到问题。在您的情况下,您可以将选择存储在全局变量中,因此您始终知道最后选择了哪个文件夹。

    【讨论】:

      【解决方案2】:

      此过程将要求您选择文件夹。
      如果您中断代码并检查 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)。

      【讨论】:

      • 谢谢你,达伦,我可以用这个作为解决方法。我的想法略有不同。我将在上面的编辑中更详细地解释。
      猜你喜欢
      • 2018-11-08
      • 1970-01-01
      • 2016-12-16
      • 2015-01-18
      • 1970-01-01
      • 2013-02-22
      • 1970-01-01
      • 2015-04-23
      • 2017-09-22
      相关资源
      最近更新 更多