2013-08-27 67 views
0

我一直试图删除Outlook中的每个循环复制使用后的附件。它只是删除复制后的第一个附件,但不去第二个附件的工作!它只是下到End Sub。对于每个循环:只删除第一个附件

Private Sub Items_ItemAdd(ByVal item As Object) 

    On Error GoTo ErrorHandler 

    'Only act if it's a MailItem 
    Dim Msg As Outlook.MailItem 
    If TypeName(item) = "MailItem" Then 
     Set Msg = item 

    'Change variables to match need. Comment or delete any part unnecessary. 
     'If (Msg.SenderName = "Name Of Person") And _ 
     '(Msg.Subject = "Subject to Find") And _ 
     '(Msg.Attachments.Count >= 1) Then 

    'Set folder to save in. 
    Dim olDestFldr As Outlook.MAPIFolder 
    Dim myAttachments As Outlook.Attachments 
    Dim olAttch As Outlook.Attachment 
    Dim Att As String 

    'location to save in. Can be root drive or mapped network drive. 
    Const attPath As String = "C:\Users\pkshahbazi\Documents\EmailAttachments\" 
    Set myAttachments = Msg.Attachments 
     For Each olAttch In myAttachments 
      Att = olAttch.DisplayName 
      If Right(olAttch.FileName, 3) = "zip" Then 
      olAttch.SaveAsFile attPath & Att 
      olAttch.Delete 
      End If 
     Next olAttch 
    Msg.UnRead = False 

End If 

ProgramExit: 
    Exit Sub 

ErrorHandler: 
    MsgBox Err.Number & " - " & Err.Description 
    Resume ProgramExit 
End Sub 

我发现OlAttch.delete语句混淆了For Each循环。

任何想法如何删除附件。

回答

1

试试这个。我添加了代码/注释来遍历并在您保存后删除所有附件。你应该这样做的原因可以很好地解释David Zemens的here

您还应该养成保存在Outlook VBA中修改的消息的习惯,因为有时候这很重要,有时候并非如此,但如果您在需要时不使用Save,它可能会让您感到困惑。

'location to save in. Can be root drive or mapped network drive. 
    Const attPath As String = "C:\Users\pkshahbazi\Documents\EmailAttachments\" 
    Set myAttachments = Msg.Attachments 
     For Each olAttch In myAttachments 
      Att = olAttch.DisplayName 
      If Right(olAttch.FileName, 3) = "zip" Then 
      olAttch.SaveAsFile attPath & Att 
      'olAttch.Delete 
      End If 
     Next olAttch 
     'iterate through all attachments, going backwards 
     dim j as integer 
     For j = Msg.Attachments.Count To 1 Step -1 
      Msg.Attachments.Remove (j) 
     Next j 

     'make sure to save your message after this 
     Msg.save 
    Msg.UnRead = False 




End If 
+0

+1击败了我约45秒:) –

+0

非常感谢您的帮助!这对我有效... – user1765608

2

在你前面的问题,我们从一个索引循环改为非索引循环,因为你没有任何.Delete要求。不幸的是,从集合中删除项目需要索引迭代。

这是因为,当你有3项:

  • 项目1 =附件1
  • 项目2 =附件2
  • 项目3 =附件3

然后,当你删除第一个项目(Item 1/Attachment 1),它会将您带到项目2,但是当删除发生时,您将留下类似以下的集合:

  • 项目1 =附件2
  • 项目2 =附件3

所以,你的循环将删除项目1和3,但它永远不会碰的第2项

解决的最简单方法这为你,没有使用索引循环,并重新编写脚本,只是添加另一个循环来执行删除方法。

@Enderland为此提供了示例。我不会重复他的努力,但我确实想解释发生了什么事。从集合中删除项目时总是这样,您必须以相反的顺序逐步收集集合。

+0

很好的解释,+1 – enderland

+0

非常感谢大卫为您的宝贵意见! – user1765608