VBA - Mails verschieben mit Datum-Filter

Moderator: ModerationP

VBA - Mails verschieben mit Datum-Filter

Beitragvon Proma » 19. Jul 2021, 19:13

Hallo liebe Experten,

seit geraumer Zeit suche ich nach einer Möglichkeit, meine Postfächer (Posteingang und Gesendete Elemente) mittels eines VBA-Scripts "sauber" zu halten, d.h. Mails, die innerhalb eines bestimmten Zeitraumes erhalten bzw. gesendet wurden, in einen "Persönlichen Ordner" zu verschieben. Mein Vorhaben ist jetzt schon ziemlich weit gediehen, aber für das Kern-Problem habe ich bislang noch keine Lösung gefunden:
Wie muss der Filter exakt lauten, damit alle MailItems gefunden werden, die ich z.B. im Zeitraum 01.05.2021 bis 31.05.2021 empfangen bzw. gesendet habe - und wo bekomme ich die Feldnamen her (muss ich - bezogen auf das nachstehende Beispiel - die amerikanischen [SenderName] oder die deutschen [Von] Feldbezeichnungen verwenden)? Aus der Offline-Hilfe bin ich auch nicht wirklich schlau geworden...

Code: Alles auswählen
 Set myItem = myItems.Find("[SenderName] = 'Dan Wilson'")

Meine Ausstattung:
Windows 10, Office 2010

Vielen Dank schon vorab für Eure Unterstützung und liebe Grüße
vom Martin

Hier nochmal der Code im Zusammenhang, den ich im Internet gefunden (und mir schon ein wenig angepasst) habe, https://docs.microsoft.com/de-de/office/vba/api/outlook.mailitem.move?form=MY01SV&OCID=MY01SV
Code: Alles auswählen
 Dim myNameSpace As Outlook.NameSpace
 Dim myInbox As Outlook.Folder
 Dim myDestFolder As Outlook.Folder
 Dim myItems As Outlook.Items
 Dim myItem As Object
 
 Set myNameSpace = Application.GetNamespace("MAPI")
 Set myInbox = myNameSpace.GetDefaultFolder(olFolderInbox)
 Set myItems = myInbox.Items
 Set myDestFolder = myInbox.Folders("Personal Mail")
 Set myItem = myItems.Find("[SenderName] = 'Dan Wilson'")
 While TypeName(myItem) <> "Nothing"
 myItem.Move myDestFolder
 Set myItem = myItems.FindNext
 Wend
Proma
Im Profil kannst Du frei den Rang ändern
 
Beiträge: 594
Registriert: 08. Sep 2015, 11:43

Re: VBA - Mails verschieben mit Datum-Filter

Beitragvon Fennek » 20. Jul 2021, 08:40

Hallo,

nachdem ich mit er Reihenfolge bei ".GetNext" und ".GetPrevious" bei normalen Email-Konten und ExChange, bei ExChange auch noch mit Cached ode nicht einige Prolemchen hatte, war dieser Ansatz besser:

Code: Alles auswählen
Sub Reihenfolge()
Dim NSp As NameSpace: Set NSp = Application.GetNamespace("MAPI")
Dim IBx As Folder, Ziel as Folder
Dim EML As MailItem
Dim Von as Date, Bis as Date

Bis = datavalue("1.6.2021")
Von = datevalue("1.5.2021")
set Ziel = NSp.Folders.Item("myEmai@T-Online.de").Folders.Item("Ablage")

Set IBx = NSp.Folders.Item("myEmail@T-Online.de").Folders.Item("Posteingang")

For i =  IBx.Items.Count to 1 Step -1
   
    if Ibx.Item(i).ReceivedTime < Bis and Ibx.Item(i).ReceivedTime < Von then _
   Ibx.Item(i) move Ziel

Next i
End Sub


Es ist ein echter Code, der aber freihändig umgeschrieben und damiit nicht getestet ist. Insbesondere der Ordner "Ziel" muss angepasst werden.

mfg
Benutzeravatar
Fennek
Im Profil kannst Du frei den Rang ändern
 
Beiträge: 824
Registriert: 12. Feb 2016, 18:56

Re: VBA - Mails verschieben mit Datum-Filter

Beitragvon Proma » 20. Jul 2021, 11:24

Hallo Fennek,

herzlichen Dank für Deine Nachricht und den Code!
Das sieht schon mal vielversprechend aus! Ich werde es heute Nachmittag gleich testen und dann berichten.

Danke einstweilen und liebe Grüße
vom Martin
Proma
Im Profil kannst Du frei den Rang ändern
 
Beiträge: 594
Registriert: 08. Sep 2015, 11:43

Re: VBA - Mails verschieben mit Datum-Filter

Beitragvon Proma » 20. Jul 2021, 17:27

Hallo Fennek,

tut mir leid, hat ein bisschen gedauert... Aber wir sind ja auch schon in der 2. Jahreshälfte und da sind die Tage immer viel kürzer. :P
Der Code, den ich von Dir bekommen habe, läuft nach ein paar kleinen Anpassungen und Änderungen einwandfrei. Ich habe ihn noch ein bisschen aufgemotzt und kommentiert und stelle ihn Dir und anderen Interessierten zur Verfügung.

Allerdings lässt die Geschwindigkeit schon noch Wünsche offen; bei 155 Mail-Nachrichten in meinem Posteingang hat es in mehreren Durchläufen doch jeweils ca. 6-8 Sekunden gedauert, bis die 14 Test-Mails dort waren, wo sie hingehören. Daher wäre es schon interessant für mich zu wissen, ob man nicht doch mit dem .Find-Filter schneller vorankommt. Du schreibst, Du hattest Probleme mit den Befehlen GetNext und GetPrevious. Die kommen aber in dem Beispiel-Code, den ich mit meinem Eingangs-Post übersandt habe, nicht zum Einsatz. Dort wird erst per .Find-Methode die Menge der MailItems herausgefiltert, die der Bedingung entsprechen, und diese Menge wird dann per FindNext durchgeackert. Die Reihenfolge, in der die Mails dann verschoben werden - dachte ich wenigstens - spielt dann keine Rolle mehr. Wichtig ist doch nur, dass die RICHTIGEN Mails gefunden und verschoben werden, oder? Entschuldigung, ich will kein Besserwisser sein, ich wills nur kapieren. :P

Aber wenn ich dann die .Find-Methode einsetze, dann stehe ich wieder vor dem leidigen Problem, wie muss der Filter aussehen, damit ich das gewünschte Ergebnis erhalte? Und gerade jetzt, da die Tage immer kürzer werden, kommt der Geschwindigkeitsfrage doch eine besondere Bedeutung zu, nicht wahr! :P

Ich bin schon sehr neugierig auf weitere Tipps!
Vielen Dank und liebe Grüße
vom Martin


Code: Alles auswählen
Public Function pMoveMailItems() As Boolean
 
'Zeitraum definieren
  Const dtmVon As Date = "01.05.2021"
  Const dtmBis As Date = "31.05.2021"

  Dim m        As String                                        'MeldeText
  Dim i        As Integer                                       'Index-Variable
  Dim n        As Integer                                       'Anzahl der verschobenen Mails
  Dim olkFldQ  As Outlook.Folder                                'Quell-Ordner
  Dim olkFldZ  As Outlook.Folder                                'Ziel-Ordner
  Dim dtmEmpf  As Date                                          'Datum des Mail-Empfangs


  On Error GoTo Err_pMoveMailItems                              'Bei Fehler gehe zu SM: Fehler
  pMoveMailItems = False                                        'Rückgabewert (Voreinstellung)


'Festlegen von Quell- und Ziel-Ordner
  With Application.GetNamespace("MAPI")                         'Bezugsobjekt: NameSpaceObjekt
    Set olkFldQ = .GetDefaultFolder(olFolderInbox)              '  Quell-Ordner (Posteingang)
    With .Session.Folders("Archiv_2021")                        '  Bezugsobjekt: Persönl. Ordner Archiv_2021
      Set olkFldZ = .Folders("Eingang")                         '    Ziel-Ordner (Unterordner von Archiv_2021, 2. Ebene)
    End With                                                    '  Ende Bezugsobjekt (Persönl. Ordner Archiv_2021)
  End With                                                      'Ende Bezugsobjekt (NameSpaceObjekt)


'Mails verschieben
  For i = olkFldQ.Items.Count To 1 Step -1                      'Schleife durch alle MailItems des Quell-Ordners
    dtmEmpf = olkFldQ.Items(i).ReceivedTime                     '  Hole das Empfangsdatum der nächsten Mail
    If dtmEmpf >= dtmVon And dtmEmpf <= dtmBis Then             '  Wenn die Mail im fraglichen Zeitraum erhalten wurde
 
   'Nur zum Testen
      'm = "Mail wird verschoben." & vbLf                        '    Erstelle den MeldeText (Teil 1)
      'm = m & dtmEmpf                                           '    Erstelle den MeldeText (Teil 2)
      'MsgBox m                                                  '    Zeige den MeldeText

      olkFldQ.Items(i).Move olkFldZ                             '    Verschiebe die Nachricht vom Quell- in den Ziel-Ordner
      n = n + 1                                                 '    Setze den Zählerwert um 1 hoch
    End If                                                      '  Ende Wenn
  Next i                                                        'Ende Schleife

 
'Hurra
  MsgBox n & " Mails wurden verschoben!"                        'Zeige Erfolgsmeldung
  pMoveMailItems = True                                         'Setze den Rückgabewert


Exit_pMoveMailItems:                                          'SM: Ausgang
  Set olkFldQ = Nothing                                         'Zurücksetzen Quellordner
  Set olkFldZ = Nothing                                         'Zurücksetzen Zielordner
  Exit Function                                                 'Verlasse diese Prozedur


Err_pMoveMailItems:                                           'SM: Fehler
  MsgBox "Fehler-Nr.: " & Err.Number & vbLf & Err.Description   'Zeige Fehlermeldung
  Resume Exit_pMoveMailItems                                    'Setze fort bei SM: Ausgang
 
End Function
Proma
Im Profil kannst Du frei den Rang ändern
 
Beiträge: 594
Registriert: 08. Sep 2015, 11:43

Re: VBA - Mails verschieben mit Datum-Filter

Beitragvon mmarkus » 21. Jul 2021, 08:58

Proma hat geschrieben:Aber wenn ich dann die .Find-Methode einsetze, dann stehe ich wieder vor dem leidigen Problem, wie muss der Filter aussehen..


Warum ist das ein Problem, in der Online Hilfe findest du bei der Find Methode jede Menge Beispiele und Erklärungen dazu.
Einfach sorgfältig durchlesen und übernehmen.

Zum Filtern verwendet man aber die Restrict Methode. Auch da gibts in der Hilfe umfassende Infos dazu.
Das hat natürlich die höchste Performance, da der gesamte Prozess in einem Schritt über die interne Datenbank von Outlook ausgeführt wird.
ms access what else
mmarkus
Im Profil kannst Du frei den Rang ändern
 
Beiträge: 2142
Registriert: 16. Apr 2012, 16:07
Wohnort: Oberösterreich

Re: VBA - Mails verschieben mit Datum-Filter

Beitragvon Proma » 21. Jul 2021, 14:42

Hallo mmarkus,

danke für Deine Antwort.
Natürliche habe ich es mit der Online- wie auch mit der Offline-Hilfe zuallererst versucht. Ich habe aber auch in meinem ersten Post gleich auf meine diesbezüglichen Schwächen hingewiesen:
Proma hat geschrieben:Aus der Offline-Hilfe bin ich auch nicht wirklich schlau geworden...


Nachdem ich mit mehreren Anläufen, das Problem mittels Tests auf der Basis von Versuch und Irrtum in den Griff zu bekommen, kläglich gescheitert bin, habe ich meine ganze Hoffnung auf das Forum gesetzt - und da sitzt sie jetzt immer noch, denn ich weiß genau, dass Du und die anderen Experten mich nicht im Stich lassen werdet!

Also nochmal:
Wo kriege ich die Feldnamen her? Ist der Feldname z.B. für den Absender [SenderName] oder lautet die Feldbezeichnung [Von]?
Ist ein Datum, z.B. der 1. Mai 2021 so einzugeben 5/1/2021 oder so 05/01/2021 oder 01.05.2021 oder ganz anders?
Wie könnte eine Item.Find()-Funktion aussehen, die auf ein Gesendet- bzw. Empfangen-Datum abstellt?

Es tut mit leid, dass ich immer so dumm frage, aber es muss halt auch ein paar Blödmänner wie mich geben; und wenn es die nicht gäbe und schon alle alles wüssten, dann wäre ja dieses Forum glatt überflüssig. Und das wäre doch nun wirklich schade, oder? :P

Also, nix für ungut und liebe Grüße
vom Martin
Proma
Im Profil kannst Du frei den Rang ändern
 
Beiträge: 594
Registriert: 08. Sep 2015, 11:43

Re: VBA - Mails verschieben mit Datum-Filter

Beitragvon Fennek » 21. Jul 2021, 14:50

Hallo Martin,

aus Interesse wollte ich "Restrict" einmal testen. Mit dem Hilfetext von MS ist das entstanden:

Code: Alles auswählen
Sub iRestrict()
Dim Nsp As NameSpace: Set Nsp = Application.GetNamespace("MAPI")
Dim Ibx As Folder: Set Ibx = Nsp.GetDefaultFolder(olFolderInbox)
Dim Itms As Items: Set Itms = Ibx.Items
Dim Restrict As Items

Dim sFilter As String
Dim EML As MailItem

sFilter = "[ReceivedTime] > '" & Format("7/20/2021", "m/d/yyyy") & "'"

Set Restrict = Itms.Restrict(sFilter)

For i = 1 To Restrict.Count
    With Restrict.Item(i)
        Debug.Print .Subject, .ReceivedTime
    End With
Next i

End Sub


Die Zeit so zu übergeben ist schon etwas ....

Wie man aber von ... bis ... übergibt, wollte ich dann nicht mehr testen.

mfg
Benutzeravatar
Fennek
Im Profil kannst Du frei den Rang ändern
 
Beiträge: 824
Registriert: 12. Feb 2016, 18:56

Re: VBA - Mails verschieben mit Datum-Filter

Beitragvon Proma » 21. Jul 2021, 15:08

Hallo Fennek,

vielen Dank, das schaut doch schon sehr gut aus!
Ich muss jetzt mal weg, werde mich aber dann umgehend - vielleicht noch heute Abend - drüber machen und berichten. Und ich bin mir ganz sicher, dass ich dann auch schon getestet haben werde, wie man von... bis... übergibt. :P
Vielen Dank, damit hast Du mir sehr geholfen!

Liebe Grüße
vom Martin
Proma
Im Profil kannst Du frei den Rang ändern
 
Beiträge: 594
Registriert: 08. Sep 2015, 11:43

Re: VBA - Mails verschieben mit Datum-Filter

Beitragvon Proma » 22. Jul 2021, 09:28

Hallo Fennek,

ich hab's geschafft!
Nachstehend wie versprochen der Code zum Testen. Die Laufzeit hat sich halbiert, Ich bin restlos begeistert, Du hast mir sehr geholfen!!!

Vielen Dank nochmal für Deine großartige Unterstützung!
Schönen Wochenausklang und liebe Grüße
vom Martin

Code: Alles auswählen
Sub pTestRestrict()
  Dim c         As String                                       'MeldeText
  Dim m         As String                                       'MeldeText
  Dim i         As Integer                                      'Index-Variable
  Dim strFlt    As String                                       'Filter
  Dim olkFldQ   As Outlook.Folder                               'Standard-Ordner Posteingang
  Dim olkFldZ   As Outlook.Folder                               'Persönl. Ordner Archiv_2021\Eingang
  Dim olkAllItm As Outlook.Items                                'MailItems-Auflistung im Posteingang (alle Mails)
  Dim olkFltItm As Outlook.Items                                'MailItems-Auflistung nach dem Filtern
  Dim olkItm    As Outlook.MailItem                             'Einzelnes MailItem
 
 
'Objekt-Variablen Initialisieren
  With Application.GetNamespace("MAPI")                         'Bezugsobjekt: NameSpace-Objekt
    Set olkFldQ = .GetDefaultFolder(olFolderInbox)              '  Standard-Ordner Posteingang (Quelle)
    Set olkAllItm = olkFldQ.Items                               '  Alle MailItems im Quell-Ordner
    With .Session.Folders("Archiv_2021")                        '  Bezugsobjekt: Persönl. Ordner Archiv_2021
      Set olkFldZ = .Folders("Eingang")                         '    Unterordner Archiv_2021\"Eingang" (Ziel)
    End With                                                    '  Ende Bezugsobjekt (Persönl. Ordner Archiv_2021)
  End With                                                      'Ende Bezugsobjekt (NameSpace-Objekt)
 
 
'Filter erstellen und anwenden
  strFlt = "[ReceivedTime] >= '"
  strFlt = strFlt & Format("5/1/2021", "m/d/yyyy") & "' And "
  strFlt = strFlt & "[ReceivedTime] <= '"
  strFlt = strFlt & Format("5/31/2021", "m/d/yyyy") & "'"
  Set olkFltItm = olkAllItm.Restrict(strFlt)                    'Filtere alle MailItems mit Empf.-Datum Mai 2021
 
 
'Gefundene Mails in MsgBox auflisten bzw. verschieben
  With olkFltItm                                                'Bdezugsobjekt: Gefilterte Menge der MailItems
    For i = .Count To 1 Step -1                                 '  Schleife durch alle gefilterten MailItems
      Set olkItm = .Item(i)                                     '    Hole das nächste MailItem
       
'    'Nur zum Testen
'      c = olkItm.Subject                                        '    Hole den Betreff
'      If Len(c) > 20 Then c = Left(c, 20)                       '    Begrenze den Betreff auf maximal 20 Zeichen
'      m = m & olkItm.ReceivedTime & vbTab & c & vbLf            '    Schreibe Empfangs-Datum und Betreff in Liste
       
    'Für den Echt-Gebrauch
      olkItm.Move olkFldZ                                       '    Verschiebe das MailItem in den Ziel-Ordner
    Next i                                                      '  Ende Schleife
   
'' Nur zum Testen
'    MsgBox m                                                    '  Zeige die aufgelisteten Einträge in einer MessageBox
  End With                                                      'Ende Bdezugsobjekt (Gefilterte Menge der MailItems)
 
 
'Objekt-Variablen zurücksetzen
  Set olkFltItm = Nothing                                       'Einzelnes MailItem
  Set olkAllItm = Nothing                                       'Alle MailItems im Posteingang
  Set olkFldZ = Nothing                                         'Persönl. Ordner Archiv_2021\Eingang (Ziel)
  Set olkFldQ = Nothing                                         'Standard-Ordner Posteingang
End Sub
Proma
Im Profil kannst Du frei den Rang ändern
 
Beiträge: 594
Registriert: 08. Sep 2015, 11:43

Re: VBA - Mails verschieben mit Datum-Filter

Beitragvon Proma » 22. Jul 2021, 15:22

Hallo nochmal in die Runde,

nun funktioniert ja, was ich wollte und eigentlich bin ich nun rundum glücklich. Eigentlich. Aber wenn ich schon so viele Wissende um mich habe, dann möchte ich diese Gelegenheit auch gerne nützen, um meinen doch recht bescheidenen VBA-Horizont noch ein bisschen zu erweitern. Insbesondere sind mir im Zusammenhang mit meiner jüngsten Anfrage diese beiden Dinge aufgefallen:

1. Kombinierte Vergleichsoperatoren (<= bzw. >=) beim Filtern per Restrict
Beim Restrict-Filter ist mir aufgefallen, dass sich die Vergleichsoperatoren nicht so verhalten, wie ich es gewöhnt bin.
So werden z.B. bei [ReceivedTime] <= 3/15/2021 keine Mails mit Empfangsdatum 15.03.2021 gefunden, obwohl definitiv welche vorhanden sind. Ändere
ich hingegen den Eintrag auf [ReceivedTime] < 3/16/2021 werden auch die Mails vom 15.03.2021 gefunden. Sin in solchen Fällen Kombinationen von <= und von >= nicht wirksam oder nicht zulässig oder habe ich grundsätzlich alles falsch verstanden? Wenn dem wirklich so ist, ja gut, dann darf ich halt keine Kombinationen verwenden. Aber ich möchte vermeiden, jedes Mal durch Herumexperimentieren herausfinden zu müssen, ob "er" Kombinationen interpretiert oder nicht.

2. Das Amerikanische Datum und die Rauten
Das Amerikanische habe ich in zwei verschiedenen Schreibweisen kennen gelernt, nämlich entweder so
7/22/2021 ´(z.B. beim Filtern per Restrict)
oder so
#7/22/2021# (z.B. bei Access-Abfragen)
Wenn ich nun bein Restrict-Filter das Datum mit den Rauten verwende, erhalte ich zwar keinen Fehler, aber die zurückgegebene Datenmenge ist ungefiltert, d.h. ich erhalte alle Mails, die im Posteingang vorhanden sind. OK, dann darf ich halt hier keine Rauten einfügen. Soweit ist mir das schon klar. Aber gibt es denn eine Faustregel, nach der ich feststellen kann, wann ich die Rauten setzen MUSS, wann ich Rauten setzen KANN und wann Rauten VERBOTEN sind?

Manchmal sehne ich mich danach, auch wenigstens ein bisschen von dem Wissen von Euch Experten zu haben, dann könnte ich mir (und natürlich auch Euch) so das eine oder andere Experimentierstündchen bzw. die eine oder andere lästige Anfrage ersparen.

Recht herzlichen Dank an Euch für Eure bisherige (und hoffentlich auch künftige) Unterstützung!
Liebe Grüße
vom Martin
Proma
Im Profil kannst Du frei den Rang ändern
 
Beiträge: 594
Registriert: 08. Sep 2015, 11:43

Re: VBA - Mails verschieben mit Datum-Filter

Beitragvon HKindler » 22. Jul 2021, 15:54

Hi Martin,

das mit dem <= kann ich, glaube ich, erklären: Das Datum innerhalb von Outlook ist vermutlich kein reines Datum sondern eine Zeit. D.h. da steht in der Datenbank nicht der 15.03.2021, sondern der 15.03.2021 08:37:51 und das ist nun einmal größer als 15.03.2021 00:00:00
So gesehen ist das Gleichheitszeichen in so einer operation reichlich überflüssig, weil es nur Mails betrifft, die genau um Mitternacht gesendet wurden.

Das mit den #-Zeichen bei einem Datum liegt daran, dass damit der Datentyp Date direkt angegeben wird. Ist also im Grunde immer dann notwendig, wenn du ohne Typumwandlung ein Datum angibst. Wenn du das Datum z.B. in einem String übergibst, wird es - ja nach Funktion - in den korrekten Datentyp gewndelt.
Code: Alles auswählen
dim Datum As Date
Datum = #03/15/2021#
Datum = DateValue("03/15/2021")
Merke: intern, also z.B. in einer Variablen, ist ein echtes Datum immer mit Raute. Wenn du einen String (oder eine Zahl, #1.1.1900#=1) übergibst, muss dies zuerst umgewandelt werden. Bei einem String darf dann kein #-Zeichen stehen.
Gruß,
Helmut

----------------------------
Windows 10 Enterprise (64 Bit) / Office 365 ProPlus (32 Bit)
Benutzeravatar
HKindler
Im Profil kannst Du frei den Rang ändern
 
Beiträge: 6293
Registriert: 04. Jul 2013, 09:02
Wohnort: Schwarzwald

Re: VBA - Mails verschieben mit Datum-Filter

Beitragvon Proma » 22. Jul 2021, 18:57

Hallo Helmut,

recht herzlichen Dank erst mal für die klärenden Worte!

Deine Erläuterungen zum #-Zeichen habe ich verstanden und das leuchtet mir auch ein.
Und beim Lesen Deiner Ausführungen zum <= Operator hab' ich gleich einen roten Kopf bekommen und mich geschämt, dass ich da nicht selber drauf gekommen bin. Künftig werde ich vor dem PC eine andere Sitzposition einnehmen, sodass der Kopf leicht nach rechts geneigt ist; dann kann sich das Hirn dort ein bisschen sammeln, und dann funktioniert vielleicht auch das Denken wieder besser. :P

Auch heute haben sich meine guten Erfahrungen im und mit diesem Forum wieder bestätigt - hier werde ich geholfen! :P
Vielen Dank nochmal für Deine Unterstützung, ich hab' wieder etwas dazugelernt!
Liebe Grüße
vom Martin
Proma
Im Profil kannst Du frei den Rang ändern
 
Beiträge: 594
Registriert: 08. Sep 2015, 11:43


Zurück zu Outlook Forum (provisorisch)

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 2 Gäste