Für jede Schleife: Einige Elemente werden übersprungen, wenn das Outlook-Postfach durchgeschleift wird, um Elemente zu löschen

8

Ich wollte VBA-Code entwickeln, der:

  1. Durchsucht alle E-Mail-Nachrichten im Postfach
  2. Wenn es irgendwelche anderen Elemente gibt, sagt "Kalendereinladung" überspringt diesen Eintrag.
  3. Findet die E-Mails mit Anhängen
  4. Wenn die angehängte Datei die Erweiterung ".xml" und einen bestimmten Titel enthält, wird sie in einem Verzeichnis gespeichert, andernfalls wird nach
  5. gesucht
  6. Fügt nach dem Schritt 4 alle E-Mail-Anhänge mit der Erweiterung .xml in den Ordner "Gelöschte Objekte" ein und löscht alle E-Mails in diesem Ordner durch Schleifen.

Der Code funktioniert perfekt AUSSER; Zum Beispiel

  1. Es gibt 8 E-Mails mit einer ".xml" -Datei, die an jedes einzelne in Ihrem Postfach angehängt ist.
  2. Führe den Code aus
  3. Sie werden sehen, dass nur 4 der 8 Elemente erfolgreich verarbeitet wurden, andere 4 bleiben in ihren Positionen.
  4. Wenn Sie den Code erneut ausführen, werden jetzt 2 Elemente erfolgreich verarbeitet und weitere 2 verbleiben in Ihrem Postfach.

Problem: Nach dem Ausführen des Codes soll es alle Dateien verarbeiten und löscht sie alle nicht die Hälfte von ihnen in jedem Lauf. Ich möchte, dass alle Artikel in einem einzigen Durchlauf verarbeitet werden.

Übrigens, dieser Code wird jedes Mal ausgeführt, wenn ich das Outlook öffne.

%Vor%     
buri kuri 23.05.2012, 17:35
quelle

2 Antworten

17

Wahrscheinliche Ursache: Wenn Sie InboxMsg.Move ausführen, werden alle Nachrichten in Ihrem Posteingang nach dem verschobenen um eine Position in der Liste erhöht. Also überspringst du einige von ihnen. Dies ist ein großes Ärgernis mit VBAs For Each -Konstrukt (und es scheint auch nicht konsistent zu sein).

Wahrscheinliche Lösung: Ersetzen Sie

%Vor%

mit

%Vor%

Auf diese Weise iteriert man vom Ende der Liste rückwärts. Wenn Sie eine Nachricht an gelöschte Objekte verschieben, spielt es keine Rolle, wenn die folgenden Elemente in der Liste um eins erhöht werden, weil Sie sie ohnehin bereits verarbeitet haben.

    
Jean-François Corbett 23.05.2012, 18:57
quelle
5

Es ist oft keine gute Idee, den Inhalt eines (Teil-) Satzes von Elementen zu ändern, während Sie über sie hinweggehen. Sie könnten Ihren Code so ändern, dass er zuerst alle Elemente identifiziert, die verarbeitet werden müssen, und sie zu Collection hinzufügt. Verarbeiten Sie dann alle Elemente in dieser Sammlung.

Grundsätzlich sollten Sie keine Objekte aus dem Posteingang entfernen, während Sie den Inhalt durchlaufen. Sammeln Sie zuerst alle Elemente, die Sie verarbeiten möchten (in Ihrer Inbox-Schleife). Wenn Sie mit dem Schleifen fertig sind, verarbeiten Sie diese Sammlung von Elementen.

Hier ist ein Pseudocode, der das demonstriert:

%Vor%     
Tim Williams 23.05.2012 18:36
quelle

Tags und Links