Outlook VBA:如何检查所有循环元素是否满足一个条件

时间:2019-07-25 13:56:16

标签: vba outlook outlook-vba

我为我的组织在VBA中为Outlook编写了一个简单的脚本。可以检查电子邮件的附件并根据附件移动电子邮件。该脚本是规则的一部分,该规则检查所有到达收件箱的电子邮件。

如果邮件没有附件,或者附件是不同于.pdf的文件(.zip,.jpg或其他文件),它将进入错误文件夹。如果电子邮件中附加了.pdf文件,则它将保留在“收件箱”中。

一切正常,除了一种情况。例如,如果邮件有两个附件-一个.pdf文件和一个.zip文件,则它无法正常工作。如果.zip文件是第一个附件,则邮件将转到Error文件夹(应正确)。但是,如果邮件的首个附件为.pdf文件,则该邮件会保留在“收件箱”中(但也应转到“错误”文件夹!)。

我试图修改循环,如果,但是代码是如此简单,我实际上无法提出解决方案-结果总是一样的。我尝试使用“ Continue For”或“ Continue Loop”之类的东西,但我想这不是好方法。我对VBA也很陌生。

Sub PDF(Item As Outlook.MailItem)
    Dim myAtt As Outlook.Attachment
    For Each myAtt In Item.Attachments
        If Not Right(LCase(myAtt.FileName), 4) = ".pdf" Then
            Item.Move Session.GetDefaultFolder(olFolderInbox).Parent.Folders("Error")
            End If
        Exit For
    Next
    Set myAtt = Nothing
End Sub

我希望带有至少与.pdf附件至少具有一个附件的电子邮件将发送到文件夹Error。只有带有.pdf附件的电子邮件才应保留在收件箱中。

是否有一种方法可以检查所有循环项(在本例中为附件),如果其中至少有一个不是.pdf,则可以移动邮件?我不明白为什么它只检查第一个附件。

解决方案

Sub PDF2(Item As Outlook.MailItem)
    Dim myAtt As Outlook.Attachment
    Dim allPdf As Boolean
    allPdf = True

    For Each myAtt In Item.Attachments
        Debug.Print myAtt.DisplayName
        If Right(LCase(myAtt.FileName), 4) <> ".pdf" Then
              allPdf = False
              Exit For
        End If
    Next

    If allPdf = False Or Item.Attachments.Count = 0 Then
        Item.Move Session.GetDefaultFolder(olFolderInbox).Parent.Folders("Error")
    End If

    Set myAtt = Nothing
End Sub

这并不完美,但可以。仍然必须在隐藏的附件和普通附件之间添加识别,但是此脚本还将没有任何附件的邮件移动到Error文件夹。感谢@Mikku的帮助:)

3 个答案:

答案 0 :(得分:1)

您退出的路线错误

尝试:

Sub PDF(Item As Outlook.MailItem)
    Dim myAtt As Outlook.Attachment
    For Each myAtt In Item.Attachments
        If Not Right(LCase(myAtt.FileName), 4) = ".pdf" Then
               Item.Move Session.GetDefaultFolder(olFolderInbox).Parent.Folders("Error")
               Exit For
        End If

    Next
    Set myAtt = Nothing
End Sub

新编辑的代码:

Sub PDF(Item As Outlook.MailItem)
    Dim myAtt As Outlook.Attachment
    For Each myAtt In Item.Attachments
        Debug.Print myAtt.DisplayName
        If Not Right(LCase(myAtt.FileName), 4) = ".pdf" And Not Left(LCase(myAtt.FileName), 4) = "imag" Then
              Item.Move Session.GetDefaultFolder(olFolderInbox).Parent.Folders("Error")
              Exit For
        End If

    Next
    Set myAtt = Nothing
End Sub

看到这个不是完美的,但是会让你理解我的意思。通常图像是由imag开始的,因此我们也会跳过这些文件。

答案 1 :(得分:0)

Exit For只是一行而已。

它可能看起来应该像

   If Not Right(LCase(myAtt.FileName), 4) = ".pdf" Then
       Item.Move Session.GetDefaultFolder(olFolderInbox).Parent.Folders("Error")
       Exit For
   End If

答案 2 :(得分:0)

  

如果.zip文件是第一个附件,则邮件将转到Error文件夹(应正确)。

基本上,您不需要检查附件,似乎您只对第一项感兴趣。无论如何,代码会检查每个附件:

Sub PDF(Item As Outlook.MailItem)
    Dim myAtt As Outlook.Attachment
    For Each myAtt In Item.Attachments        
        If Not Right(LCase(myAtt.FileName), 4) = ".pdf" Then
            Item.Move Session.GetDefaultFolder(olFolderInbox).Parent.Folders("Error")
            Return 
        End If 
    Next
    Set myAtt = Nothing
End Sub
相关问题