bigfudge
Goto Top

Outlook VBA, nur eine bestimmte Anzahl an Items in Ordner durchsuchen

Hallo,

Ich habe ein Makro geschrieben, was eigentlich auch funktioniert. Im Grunde durchsucht es einen Folder bei jeder neuen Mail die ankommt
(newmailex event). Problem ist nun, dass in dem Ordner ca. 8000 eMails zu finden sind und Outlook dementsprechend hängen bleibt (Not responding). Ist das normal bei einer solchen Menge das Programm abstürzt? Laut Debugger macht es genau was es soll und mit einem anderen Folder, in welchem weniger Mails sind funktioniert es auch wie gewollt.

Meine Frage ist nun ob man irgendwie beeinflussen kann wie und in welcher Reihenfolge ein Ordner durchsucht wird (z.B. nur 20 aktuellsten Mails o.Ä.)

Liebe Grüße,
fudge

Content-Key: 251983

Url: https://administrator.de/contentid/251983

Ausgedruckt am: 29.03.2024 um 08:03 Uhr

Mitglied: 114757
114757 15.10.2014 aktualisiert um 10:24:59 Uhr
Goto Top
Zitat von @bigfudge:
Meine Frage ist nun ob man irgendwie beeinflussen kann wie und in welcher Reihenfolge ein Ordner durchsucht wird (z.B. nur 20
aktuellsten Mails o.Ä.)
Dafür gibt es die Restrict-Methode der Items-Collection mit der man Mails schon im vornherein anhand der Eigenschaften entsprechend begrenzen kann:
http://www.outlookcode.com/article.aspx?id=30
sFilter = "[ReceivedTime] >= '" & Format(Now - 1, "ddddd") & "'"  
Set itms = Session.GetDefaultFolder(olFolderInbox).Items.Restrict(sFilter)

Oder die Items absteigend sortieren (Descending):
Items.Sort Method
und dann nur die ersten 20 Items mit einer FOR-Schleife abarbeiten.

Gruß jodel32
Mitglied: bigfudge
bigfudge 15.10.2014 um 10:24:51 Uhr
Goto Top
Danke! Werde ich sobald ich Zeit habe (spätestens morgen früh) ausprobieren und Feedback geben. Trotzdem direkt mal die Frage wie das funktioniert? Müsste für so etwas nicht auch jede Mail in der Inbox auf dieses Kriterium überprüft werden womit man wieder bei ähnlichem Aufwand ist?

Gruß
Fudge
Mitglied: 114757
114757 15.10.2014 aktualisiert um 10:27:39 Uhr
Goto Top
Zitat von @bigfudge:
Frage wie das funktioniert? Müsste für so etwas nicht auch jede Mail in der Inbox auf dieses Kriterium
überprüft werden womit man wieder bei ähnlichem Aufwand ist?
normalerweise ist das wesentlich schneller als mit einer Schleife alle Items zu durchlaufen, da es die Outlook-Integrierte Suchfunktion verwendet, mit der du z.B. auch die Anzeige eines Ordners Filtern kannst
Mitglied: bigfudge
bigfudge 15.10.2014 um 10:28:27 Uhr
Goto Top
Alles klar, werde das wie gesagt spätestens morgen ausprobiern und Rückmeldung geben!
Mitglied: bigfudge
bigfudge 15.10.2014 um 10:57:49 Uhr
Goto Top
Konnte es mir doch schon eher ansehen.

Kriege bei der Zuweisung der Inbox einen TypeMissmatch Error:

sFilter = "[ReceivedTime] >= '" & Format(Now - 1, "ddddd") & "'"  

            'Set Inbox to specified folder (e.g. Foldername)  
            Set Inbox = Application.Session.Stores("Mailboxname").GetRootFolder.folders("Foldername").Items.Restrict(sFilter)  

Dazu vllt. eine Idee?

Gruß
Mitglied: 114757
114757 15.10.2014 aktualisiert um 11:20:12 Uhr
Goto Top
Zitat von @bigfudge:
Dazu vllt. eine Idee?
klar, du weist einem Folder-Objekt eine Items-Collection zu, das geht natürlich nicht face-wink

for each item in Application.Session.Stores("Mailboxname").GetRootFolder.folders("Foldername").Items.Restrict(sFilter)  
  msgbox item.Subject
next
Mitglied: bigfudge
bigfudge 15.10.2014 um 11:30:28 Uhr
Goto Top
Hi, ja da kam ich eben auch dahinter :D.

Weise ich dem sFilter ein Datum zu z.B. mit

 DateStart = #15/10/2014#
            DateToCheck = "[ReceivedTime] >= """ & DateStart & """"  


und ich Restricte damit funktioniert alles.

Würde aber gerne immer von der aktuellen Zeitpunkt (Now?) z.B. eine Stunde abziehen um es immer die Mails der letzten Stunde zu haben.

DateStart = Format((Now() - TimeValue("01:35:00")), "ddddd h:nn AMPM")  
DateToCheck = "[ReceivedTime] >= """ & DateStart & """"  

Damit habe ich zwar keinen Fehler, aber der Folder enthält dann keine Items obwohl er welche enthalten sollte. Schätze mal das ist ein Formatierungsfehler oder ich hab grundlegend bei der Uhrzeit bzw. dem Datum was falsch gemacht.

Gruß
Mitglied: 114757
114757 15.10.2014 aktualisiert um 11:55:09 Uhr
Goto Top
Zitat von @bigfudge:
Damit habe ich zwar keinen Fehler, aber der Folder enthält dann keine Items obwohl er welche enthalten sollte. Schätze
mal das ist ein Formatierungsfehler oder ich hab grundlegend bei der Uhrzeit bzw. dem Datum was falsch gemacht.
läuft hier ohne Probleme, oder du hast woanders einen Fehler, wie vorhin face-wink
nehm mal einfache Anführungszeichen um das Datum herum.
Mitglied: bigfudge
bigfudge 15.10.2014 um 12:03:07 Uhr
Goto Top
Mh... sehe den Fehler nicht - vllt. du? :D

 
DateStart = Format(Now - TimeValue("01:35:00"), "ddddd h:nn AMPM")  
DateToCheck = "[ReceivedTime] >= ""' & DateStart & '"""  
'Set Inbox to specified folder (e.g. Foldername)  
Set Inbox = Application.Session.Stores("Mailboxname").GetRootFolder.folders("Foldername")  
Set myFolder = Inbox.Items.Restrict(DateToCheck)

beim Debuggn hat Inbox 17 Items, myFolder 0. Verwende ich bei DateStart das hard-coded Datum funktioniert es wiegesagt :/
Mitglied: 114757
114757 15.10.2014 um 12:08:34 Uhr
Goto Top
DateToCheck = "[ReceivedTime] >= '" & DateStart & "'"  
Mitglied: bigfudge
bigfudge 15.10.2014 aktualisiert um 12:30:53 Uhr
Goto Top
Mhhhh.. scheint nicht zu klappen.

Beispiel von Item aus Inbox: Item 18: ReceivedTime: #15.10.2014 12:14:49#

myFolder -> Items -> Count = 0
Inbox -> Items -> Count = 18

EDIT: Verwende Outlook 2007 (auf Englisch) falls das was ändert

face-sad
Mitglied: 114757
114757 15.10.2014 aktualisiert um 12:41:35 Uhr
Goto Top
Zitat von @bigfudge:
EDIT: Verwende Outlook 2007 (auf Englisch) falls das was ändert
Das wird es vermutlich sein (Unterschied zwischen Systemsprache und Outlook-Sprache), formatiere das Datum mal ins englische Format Format(Now - TimeValue("01:35:00"),"mm\/dd\/yyyy h:nn AMPM")
Outlook erwartet hier leider immer ein Datum im richtigen Format als String formatiert ... musst du einfach mal mit spielen
Mitglied: bigfudge
bigfudge 15.10.2014 aktualisiert um 13:39:58 Uhr
Goto Top
Ja liegt eigentlich nahe.

Will leider trotzdem nicht face-sad(

Werte laut Debugger:

DateStart : #15.10.2014 11:29:00# : Date
DateToCheck : "[ReceivedTime] >= '15.10.2014 11:29:00'" : String

MyFolder 0
Inbox: 18


mit
DateStart = #10/14/2014#
funktioniert es, das kann doch nicht sein? :/

Also Unterschied zwischen Outlook + Systemsprache hab ich nicht, ist beides auf Englisch

aktuell:

DateStart = Format(Now - TimeValue("01:35:00"), "mm\/dd\/yyyy hh:mm AMPM")  
            DateToCheck = "[ReceivedTime] >= '" & DateStart & "'"  
            'Set Inbox to specified folder (e.g. Foldrename)  
            Set Inbox = Application.Session.Stores("Mailboxname").GetRootFolder.folders("Foldername")  
            Set myFolder = Inbox.Items.Restrict(DateToCheck)

habe es mit mm/dd/yyyy AMPM, mm\dd\yyyy usw. versucht -.-

EDIT: aber du hast recht, meine Systemzeit ist natürlich auf Germany eingestellt.

Date formats

short date: dd.MM.yyyy
long date dddd, d.MMMM yyyy

Time formats
Short time HH:mm
Long time: HH:mm:ss

Da aber die Daten beim Debugger gleich angezeigt werden, kann es daran fast nicht liegen oder?
Also ein mail Item aus der Inbox hat genau das selbe Format wie DateStart

Gruß
Mitglied: 114757
114757 15.10.2014 aktualisiert um 14:40:47 Uhr
Goto Top
aähhmmm schon wieder ein Flüchtigkeitsfehler...
"mm\/dd\/yyyy hh:mm AMPM"
das hast du falsch übernommen dat mut: h:nn sonst hast du die Monate als Minuten face-wink
Mitglied: bigfudge
bigfudge 15.10.2014 um 14:49:36 Uhr
Goto Top
Ja, damit steht im Debugger dann : DateStart : #15.109.2014 01:06:00# also aktuelle Zeit - 1h 35min. Ohne AMPM halt die normale Zeit.

Verstehe nicht warum das nicht funktioniert?`

Wenn die normalen Mailitems in der Inbox als Received Time z.B. #15.10.2014 14:41:32# haben und im DateToCheck String folgendes steht:

"[ReceivedTime] >= '15.10.2014 13:11:00'"" muss das doch passen oder nicht? ich mein genau diese Werte werden doch letztendlich verglichen?

Kapier das nicht -.-. Wie kann das nur mit hard-coded Date funktionieren und so nicht? Was bedeuten diese Rauten genau?

Gruß
Mitglied: 114757
114757 15.10.2014 aktualisiert um 15:09:00 Uhr
Goto Top
Sekunden dürfen dort nicht mit rein, aber das macht ja bereits der Format-Befehl. Keine Ahnung warum es bei dir jetzt nicht läuft. Hier läuft es auf einem 2010 und einem 2007er in einer VM einwandfrei. Ich weis nur das ich damals mit 2007 schon mal irgendwelche ähnlichen Probleme hatte, was das genau war weis ich nicht mehr.
Sorry.
Was bedeuten diese Rauten genau?
Damit kennzeichnet Outlook ein Datum in SQL-Abfragen, wie der Filter eine ist.

Versuch es mal so
DateToCheck = "[ReceivedTime] >= '#" & DateStart & "#'"
Mitglied: bigfudge
bigfudge 15.10.2014 um 15:21:42 Uhr
Goto Top
Leider auch nicht. Mensch... das wäre wirklich genau die Lösung die ich bräuchte und jetzt geht das komischerweise nicht -.-.

Falls dir noch was einfällt immer her damit! Nochmal danke für deine bisherige Hilfe!
Mitglied: 114757
114757 15.10.2014 aktualisiert um 16:05:58 Uhr
Goto Top
Als vorübergehende ebenfalls schnelle Alternative:
Dim inbox As Folder, itms As items, itm As Object
Set inbox = Application.Session.Stores("Mailboxname").GetRootFolder.folders("Foldername")   
Set itms = inbox.items
itms.Sort "[ReceivedTime]", True   'Items nach Zeit absteigend sortieren  
For Each itm In itms
    If itm.ReceivedTime > (Now() - TimeValue("01:35:00")) Then  
        'mach was mit den Objekten die innerhalb des Zeitraums liegen  
        Debug.Print itm.ReceivedTime
    Else
        'Zeit liegt außerhalb des Timerframes verlasse die Schleife vorzeitig  
        Exit For
    End If
Next
Mitglied: bigfudge
bigfudge 15.10.2014 um 16:13:26 Uhr
Goto Top
wow danke! ist das schneller als einfach so über die inbox zu iterieren und dabei jedes mailobjekt auf receivedtime zu überprüfen? weil genauso mache ich das grade :D

Gruß
Mitglied: 114757
114757 15.10.2014 aktualisiert um 16:21:04 Uhr
Goto Top
Zitat von @bigfudge:
wow danke! ist das schneller als einfach so über die inbox zu iterieren und dabei jedes mailobjekt auf receivedtime zu
überprüfen? weil genauso mache ich das grade :D
Nein das ist nicht das selbe, weil es die Items vorher nach Datum absteigend sortiert, somit kommen die aktuellen Mails als erstes an die Reihe, die Schleife bricht dann ab sobald ein Item älter als angegeben ist. Siehe die Kommentare im Script!
Mitglied: bigfudge
bigfudge 15.10.2014 um 16:47:11 Uhr
Goto Top
Ja, sieht alles gut aus. Hoffen wir mal dass es das ursprüngliche Problem (Absturz bei 8000Mails) verhindert. 8000Items zu sortieren ist vllt. auch nicht zu unterschätzen. Aber ich schätze mal das Sortieren und das direkte Filtern nach der Zeit nimmt sich nicht viel?

Gruß
fudge
Mitglied: bigfudge
bigfudge 15.10.2014 um 17:42:17 Uhr
Goto Top
Warum eigentlich dieses True? sollte da nicht etwas wie DESC oder so stehen?
Mitglied: 114757
114757 16.10.2014 aktualisiert um 08:14:44 Uhr
Goto Top
Zitat von @bigfudge:
Warum eigentlich dieses True? sollte da nicht etwas wie DESC oder so stehen?
schon mal was von Intellisense gehört ?! Oder die Funktionsreferenz in Outlook befragt, da steht drin, welche Parameter verlangt werden !! Sowas ist nun wirklich keine Frage Wert ...
http://msdn.microsoft.com/de-de/library/office/ff866960(v=office.15).as ...