在 Outlook 电子邮件中删除具有已知命名约定的附件

Deleting an attachment, with known naming convention, in an Outlook email

在 Microsoft Outlook 365 (V1912) 中,我试图从一组文件中删除单个附件,这些文件已从 VBA 脚本附加到指定目录中的所有 .PDF 文件。

当我尝试 运行 我的脚本时,出现了一个错误,我知道这是由于 specifying/using 语法不正确造成的。

Invalid procedure call or argument

我研究并尝试了各种修复方法,但我能找到的信息要么是关于 Excel 的,要么是关于如何从电子邮件中删除所有附件的建议。

Dim JobLocation As String

ClientDirectory = "C:\ClientDirectory\" & JobLocation & "\Files\"
RequiredPDFs = Dir(ClientDirectory & "*.pdf")
Do While Len(RequiredPDFs) > 0
    .Attachments.Add ClientDirectory & RequiredPDFs
    RequiredPDFs = Dir
Loop

For i = 0 To (.Attachments.Count - 1)
    If InStr(1, .Attachments, JobLocation & "_SM ") Then
        .Attachments.Remove 1
    End If
Next i

前半部分代码循环遍历目录中的所有文件并附加它们。

有一个文件的命名约定为 JobLocation_SM 1234,如果该文件存在于目录中,我想在附加所有其他文件后不附加或删除它。

试试这个:

Dim att

For Each att in .Attachments
    If InStr(1, att.FileName, JobLocation & "_SM ") > 0 Then
        att.Delete
        Exit For
    End If
Next 

首先,您在调用 Attachments.Remove 时硬编码索引 1 而不是 i。

其次,Outlook中的所有集合都是基于1的,而不是0。

第三,如果有多个匹配项,则循环将不起作用,因为您正在修改(通过删除)正在循环的集合。使用向下循环:

For i = .Attachments.Count to 1 step -1

第四,添加附件后为什么要删除?一开始就避免添加它们不是更容易吗?

第五,您没有在循环中访问附件对象;

For i = .Attachments.Count to 1 step -1
   set attach = .Attachments.Item(i)
   If InStr(1, attach.FileName, JobLocation & "_SM ") Then
     attach.Delete
   End If
Next i