2017-01-06 1 views
4

J'écris une macro qui devrait supprimer les pièces jointes. De mes sessions de débogage, il semble que cela devrait fonctionner. Le point de rupture est atteint et il reconnaît l'objet du message:VBA - Outlook ne supprime pas les pièces jointes

enter image description here

Je sais que cela semble un peu stupide, mais, assez curieusement, il semble fonctionner si je mets un point d'arrêt, et ouvre l'expression/montre, mais pas autrement.

J'ai lutté avec cela pendant un certain temps; J'apprécierais toute orientation.

Private Sub Application_NewMailEx(ByVal EntryIDCollection As String) 

Dim header As String 
Dim objNewMail As Outlook.MailItem 
Dim Item As Object 
Dim count As Integer 


    Dim objInbox As Outlook.Folder 
    Set objInbox = Outlook.Session.GetDefaultFolder(olFolderInbox) 

    Dim entryIDs 
    entryIDs = Split(EntryIDCollection, ",") 
    Dim i As Integer 

    For i = 0 To UBound(entryIDs) 
     Set objNewMail = Application.Session.GetItemFromID(entryIDs(i)) 
       If objNewMail.Attachments.count > 0 Then 
        header = GetHeader(objNewMail) 
       If DoesIPMatch(header) <> True Then 
        DeleteMessage (objNewMail) 
       ElseIf IsAttachmentPDF(objNewMail) <> True Then 
        For count = 1 To objNewMail.Attachments.count 
         objNewMail.Attachments.Remove (count) 
        Next 
       End If 
      End If 
    Next 

End Sub 
+2

Probablement pas le problème, mais les parenthèses autour de '(count)' sont redondantes. 'objNewMail.Attachments.Remove count' devrait suffire. 'count' n'a pas besoin d'être évalué et passé par value (c'est ce que font les parens supplémentaires) ... c'est * déjà * une valeur. –

+0

Merci! Je ne suis pas une personne VBA (plus d'une fille C#), donc j'apprécie vraiment l'observation. – KellyMarchewa

+1

Votre indentation est également brisée/déroutante. Pensez à utiliser un * indenter * - mon add-in [Rubberduck] (https://github.com/rubberduck-vba/Rubberduck/releases) inclut un port (fonctionne sur les hôtes 64 bits) du très populaire * Smart Indenter * add-in ... il est écrit en C#, si vous cherchez un projet OSS amusant à plonger ;-) –

Répondre

3

Essayez ceci, comme coupable le plus probable si vous supprimez des éléments d'une collection, il doit toujours se faire dans l'ordre inverse, sinon vous devez réindexer votre variable compteur, et qui fait pour le code désordre:

il peut également être nécessaire pour enregistrer l'élément objNewMail après avoir modifié ce (par exemple en supprimant les pièces jointes)

For count = objNewMail.Attachments.count to 1 Step - 1 
    objNewMail.Attachments.Remove count 
Next 
objNewMail.Save '## Not sure if this is necessary 

Autre possibilité:

With objNewMail.Attachments 
    While .Count > 0 
     .Remove 1 
    Wend 
End With 
objNewMail.Save 
+0

Wow, je ne sais pas si c'était enlever le compte() autour, en inversant l'ordre de la boucle , ou en appelant enregistrer, mais cela a fonctionné. Je me bats depuis si longtemps, alors un sincère merci. – KellyMarchewa

+0

C'est probablement le 'Save' qui l'a corrigé. Je regarde votre capture d'écran et l'élément d'exemple a seulement 1 pièce jointe, de sorte que le tri ne serait pas affecté dans ce cas, seulement s'il y a 2 pièces jointes ou plus. –