2

该代码从 Excel 中的“A”列中读取行,在 Outlook 中查找它们并将附件下载到范围(“E3”)中的文件夹,该文件夹会根据计算机而变化。

但是,在我的电脑上它运行良好,在我同事的电脑上它不下载文件。

Sub Descarga()
    Dim it, at      As Variant, t As Long
    Dim olApp       As Outlook.Application
    Dim olNS        As Outlook.Namespace
    Dim olFolder    As Outlook.MAPIFolder
    Dim olItem      As Object
    Dim mailitem    As Outlook.mailitem
    Dim olAtt       As Outlook.Attachment
    
    Set olApp = New Outlook.Application
    Set olNS = olApp.GetNamespace("MAPI")
    Set olFolder = olNS.GetDefaultFolder(olFolderInbox)

    For Each it In CreateObject("outlook.application").GetNamespace("MAPI").GetDefaultFolder(6).Items
        For t = 1 To Range("A" & Rows.Count).End(xlUp).Row
            If InStr(it.Subject, Cells(t, 1)) Then
                For Each at In it.Attachments
                    at.SaveAsFile (Range("E3")) & "\" & at.DisplayName        'Range("E3") is the path
                Next
            End If
        Next
    Next

End Sub
4

2 回答 2

0

首先,不需要为Application文件夹中的每个项目创建一个新的 Outlook 类(即使没有创建新实例,为了方便和干净的代码,打破长长的属性和方法调用链也是有意义的) :

For Each it In CreateObject("outlook.application").GetNamespace("MAPI").GetDefaultFolder(6).Items

相反,使用Find/FindNextRestrict方法来查找与您的主题行的条件相对应的项目。在以下文章中阅读有关它们的更多信息:

如果您需要处理来自不同文件夹的项目,您也可以考虑使用类的AdvancedSearch方法Application。在 Outlook中的高级搜索中以编程方式阅读有关此方法的更多信息:C#、VB.NET文章。AdvancedSearch在 Outlook 中使用该方法的主要好处是:

  • 搜索在另一个线程中执行。您不需要手动运行另一个线程,因为该AdvancedSearch方法会在后台自动运行它。
  • 可以在任何位置(即超出某个文件夹的范围)搜索任何项目类型:邮件、约会、日历、便笺等。和Restrict/方法可以应用于特定的集合(参见 Outlook 中类的Find属性)。FindNextItemsItemsFolder
  • 完全支持 DASL 查询(自定义属性也可用于搜索)。您可以在 MSDN中的过滤文章中阅读有关此内容的更多信息。为了提高搜索性能,如果为商店启用了即时搜索,则可以使用即时搜索关键字(请参阅类的IsInstantSearchEnabled属性Store)。
  • Stop您可以使用类的方法随时停止搜索过程Search

最后,我建议确保传递给该SaveAsFile方法的文件路径有效并且不包含禁止符号:

at.SaveAsFile (Range("E3")) & "\" & at.DisplayName    'Range("E3") is the path
于 2022-02-23T14:28:12.627 回答
0

首先,不要使用at.DisplayName-use at.FileName

其次,保存前检查附件类型——OOM不会让你保存附件,例如嵌入的OLE对象,你需要先检查附件类型。

For Each at In it.Attachments
  if at.Type = 1 Then 'olByValue
    at.SaveAsFile (Range("E3")) & "\" & at.FileName 'Range("E3") is the path
  End If
Next
于 2022-02-23T14:35:21.053 回答