2013-08-27 104 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