VBA Outlook - E-Mails entsprechend filtern
Guten Abend @all,
ich weiß, es ist Freitag Abend aber ich habe noch ein Problem, dass ich bewältigen muss.
Ich brauche ein VBA-Outlook Makro, dass folgendes macht:
Die E-Mail kommt im Posteingang an. Das Marko durchsucht die E-Mail (Betreff und Mailtext) nach einen oder mehreren Begriffen. Sprich in Laufe der Zeit können die Suchbegriffe auf 10 Stück ansteigen. Die E-Mail soll also nach all den Wörter durchsucht werden und falls eines vorkommt, in ein bestimmtes Verzeichnis verschoben werden.
Es handelt sich hier ausschließlich im Outlook 2003 + Exchange. Sollte es eine komfortablere Lösung geben, bitte ich um Meldung. Einigste Bitte, es soll genau das gleiche passieren.
Das Script sieht im Moment wie folgt aus:
Soweit funktioniert auch alles. Jetzt bin ich auf der Suche nach einer Möglichkeit, ein Array in VBA abzubilden und die Werte dort dann zu hinterlegen. So dass ich eigentlich nur noch um die vorhandene NEXT-FOR Schleife noch mal eine drum-rum machen müsste. Müsste doch so gehen?!
Schönen Abend / Weekend
Dani
ich weiß, es ist Freitag Abend aber ich habe noch ein Problem, dass ich bewältigen muss.
Ich brauche ein VBA-Outlook Makro, dass folgendes macht:
Die E-Mail kommt im Posteingang an. Das Marko durchsucht die E-Mail (Betreff und Mailtext) nach einen oder mehreren Begriffen. Sprich in Laufe der Zeit können die Suchbegriffe auf 10 Stück ansteigen. Die E-Mail soll also nach all den Wörter durchsucht werden und falls eines vorkommt, in ein bestimmtes Verzeichnis verschoben werden.
Es handelt sich hier ausschließlich im Outlook 2003 + Exchange. Sollte es eine komfortablere Lösung geben, bitte ich um Meldung. Einigste Bitte, es soll genau das gleiche passieren.
Das Script sieht im Moment wie folgt aus:
Option Explicit
'Deklarationen
'zuerst für Outlook selbst und den Namespace... ohne die beiden geht nichts.
Dim MyOLApp As Application
Dim myNameSpace As NameSpace
Public Sub test()
'Deklaration
Dim FolderInbox As MAPIFolder
Dim FolderNeu As MAPIFolder
Dim MailX As MailItem
'Outlook als Object erstellen
Set MyOLApp = CreateObject("Outlook.Application")
Set myNameSpace = MyOLApp.GetNamespace("MAPI")
'Default-Mailbox nehmen.. manche haben nur eine, andere ein Dutzend
' die aktive Mailbox laut Profil ist logischerweise der Parent (neudeutsch für <i>"Vadder"</i> vom "Posteingang"
Set FolderInbox = myNameSpace.GetDefaultFolder(olFolderInbox)
Set FolderNeu= FolderInbox.Parent.Folders("Neu")
'Verschiebt die Mails aus dem Posteingang in den Ornder "NEU"
'Verschiebt die Mails von "SourceFolder" nach "DestFolder"
For Each MailX In FolderInbox.Items
If StrComp(MailX.Subject, "12345", vbTextCompare) = 0 Then '<<<<<<<<
MailX.Move FolderNeu
End If
Next
'Variablen löschen
Set myNameSpace = Nothing
Set FolderVPN = Nothing
Set MailX = Nothing
End Sub
Schönen Abend / Weekend
Dani
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 80868
Url: https://administrator.de/forum/vba-outlook-e-mails-entsprechend-filtern-80868.html
Ausgedruckt am: 21.04.2025 um 19:04 Uhr
23 Kommentare
Neuester Kommentar
Hallo Dani!
Am Anfang Deines Scripts könntest Du mit
die Liste der Suchbegriffe aus einer Datei (jeder Begriff in einer eigenen Zeile) in ein Array einlesen.
Die zweite Schleife ließe sich dann etwa so realisieren:
Grüße
bastla
Am Anfang Deines Scripts könntest Du mit
WL = "D:\Wortliste.txt"
WordList = Split(CreateObject("Scripting.FileSystemObject").OpenTextFile(WL, 1).ReadAll, vbCrLF)
Die zweite Schleife ließe sich dann etwa so realisieren:
For Each MailX In FolderInbox.Items
For Each Word In WordList
If StrComp(MailX.Subject, Word, vbTextCompare) = 0 Then '<<<<<<<<
MailX.Move FolderNeu
Exit For
End If
Next
Next
Grüße
bastla
Hallo Dani!
Variablentypen:
WordList ist ein String-Array und wird eigentlich implizit durch "Split()" erzeugt.
Grüße
bastla
Textdatei finde ich gut. Somit kann ich einfach immer diese Verteilen.
... oder gleich von einem UNC-Pfad einlesen.Variablentypen:
Dim WL As String, WordList() As String, Word As Variant
Des Weitern ist VBCompare wohl der falsche Parameter
Es liegt nicht am Parameter (der sorgt dafür, dass Groß-/Kleinschreibung nicht unterschieden wird, ist also hier sinnvoll), sondern es würde sich hier die Funktion InStr() besser eignen:If InStr(1, MailX.Subject, Word, vbTextCompare) <> 0 Then
Grüße
bastla
Hallo Dani!
Vielleicht lässt sich ein "LIKE" verwenden, etwa:
oder "Find" lässt sich austricksen:
Die Idee ist hier, alle Mails (aber eben nur Mails) zu finden, indem als Kriterium ein mit größter Wahrscheinlichkeit nicht vorkommender String gewählt wird, allerdings mit Bedingung "<>", und erst danach den Vergleich mit den Suchwörtern vorzunehmen.
Grüße
bastla
[Edit] Startposition "1" bei InStr() ergänzt. [/Edit]
Vielleicht lässt sich ein "LIKE" verwenden, etwa:
Set Mail = Mails.Find("[Subject] LIKE '*" & Word & "*' ")
Set Mail = Mails.Find("[Subject] <> '\-\-\-\-\-\-\-\-\-\-\-\-/-/-/-/-/-/-/-/-/-/-/' ")
Do While TypeName(Mail) <> "Nothing"
For Each Word In WordList
If InStr(1, Mail.Subject, Word, vbTextCompare) Then
Mail.Move FolderDest
Exit For
End If
Next
Set Mail = Mails.FindNext
Loop
Grüße
bastla
[Edit] Startposition "1" bei InStr() ergänzt. [/Edit]
Hallo Dani!
Dann fällt mir für's Erste nur mehr eine "On Error"-Variante ein:
Damit würden zwar Mails ohne Betreff "durchrutschen", aber in solchen kannst Du Deine Schlüsselwörter ja ohnehin nicht finden.
Die Abfrage
ist gar nicht nötig, kann aber durch Überspringen der Überprüfungsschleife die Verarbeitung beschleunigen.
Grüße
bastla
[Edit] Startposition "1" bei InStr() ergänzt. [/Edit]
Dann fällt mir für's Erste nur mehr eine "On Error"-Variante ein:
Subj = ""
On Error Resume Next
Subj = Mail.Subject
On Error Goto 0
If Subj <> "" Then
For Each Word In WordList
If InStr(1, Subj, Word, vbTextCompare) Then
MsgBox "hallo", , "test"
Mail.Move FolderDest
Exit For
End If
Next
End If
Die Abfrage
If Subj <> "" Then
Grüße
bastla
[Edit] Startposition "1" bei InStr() ergänzt. [/Edit]
Hallo Dani!
Freut mich, dass es nun zu funktionieren scheint
(wobei ich den genauen Unterschied noch gar nicht gesehen habe).
Allerdings musste ich beim Drüberschauen feststellen, dass ich InStr() zumeist ohne Startposition ("1") geschrieben habe (was wegen des "vbTextCompare" allerdings nötig ist) - ich korrigiere das dann jeweils oben (und hoffe, dass nicht das die Fehler verursacht hat ...).
Grüße
bastla
Freut mich, dass es nun zu funktionieren scheint
Allerdings musste ich beim Drüberschauen feststellen, dass ich InStr() zumeist ohne Startposition ("1") geschrieben habe (was wegen des "vbTextCompare" allerdings nötig ist) - ich korrigiere das dann jeweils oben (und hoffe, dass nicht das die Fehler verursacht hat ...).
Grüße
bastla