2016-07-08 8 views
0

Ich habe einen Ausblick VBA-Code für die Arbeit, die automatisch meine Teammitglieder eine E-Mail zu einer Zeit zuweisen, um auf unsere Kunden zu reagieren, und wie es dies tut, es auch scannt und gibt ihnen alle E-Mails, die später aus der gleiche E-Mail-Adresse, so kann der Kunde auf einmal behandelt werden.Outlook VBA - Erkennen, wenn der Posteingang leer ist? Makro ausführen, wenn der Posteingang leer ist?

Ich möchte, dass diese Datei ausgeführt wird, wenn ihr eigener Ordner leer ist (dh sie hat einen Client bearbeitet und führt die obigen Anweisungen automatisch aus, wenn sie die aktuelle Mail in ein Archiv verschieben und ihren Hauptordner verlassen leer).

Gibt es eine Möglichkeit, dies zu tun? Ich weiß, dass ich das Makro einstellen kann, um es alle 5 Minuten zu überprüfen, aber das verlangsamt Outlook massiv. Gibt es eine Möglichkeit, das Makro nur auszulösen, wenn der Ordner des Benutzers geleert wird?

Prost

Chris

Antwort

0

Events sind dafür perfekt.

Ereignisse werden von der Anwendung ausgelöst, wenn Schlüsseländerungen vorgenommen werden. Dies ermöglicht es Ihnen, eine zeitgesteuerte Schleife zu vermeiden.

Mit der Anweisung WithEvents können Sie eine Variable erstellen, die Ereignisaufrufe verarbeiten kann.

In diesem Beispiel zeigt die Variable f auf den Posteingang. Wenn ein Element aus diesem Ordner gelöscht wird, wird die Prozedur f_BeforeItemMove aufgerufen. Es zeigt die Anzahl der verbleibenden Elemente minus eins an. Wir subtrahieren eins, weil das Ereignis vor dem Löschen ausgelöst wird (dies gibt Ihnen die Möglichkeit, es zu löschen, wenn Sie es wünschen).

Da wir ein object variable verwenden, müssen wir es erstellen und zerstören. Dies tritt auf, wenn die App gestartet wird & beendet.

Private WithEvents f As Folder   ' Inbox folder, used to monitor events. 


Private Sub Application_Startup() 
' Register for events. 

    Set f = Application.GetNamespace("MAPI").GetDefaultFolder(olFolderInbox) 
End Sub 

Private Sub Application_Quit() 
' Unregister. 

    Set f = Nothing 
End Sub 



Private Sub f_BeforeItemMove(ByVal Item As Object, ByVal MoveTo As MAPIFolder, Cancel As Boolean) 
' Called when an item is moved out of the inbox. 

    ' Display the number of items left, after delete. 
    MsgBox (f.Items.Count - 1) 
End Sub 

Dieser Code muss zur Klasse ThisOutlookSession hinzugefügt werden. Die Start- und Beendigungs-Ereignisse werden nicht ausgelöst, wenn sie in ein anderes Modul eingefügt werden.

EDIT

Die ursprüngliche Lösung war oben, Trigger, kurz bevor ein Artikel aus dem Posteingang gelöscht. Der OP wollte Code, der gleich danach gefeuert wurde. Diese neue Lösung macht das.

Private WithEvents f As Folder   ' Inbox folder, used to monitor events. 
Private WithEvents i As Items   ' Items within folder above 


Private Sub Application_Startup() 
' Register for events. 

    Set f = Application.GetNamespace("MAPI").GetDefaultFolder(olFolderInbox) 
    Set i = f.Items 
End Sub 

Private Sub Application_Quit() 
' Unregister. 

    Set i = Nothing 
    Set f = Nothing 
End Sub 

Private Sub i_ItemRemove() 
' Called each time an item is moved out of the inbox. 
' This can be triggered by moving an item to another folder 
' or deleting it. 

    ' Display the new inbox item count. 
    MsgBox i.Count 
End Sub 

Wie zuvor; Dieser Code sollte innerhalb ThisOutlookSession platziert werden. Sie müssen Outlook neu starten oder Application_Startup manuell ausführen.

+0

Danke für deine Antwort. Ich habe das versucht und leider feuert es nichts. Ich habe den Code in ThisOutlookSession platziert und auf den Ordner gerichtet, den ich überwachen möchte, aber er tut nichts, wenn ich E-Mails aus dem Posteingang lösche oder verschiebe. –

+0

Entschuldigung, ich hätte hinzufügen sollen; Damit dieser Code funktioniert, müssen Sie entweder 'Application_Startup' manuell ausführen oder Outlook schließen und erneut öffnen. Um manuell zu starten, klicken Sie einfach in den Sub und drücken Sie F5. Warum? Weil die f-Objektvariable über die SET-Anweisung erstellt werden muss. Sobald dies erledigt ist, wird es auf Ereignisse reagieren. –

+0

Das funktioniert jetzt gut, dass ich Outlook neu gestartet habe. Vielen Dank. Eine Frage allerdings. Ich brauche das, um zu laufen, nachdem das Poststück verschoben worden ist, nicht gerade vorher, da mein folgender Code die Zahl der Postfächer überprüft und nur dann ausgeführt wird, wenn es 0 entspricht. Da das vorher läuft, denkt es, dass noch eine E-Mail in dem Feld ist und mein nächster Teil läuft nicht. –

0

können Sie fangen die Items.ItemRemove Ereignis zu überwachen, wenn die Items.Count Eigenschaft auf 0 Anruf wertet die Initialize_handler() -Methode während der Application_Startup() Ereignis:

Public WithEvents myOlItems As Outlook.Items 
 
      
 
Public Sub Initialize_handler() 
 
    
 
Set myOlItems = Application.GetNamespace("MAPI").GetDefaultFolder(olFolderInbox).Items 
 
    
 
End Sub   
 
    
 
Private Sub myOlItems_ItemRemove() 
 
    
 
If myOlItems.Count = 0 Then 
 
    'Inbox is empty! 
 
End If 
 
    
 
End Sub