【问题标题】:Select folder on specific email with vba使用 vba 选择特定电子邮件上的文件夹
【发布时间】:2021-10-10 07:39:18
【问题描述】:

我在 Outlook 中配置了几封电子邮件,我希望能够从其中一封电子邮件中选择一个特定文件夹。

目前代码从主账户的收件箱中读取正确,可以做我需要的吗?

Set outNs = outApp.GetNamespace("MAPI")

Set outFolder = outNs.GetDefaultFolder(olFolderInbox)

 

If Not outFolder Is Nothing Then

    For Each outItem In outFolder.Items

        If outItem.Class = Outlook.OlObjectClass.olMail Then

            Set outMailItem = outItem

                If InStr(1, outMailItem.Subject, subjectFilter) > 0 Then 'removed the quotes around subjectFilter

                    For Each outAttachment In outMailItem.Attachments

                    If Dir(saveFolder, vbDirectory) = "" Then FSO.CreateFolder (saveFolder)

                        outAttachment.SaveAsFile saveFolder & " - " & outAttachment.fileName

                    Set outAttachment = Nothing

                    Next

                End If

        End If

    Next

End If

我尝试了以下代码,但收到以下消息:

对象不支持该属性或方法

For Each objStore In Application.Session.Stores
If objStore = "++++++@o+++++.com" Then

    Set outNs = outApp.GetNamespace("MAPI")
    Set outFolder = outNs.GetDefaultFolder(olFolderInbox)

    If Not outFolder Is Nothing Then
        For Each outItem In outFolder.Items
            If outItem.Class = Outlook.OlObjectClass.olMail Then
                Set outMailItem = outItem
                    If InStr(1, outMailItem.Subject, subjectFilter) > 0 Then 'removed the quotes around subjectFilter
                        For Each outAttachment In outMailItem.Attachments
                        If Dir(saveFolder, vbDirectory) = "" Then FSO.CreateFolder (saveFolder)
                            outAttachment.SaveAsFile saveFolder & outAttachment.Filename
                        Set outAttachment = Nothing
                        Next
                    End If
            End If
        Next
    End If
End If
Next

最后代码如下并且可以正常工作:

Set outNs = outApp.GetNamespace("MAPI")
Set outFolder = outNs.Folders("+++++++++++@+++++.com").Folders("Inbox") 'GetDefaultFolder(olFolderInbox)

If Not outFolder Is Nothing Then
   For Each outItem In outFolder.Items
     If outItem.Class = Outlook.OlObjectClass.olMail Then
       Set outMailItem = outItem
         If InStr(1, outMailItem.Subject, subjectFilter) > 0 Then 'removed the quotes around subjectFilter
           For Each outAttachment In outMailItem.Attachments
             If Dir(saveFolder, vbDirectory) = "" Then FSO.CreateFolder (saveFolder)
              outAttachment.SaveAsFile saveFolder & outAttachment.Filename
              Set outAttachment = Nothing
             Next
           End If
     End If
   Next
End If

【问题讨论】:

  • 您的意思是要访问其他Account 的收件箱吗?如果是这样,那么您是否尝试过在outNS 中循环Accounts 属性?找到帐户后,您可以使用account.DeliveryStore.GetDefaultFolder(6) 获取收件箱
  • 我正在尝试选择 Outlook 中配置的帐户的文件夹或收件箱。
  • @RaymondWu 我刚刚尝试修改代码但它不起作用。
  • 循环 outNS.Accounts 然后检查每个 AccountUserNameDisplayName 属性,无论您可以使用哪个属性来识别。 docs.microsoft.com/en-us/office/vba/api/…
  • 这能回答你的问题吗? Get reference to additional Inbox

标签: vba email outlook directory subdirectory


【解决方案1】:

首先,我注意到您遍历文件夹中的所有项目,这并不是一个好主意。相反,您需要使用 Items 类的 Find/FindNext 或 Restrict 方法来获取与您的条件相对应的项目。在以下文章中阅读有关这些方法的更多信息:

您还可以将两个条件组合成一个条件。要查找带有附件的项目,您可以使用以下搜索条件:

query ="@SQL=" & chr(34) & "urn:schemas:httpmail:hasattachment" & chr(34) & "=1"

要遍历配置文件中的所有商店,您可以使用Stores 属性,该属性返回代表当前配置文件中所有Store 对象的Stores 集合对象。 Store.DisplayName 属性返回一个字符串,表示Store 对象的显示名称。例如:

Sub EnumerateFoldersInStores() 
 Dim colStores As Outlook.Stores
 Dim oStore As Outlook.Store 
 Dim oRoot As Outlook.Folder 
 
 On Error Resume Next 
 Set colStores = Application.Session.Stores
 For Each oStore In colStores 
   Set oRoot = oStore.GetRootFolder 
   Debug.Print (oRoot.FolderPath) 
   EnumerateFolders oRoot 
 Next 
End Sub 
 
Private Sub EnumerateFolders(ByVal oFolder As Outlook.Folder) 
 Dim folders As Outlook.folders 
 Dim Folder As Outlook.Folder 
 Dim foldercount As Integer 
 
 On Error Resume Next 
 
 Set folders = oFolder.folders 
 foldercount = folders.Count 
 'Check if there are any folders below oFolder 
 If foldercount Then 
   For Each Folder In folders 
     Debug.Print (Folder.FolderPath) 
     EnumerateFolders Folder 
   Next 
 End If 
End Sub

【讨论】:

  • Good @Eugene,非常感谢您的时间和回答,我将进行调查以尝试更多地调试代码,我不是编程专家,更不是 VBA,这就是为什么我像疯了一样扔代码。
猜你喜欢
  • 2014-11-18
  • 2016-08-03
  • 2017-09-23
  • 2018-11-08
  • 1970-01-01
  • 2019-12-24
  • 2019-05-20
  • 2022-07-28
  • 1970-01-01
相关资源
最近更新 更多