EMail auslesen, verschieben und mit Excel ausgelesene Daten weiterverarbeiten
Hallo da draussen,
Ich habe mal wieder eine Problemstellung bei der ich eure Hilfe brauche.
Ich habe, in Outlook 2010, einen Ordner in dem ich generierte Emails empfange die immer den selben Inhalt haben. Hier stehen immer in der gleichen Zeile Informationen die ich zur Weiterverarbeitung benötige. Diese Informationen möchte ich in Excel importieren und vorzugsweise mit VBA weiterverarbeiten. Anschliessend soll die Email in einen Unterordner verschoben werden.
Ich bin mir nicht sicher ob das so möglich ist und bitte euch um eure Hilfe.
Ich habe mal wieder eine Problemstellung bei der ich eure Hilfe brauche.
Ich habe, in Outlook 2010, einen Ordner in dem ich generierte Emails empfange die immer den selben Inhalt haben. Hier stehen immer in der gleichen Zeile Informationen die ich zur Weiterverarbeitung benötige. Diese Informationen möchte ich in Excel importieren und vorzugsweise mit VBA weiterverarbeiten. Anschliessend soll die Email in einen Unterordner verschoben werden.
Ich bin mir nicht sicher ob das so möglich ist und bitte euch um eure Hilfe.
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 236309
Url: https://administrator.de/contentid/236309
Ausgedruckt am: 25.11.2024 um 10:11 Uhr
42 Kommentare
Neuester Kommentar
ja und welche Informationen willst du daraus extrahieren ? genaue Angaben von Zeilen wären hier von Vorteil (Code-Tags) und wohin Excelfile und in welchem Format sollen die Daten geschrieben werden ?
Ich mach dir dann mal ein Beispiel dazu ...
Ich mach dir dann mal ein Beispiel dazu ...
OK für das Beispiel habe ich mal ein Excel-File erstellt das so aussieht:
Folgender Code extrahiert die Daten und schreibt sie in die Spalten für jede Mail in einem Ordner in Outlook, solange bis dieser keine Mails mehr enthält. Ist keine Mail im Ordner vorhanden wird dies gemeldet. Den Pfad zum Excel File gibst du in Zeile 6 an. Dann musst du noch in Zeile 9 und 11 die korrekten Ordner in Outlook referenzieren. In diesem Beispiel wird ein Ordner mit dem Namen Druckeralerts der im Root des Stores user@domain.net liegt gewählt. In diesem Ordner wird dann der Unterordner erledigt referenziert indem die bearbeiteten Mails landen.
Weitere Kommentare befinden sich im Code...
Hoffe das bringt dich erst mal weiter...
- edit 31.03.2015 - Fehler in Zeile 25 korrigiert
Grüße Uwe
Falls der Beitrag gefällt, seid so nett und unterstützt mich durch eine kleine Spende / If you like my contribution please support me and donate
Folgender Code extrahiert die Daten und schreibt sie in die Spalten für jede Mail in einem Ordner in Outlook, solange bis dieser keine Mails mehr enthält. Ist keine Mail im Ordner vorhanden wird dies gemeldet. Den Pfad zum Excel File gibst du in Zeile 6 an. Dann musst du noch in Zeile 9 und 11 die korrekten Ordner in Outlook referenzieren. In diesem Beispiel wird ein Ordner mit dem Namen Druckeralerts der im Root des Stores user@domain.net liegt gewählt. In diesem Ordner wird dann der Unterordner erledigt referenziert indem die bearbeiteten Mails landen.
VBA Makro (zur Nutzung innerhalb von Outlook)
Sub ExtractPrinterAlerts()
Dim fMails As Folder, mail As MailItem, txtContent As String, arrLines As Variant, objExcel As Object, wb As Object, sheet As Object, rngStart As Object, rngCurrent As Object, fErledigt as Object, txtStatus as String, txtTime as String, txtMessage as String, txtMachine as String, txtSN as String, txtIP as String, txtLocation as String, txtCountTotal as String, txtCountColor as String
'Pfad zur Excel-Datei
Const EXCELFILE = "c:\PrinterAlerts.xlsx"
'Ordner in Outlook referenzieren
Set fMails = Application.Session.Stores("user@domain.net").GetRootFolder.Folders("Druckeralerts")
'Unterordner referenzieren in den die Mails verschoben werden wenn sie bearbeitet wurden
Set fErledigt = fMails.Folders("erledigt")
If fMails.Items.Count > 0 Then
'Excel Objekt erzeugen
Set objExcel = CreateObject("Excel.Application")
objExcel.DisplayAlerts = False
'Excelfile öffnen
Set wb = objExcel.Workbooks.Open(EXCELFILE)
'Daten kommen in erstes Worksheet
Set sheet = wb.Worksheets(1)
'Startzelle in Spalte A ermitteln
Set rngStart = sheet.Cells(sheet.Rows.Count,1).End(-4162).Offset(1, 0)
Set rngCurrent = rngStart
While fMails.Items.Count > 0
'aktuelle Mail
Set mail = fMails.Items(1)
'Body extrahieren
txtContent = mail.Body
' Zeilen in ein Array schreiben
arrLines = Split(txtContent, vbNewLine, -1, vbTextCompare)
' Zeilen den Variablen zuweisen
txtStatus = arrLines(1)
txtMessage = arrLines(2)
txtTime = Trim(Split(arrLines(3), ":", 2, vbTextCompare)(1))
txtMachine = arrLines(4)
txtSN = arrLines(5)
txtLocation = arrLines(6)
txtIP = arrLines(7)
txtCountTotal = Trim(Split(arrLines(8), ":", 2, vbTextCompare)(1))
txtCountColor = Trim(Split(arrLines(9), ":", 2, vbTextCompare)(1))
'Setze Werte im Sheet
With rngCurrent
.Value = txtStatus
.Offset(0, 1).Value = txtMessage
.Offset(0, 2).Value = txtTime
.Offset(0, 3).Value = txtMachine
.Offset(0, 4).Value = txtSN
.Offset(0, 5).Value = txtLocation
.Offset(0, 6).Value = txtIP
.Offset(0, 7).Value = txtCountTotal
.Offset(0, 8).Value = txtCountColor
End With
'Excel Zeile eins nach unten verschieben
Set rngCurrent = rngCurrent.Offset(1, 0)
' Mail in den 'Erledigt' Ordner verschieben
mail.Move fErledigt
Wend
'Workbook speichern
wb.Save
'Excel anzeigen
objExcel.Visible = True
objExcel.DisplayAlerts = True
Else
MsgBox "Keine Mails zum Bearbeiten im Ordner", vbExclamation
End If
Set objExcel = Nothing
Set wb = Nothing
Set sheet = Nothing
Set mail = Nothing
End Sub
Hoffe das bringt dich erst mal weiter...
- edit 31.03.2015 - Fehler in Zeile 25 korrigiert
Grüße Uwe
Falls der Beitrag gefällt, seid so nett und unterstützt mich durch eine kleine Spende / If you like my contribution please support me and donate
Yip, kein Problem ...
Viel Erfolg ...
Grüße Uwe
mal überflogen und glaube das dies genau das ist was ich brauche. Werde mich gleich mal beimachen und den Code anpassen und
dann testen.
Aber schon mal vielen Dank.
zur Info habe es gerade nochmal etwas optimiert umgeschrieben ...dann testen.
Aber schon mal vielen Dank.
Viel Erfolg ...
Grüße Uwe
Zitat von @Gundelputz:
komme schon nicht über die deklarierung
Dim fMails As Folder
Fehlermeldung: "Benutzerdefinierter Typ nicht definiert"
wo führst du das ganze denn aus ? in Outlook ? Das Script ist für die Ausführung innerhalb von Outlook angelegt... wenn es ein VBS werden soll oder du es in Excel nutzen willst muss man es umschreiben.komme schon nicht über die deklarierung
Dim fMails As Folder
Fehlermeldung: "Benutzerdefinierter Typ nicht definiert"
Zitat von @Gundelputz:
In Excel.
Habe in outlook noch nie mit vba gearbeitet. hört sich aber interssant an und interessiert mich brennent. Leider weiss ich nicht wie unser Outlookadmin dazu steht.
In Excel.
Habe in outlook noch nie mit vba gearbeitet. hört sich aber interssant an und interessiert mich brennent. Leider weiss ich nicht wie unser Outlookadmin dazu steht.
habs dir mal an Excel angepasst (zur Verwendung in dem Excelfile wo auch die Daten landen, Formatierung siehe Grafik von oben):
Sub ExtractMailInfo()
Dim fMails As Object, mail As Object, txtContent As String, arrLines As Variant, objExcel As Object, wb As Object, sheet As Object, rngStart As Object, rngCurrent As Object, objOL As Object, fErledigt as Object, txtStatus as String, txtTime as String, txtMessage as String, txtMachine as String, txtSN as String, txtIP as String, txtLocation as String, txtCountTotal as String, txtCountColor as String
' Outlook Object erzeugen
Set objOL = CreateObject("Outlook.Application")
'Ordner in Outlook referenzieren
Set fMails = objOL.Session.Stores.Item("user@domain.net").GetRootFolder.Folders.Item("Druckeralerts")
'Unterordner referenzieren in den die Mails verschoben werden wenn sie bearbeitet wurden
Set fErledigt = fMails.Folders("erledigt")
If fMails.Items.Count > 0 Then
'Workbook setzen
Set wb = ActiveWorkbook
'Daten kommen in erstes Worksheet
Set sheet = wb.Worksheets(1)
'Startzelle in Spalte A ermitteln
Set rngStart = sheet.Cells(Rows.Count,1).End(xlUp).Offset(1, 0)
Set rngCurrent = rngStart
While fMails.Items.Count > 0
'aktuelle Mail
Set mail = fMails.Items(1)
'Body extrahieren
txtContent = mail.Body
' Zeilen in ein Array schreiben
arrLines = Split(txtContent, vbNewLine, -1, vbTextCompare)
' Zeilen den Variablen zuweisen
txtStatus = arrLines(1)
txtMessage = arrLines(2)
txtTime = Trim(Split(arrLines(3), ":", 2, vbTextCompare)(1))
txtMachine = arrLines(4)
txtSN = arrLines(5)
txtLocation = arrLines(6)
txtIP = arrLines(7)
txtCountTotal = Trim(Split(arrLines(8), ":", 2, vbTextCompare)(1))
txtCountColor = Trim(Split(arrLines(9), ":", 2, vbTextCompare)(1))
'Setze Werte im Sheet
rngCurrent.Value = txtStatus
rngCurrent.Offset(0, 1).Value = txtMessage
rngCurrent.Offset(0, 2).Value = txtTime
rngCurrent.Offset(0, 3).Value = txtMachine
rngCurrent.Offset(0, 4).Value = txtSN
rngCurrent.Offset(0, 5).Value = txtLocation
rngCurrent.Offset(0, 6).Value = txtIP
rngCurrent.Offset(0, 7).Value = txtCountTotal
rngCurrent.Offset(0, 8).Value = txtCountColor
'Excel Zeile eins nach unten verschieben
Set rngCurrent = rngCurrent.Offset(1, 0)
' Mail in den 'Erledigt' Ordner verschieben
mail.Move fErledigt
Wend
'Workbook speichern
wb.Save
Else
MsgBox "Keine Mails zum Bearbeiten im Ordner", vbExclamation
End If
Set objOL = Nothing
Set wb = Nothing
Set sheet = Nothing
Set mail = Nothing
End Sub
Fingerübung ...
Bin dafür das dein Chef dein Gehalt erhöht.
Gott sein Dank bin ich da mein eigener Chef - ich leite es aber ans Oberstübchen weiter mal sehen was das Konto so hergibt...
Dein Excel-Makro ist einfach klasse.
Ich habe nur eine kurze Frage. Wie kann ich noch einen Ordner "tiefer" gehen, als nur auf die Ordner unterhalb des Root-Ordners zuzugreifen?
Besteht denn auch die Möglichkeit E-Mails die alle in einem Ordner liegen auszulesen, auch wenn der Body unterschiedlich lang ist?
Vielleicht hast du ja einen Vorschlag oder ein Schlagwort damit ich das Makro anpassen könnte.
Schon einmal Danke
Ich habe nur eine kurze Frage. Wie kann ich noch einen Ordner "tiefer" gehen, als nur auf die Ordner unterhalb des Root-Ordners zuzugreifen?
Besteht denn auch die Möglichkeit E-Mails die alle in einem Ordner liegen auszulesen, auch wenn der Body unterschiedlich lang ist?
Vielleicht hast du ja einen Vorschlag oder ein Schlagwort damit ich das Makro anpassen könnte.
Schon einmal Danke
Hallo Acht85,
Ich machs mal an zwei Beispielen klar:
Das hier selektiert einen Ordner namens Druckeralerts welcher direkt auf Root-Ebene des Stores liegt
Das hier einen Unterordner des Posteingangs mit dem Namen Test
usw., jetzt sollte das Prinzip klar sein. Jeder Ordner hat eine Folders-Eigenschaft welche die Unterordner eines Ordners enthält.
Grüße Uwe
Zitat von @Acht85:
Dein Excel-Makro ist einfach klasse.
Ich habe nur eine kurze Frage. Wie kann ich noch einen Ordner "tiefer" gehen, als nur auf die Ordner unterhalb des
Root-Ordners zuzugreifen?
Welchen Root-Ordner meinst du ? Per Definition ist der Root-Ordner der oberste Store-Knoten.Dein Excel-Makro ist einfach klasse.
Ich habe nur eine kurze Frage. Wie kann ich noch einen Ordner "tiefer" gehen, als nur auf die Ordner unterhalb des
Root-Ordners zuzugreifen?
Ich machs mal an zwei Beispielen klar:
Das hier selektiert einen Ordner namens Druckeralerts welcher direkt auf Root-Ebene des Stores liegt
Set fMails = objOL.Session.Stores.Item("user@domain.net").GetRootFolder.Folders.Item("Druckeralerts")
Set fMails = objOL.Session.Stores.Item("user@domain.net").GetRootFolder.Folders.Item("Posteingang") .Folders.Item("Test")
Besteht denn auch die Möglichkeit E-Mails die alle in einem Ordner liegen auszulesen, auch wenn der Body unterschiedlich lang ist?
Das musst du mal genauer Beschreiben, kann ich so nicht interprtieren. Wenn man mit Regular-Expressions arbeitet kann man so ziemlich alles aus dem Body extrahieren. Man muss nur ein einigermaßen nachvollziehbares Muster der zu extrahierenden Daten habe.Grüße Uwe
Hallo Uwe,
das mit dem Unterordner innerhalb des Posteingang hat super funktioniert. Einfach genial. Genau das habe ich gemeint, Danke!!!
Nun zu meiner anderen Fragestellung. Ich habe mehrere E-Mails in einem Ordner, bei denen der Body verschieden lang ist. Ich hatte das Makro erweitert, damit auch immer mehr Zeilen aus der E-Mail in Excel übertragen werden. Mittlerweile bin ich bei ca. 20 Zeilen, die ausgelesen werden sollen.
Eine der E-Mails ist aber nur 19 Zeilen lang und deshalb bekomme ich nun die Fehlermeldung "Laufzeitfehler 9: Index außerhalb des gültigen Bereichs".
Ich hoffe, dass ich mein Problem etwas genauer beschreiben konnte.
Grüße
Acht85
das mit dem Unterordner innerhalb des Posteingang hat super funktioniert. Einfach genial. Genau das habe ich gemeint, Danke!!!
Nun zu meiner anderen Fragestellung. Ich habe mehrere E-Mails in einem Ordner, bei denen der Body verschieden lang ist. Ich hatte das Makro erweitert, damit auch immer mehr Zeilen aus der E-Mail in Excel übertragen werden. Mittlerweile bin ich bei ca. 20 Zeilen, die ausgelesen werden sollen.
Eine der E-Mails ist aber nur 19 Zeilen lang und deshalb bekomme ich nun die Fehlermeldung "Laufzeitfehler 9: Index außerhalb des gültigen Bereichs".
Ich hoffe, dass ich mein Problem etwas genauer beschreiben konnte.
Grüße
Acht85
Zitat von @Acht85:
das Makro erweitert, damit auch immer mehr Zeilen aus der E-Mail in Excel übertragen werden. Mittlerweile bin ich bei ca. 20
Zeilen, die ausgelesen werden sollen.
Eine der E-Mails ist aber nur 19 Zeilen lang und deshalb bekomme ich nun die Fehlermeldung "Laufzeitfehler 9: Index
außerhalb des gültigen Bereichs".
Das ist kein Problem, folgender Befehl liefert die Anzahl der Elemente im Array (Bitte beachten das Array ist 0-Basiert, d.h. die Anzahl ist immer um eins kleiner als die Anzahl der Zeilendas Makro erweitert, damit auch immer mehr Zeilen aus der E-Mail in Excel übertragen werden. Mittlerweile bin ich bei ca. 20
Zeilen, die ausgelesen werden sollen.
Eine der E-Mails ist aber nur 19 Zeilen lang und deshalb bekomme ich nun die Fehlermeldung "Laufzeitfehler 9: Index
außerhalb des gültigen Bereichs".
UBound(arrLines)
<code >
if UBound(arrLines) > 19 then
' Nachricht hat mehr als 19 Zeilen
end if
oder direkt mit einer Schleife nur alle vorhandenen Zeilen durchlaufen:
for i = 0 to UBound(arrLines)
' Zeile verarbeiten, als Beispiel nur ausgeben
Msgbox arrLines(i)
'.....
Next
Vielen Dank für deine Ansätze, ich habe die Schleife eingebaut und in der Message Box werden nun auch tatsächlich alle Zeilen durchlaufen. Leider habe ich meine Probleme damit die Schleife nun so in das Script einzubauen, dass alle Zeilen in Excel geschrieben werden. :o( Das blicke ich noch nicht so ganz, da muss ich noch einiges rum probieren.
Seit dem ich jetzt die for-Schleife drin habe, bekomme ich direkt nach dem Ausführen eine Meldung "Ein Programm versucht auf ihr Outlook Adressinformationen zuzugreifen...." Diese Meldung muss ich mit "Erteilen" für jede einzelnen E-Mail bestätigen. Hast du vielleicht eine Ahnung, ob man diese Abfrage umgehen kann bzw. beim Ausführen immer den Zugriff erteilen will.
Ich weiß, dass ist ne Menge Zeug das ich dich hier Frage, aber leider war ich schon so lange auf der Suche nach solch einem Script das ich mich an dich "klammer".
Danke schon einmal für all deine Hilfe.
Viele Grüße
Acht85
Seit dem ich jetzt die for-Schleife drin habe, bekomme ich direkt nach dem Ausführen eine Meldung "Ein Programm versucht auf ihr Outlook Adressinformationen zuzugreifen...." Diese Meldung muss ich mit "Erteilen" für jede einzelnen E-Mail bestätigen. Hast du vielleicht eine Ahnung, ob man diese Abfrage umgehen kann bzw. beim Ausführen immer den Zugriff erteilen will.
Ich weiß, dass ist ne Menge Zeug das ich dich hier Frage, aber leider war ich schon so lange auf der Suche nach solch einem Script das ich mich an dich "klammer".
Danke schon einmal für all deine Hilfe.
Viele Grüße
Acht85
Zitat von @Acht85:
Leider habe ich meine Probleme damit die Schleife nun so in das Script einzubauen, dass alle Zeilen in
Excel geschrieben werden. :o( Das blicke ich noch nicht so ganz, da muss ich noch einiges rum probieren.
Du musst Zeile 60 des obigen Scripts in deine Schleife verschiebenLeider habe ich meine Probleme damit die Schleife nun so in das Script einzubauen, dass alle Zeilen in
Excel geschrieben werden. :o( Das blicke ich noch nicht so ganz, da muss ich noch einiges rum probieren.
Set rngCurrent = rngCurrent.Offset(1, 0)
Seit dem ich jetzt die for-Schleife drin habe, bekomme ich direkt nach dem Ausführen eine Meldung "Ein Programm versucht
auf ihr Outlook Adressinformationen zuzugreifen...." Diese Meldung muss ich mit "Erteilen" für jede einzelnen
E-Mail bestätigen. Hast du vielleicht eine Ahnung, ob man diese Abfrage umgehen kann bzw. beim Ausführen immer den
Zugriff erteilen will.
Siehe: VBA - automatischer Mailversand (Sicherheitsprüfung umgehen)auf ihr Outlook Adressinformationen zuzugreifen...." Diese Meldung muss ich mit "Erteilen" für jede einzelnen
E-Mail bestätigen. Hast du vielleicht eine Ahnung, ob man diese Abfrage umgehen kann bzw. beim Ausführen immer den
Zugriff erteilen will.
Grüße Uwe
So, die Fehlermeldung ist nun verschwunden und es werden alle Zeilen aus den E-Mails in Excel geschrieben. :o)
Meine Schleife sieht nun so aus:
For i = 0 To UBound(arrLines)
' Zeile verarbeiten
rngCurrent.Value = arrLines(i)
Set rngCurrent = rngCurrent.Offset(1, 0)
Next
Doch leider werden jetzt alle E-Mail Zeilen in Spalte A geschrieben. :o( Vorher wurden dich die Zeilen nebeneinander geschrieben und eine neue E-Mail bekam eine neue Zeile. Wenn ich Offset auf (0,1) werden alle E-Mails in nebeneinander in eine Zeile geschrieben. Ich stehe gerade echt auf dem Schlauch...
Meine Schleife sieht nun so aus:
For i = 0 To UBound(arrLines)
' Zeile verarbeiten
rngCurrent.Value = arrLines(i)
Set rngCurrent = rngCurrent.Offset(1, 0)
Next
Doch leider werden jetzt alle E-Mail Zeilen in Spalte A geschrieben. :o( Vorher wurden dich die Zeilen nebeneinander geschrieben und eine neue E-Mail bekam eine neue Zeile. Wenn ich Offset auf (0,1) werden alle E-Mails in nebeneinander in eine Zeile geschrieben. Ich stehe gerade echt auf dem Schlauch...
Zitat von @Acht85:
Doch leider werden jetzt alle E-Mail Zeilen in Spalte A geschrieben. :o( Vorher wurden dich die Zeilen nebeneinander geschrieben
und eine neue E-Mail bekam eine neue Zeile. Wenn ich Offset auf (0,1) werden alle E-Mails in nebeneinander in eine Zeile
geschrieben. Ich stehe gerade echt auf dem Schlauch...
Wie du in meinem Code oben sehen kannst wird mit dem Offset festgelegt in welcher Spalte welcher Wert eingetragen wird:Doch leider werden jetzt alle E-Mail Zeilen in Spalte A geschrieben. :o( Vorher wurden dich die Zeilen nebeneinander geschrieben
und eine neue E-Mail bekam eine neue Zeile. Wenn ich Offset auf (0,1) werden alle E-Mails in nebeneinander in eine Zeile
geschrieben. Ich stehe gerade echt auf dem Schlauch...
rngCurrent selber ist immer die Spalte A, wenn du nun Spalte B der aktuellen Zeile ansprechen willst gibst du einen Spaltenoffset von 1 an (zweiter Parameter)
rngCurrent.Offset(0,1).Value = "Wert für Spalte B"
rngCurrent.Offset(0,2).Value = "Wert für Spalte C"
rngCurrent.Offset(0,3).Value = "Wert für Spalte D"
' usw...
Was bei dir zum trennen der Spalten in der Nachricht verwendet werden kann, kennst leider nur du da ich den Inhalt der Nachricht nicht kenne.
Bitte weitere Kommentare via PM damit wir hier den Thread und den TO nicht vollsauen. Danke.
Grüße Uwe
Zitat von @kohlerqh:
Jetzt bekomme ich eine Fehlermeldung "Fehler beim Kompilieren: Variable nicht definiert", Cursor spring dabei auf Zeile
11 fErledigt.
was ahbe ich falsch gemacht?
Hallo kohlerqh,Jetzt bekomme ich eine Fehlermeldung "Fehler beim Kompilieren: Variable nicht definiert", Cursor spring dabei auf Zeile
11 fErledigt.
was ahbe ich falsch gemacht?
lösch mal oberhalb des Codes die Zeile Option Explicit, oder kopiere den Code nochmal, hatte eine Dim-Deklaration der Variable fErledigt as Object vergessen ... sorry, ist oben korrigiert.
Grüße Uwe
Zitat von @kohlerqh:
Danke für die schnelle Antwort. Wenn ich die Zeile Option Explicit lösche wirft er mir einen Laufzeitfehler raus
Laufzeitfehler '-2147221233 (8004010f)'
Dann hast du den Code nicht komplett an deine Umgebung angepasst, ohne Anpassungen läuft der Code natürlich nicht out-of-the-box !Danke für die schnelle Antwort. Wenn ich die Zeile Option Explicit lösche wirft er mir einen Laufzeitfehler raus
Laufzeitfehler '-2147221233 (8004010f)'
Bitte weitere Fragen via Personal Message sonst müllen wir den Thread hier mit VBA-Anfängerfragen zu ...Danke.
Hallo,
auch für mich war der Code schon sehr hilfreich.
Nun habe ich nur das Problem, dass ich nur die Mails mit einem bestimmten Betreff aus dem Posteingang auslesen und in einen Unterordner verschieben möchte. Hintergrund ist, dass es sich um einen Gemeinschaftspostfach handelt, auf das keine Filterregeln angewendet werden dürfen.
Gibt es da eine Möglichkeit die Ausleseschleife auf die Mails mit bestimmten Betreff zu beschränken?
Vielen Dank!
Kaspar
auch für mich war der Code schon sehr hilfreich.
Nun habe ich nur das Problem, dass ich nur die Mails mit einem bestimmten Betreff aus dem Posteingang auslesen und in einen Unterordner verschieben möchte. Hintergrund ist, dass es sich um einen Gemeinschaftspostfach handelt, auf das keine Filterregeln angewendet werden dürfen.
Gibt es da eine Möglichkeit die Ausleseschleife auf die Mails mit bestimmten Betreff zu beschränken?
Vielen Dank!
Kaspar
Hallo Kaspar, Willkommen auf Administrator.de!
Auf Basis des obigen Codes sähe das dann so aus
Im Beispiel wird mit like gesucht (Zeile 28), d.h. das was vor und nach dem String kommt kann dann variieren.
Grüße Uwe
Falls der Beitrag gefällt, seid so nett und unterstützt mich durch eine kleine Spende / If you like my contribution please support me and donate
Zitat von @KasparG:
Gibt es da eine Möglichkeit die Ausleseschleife auf die Mails mit bestimmten Betreff zu beschränken?
Selbstverständlich ist das möglich Gibt es da eine Möglichkeit die Ausleseschleife auf die Mails mit bestimmten Betreff zu beschränken?
Auf Basis des obigen Codes sähe das dann so aus
Sub ExtractMailInfo()
Dim fMails As Object, mail As Object, txtContent As String, arrLines As Variant, objExcel As Object, wb As Object, sheet As Object, rngStart As Object, rngCurrent As Object, objOL As Object, fErledigt As Object, colMove As New Collection, strSubject As String, mailItems As Object
' Outlook Object erzeugen
Set objOL = CreateObject("Outlook.Application")
'Ordner in Outlook referenzieren
Set fMails = objOL.Session.Stores.Item("user@domain.det").GetRootFolder.Folders.Item("Druckeralerts")
'Unterordner referenzieren in den die Mails verschoben werden wenn sie bearbeitet wurden
Set fErledigt = fMails.Folders("erledigt")
'Subject nach dem gefiltert wird
strSubject = "Dein Subject das du suchst"
If fMails.Items.Count > 0 Then
'Workbook setzen
Set wb = ActiveWorkbook
'Daten kommen in erstes Worksheet
Set sheet = wb.Worksheets(1)
'Startzelle in Spalte A ermitteln
Set rngStart = sheet.Cells(Rows.Count, 1).End(xlUp).Offset(1, 0)
Set rngCurrent = rngStart
'Mails nach Subject filtern
Set mailItems = fMails.Items.Restrict("@SQL=""http://schemas.microsoft.com/mapi/proptag/0x0037001f"" like '%" & strSubject & "%'")
If Not mailItems Is Nothing Then
For Each mail In mailItems
'Body extrahieren
txtContent = mail.Body
'Zeilen in ein Array schreiben
arrLines = Split(txtContent, vbNewLine, -1, vbTextCompare)
'Zeilen den Variablen zuweisen
txtStatus = arrLines(1)
txtMessage = arrLines(2)
txtTime = Trim(Split(arrLines(3), ":", 2, vbTextCompare)(1))
txtMachine = arrLines(4)
txtSN = arrLines(5)
txtLocation = arrLines(6)
txtIP = arrLines(7)
txtCountTotal = Trim(Split(arrLines(8), ":", 2, vbTextCompare)(1))
txtCountColor = Trim(Split(arrLines(9), ":", 2, vbTextCompare)(1))
'Setze Werte im Sheet
rngCurrent.Value = txtStatus
rngCurrent.Offset(0, 1).Value = txtMessage
rngCurrent.Offset(0, 2).Value = txtTime
rngCurrent.Offset(0, 3).Value = txtMachine
rngCurrent.Offset(0, 4).Value = txtSN
rngCurrent.Offset(0, 5).Value = txtLocation
rngCurrent.Offset(0, 6).Value = txtIP
rngCurrent.Offset(0, 7).Value = txtCountTotal
rngCurrent.Offset(0, 8).Value = txtCountColor
'Excel Zeile eins nach unten verschieben
Set rngCurrent = rngCurrent.Offset(1, 0)
' Mail zur Collection hinzufügen
colMove.Add mail
Next
'Mails verschieben
For Each m In colMove
m.Move fErledigt
Next
End If
'Workbook speichern
'wb.Save
Else
MsgBox "Keine Mails zum Bearbeiten im Ordner", vbExclamation
End If
Set objOL = Nothing
Set wb = Nothing
Set sheet = Nothing
Set mail = Nothing
Set mailItems = Nothing
set colMail = Nothing
End Sub
Grüße Uwe
Falls der Beitrag gefällt, seid so nett und unterstützt mich durch eine kleine Spende / If you like my contribution please support me and donate
Hey Uwe,
wie schon geschrieben läuft der Code einwandfrei. Nun habe ich aber noch ein klitzekleines Problem. Die Mail, die den entsprechenden Betreff enthalten werden in scheinbar zufälliger Reihenfolge abgearbeitet. Im Ideal würde aber erst, die älteste Mail in das Worksheet geschrieben, dann die zweitälteste ...
Geht sowas?
Vielen Dank und Gruß
Kaspar
wie schon geschrieben läuft der Code einwandfrei. Nun habe ich aber noch ein klitzekleines Problem. Die Mail, die den entsprechenden Betreff enthalten werden in scheinbar zufälliger Reihenfolge abgearbeitet. Im Ideal würde aber erst, die älteste Mail in das Worksheet geschrieben, dann die zweitälteste ...
Geht sowas?
Vielen Dank und Gruß
Kaspar
Zitat von @KasparG:
Hey Uwe,
wie schon geschrieben läuft der Code einwandfrei. Nun habe ich aber noch ein klitzekleines Problem. Die Mail, die den
entsprechenden Betreff enthalten werden in scheinbar zufälliger Reihenfolge abgearbeitet. Im Ideal würde aber erst, die
älteste Mail in das Worksheet geschrieben, dann die zweitälteste ...
Geht sowas?
Ja, du fügst zwischen Zeile 30 und 31 des Codes noch folgende Zeile ein:Hey Uwe,
wie schon geschrieben läuft der Code einwandfrei. Nun habe ich aber noch ein klitzekleines Problem. Die Mail, die den
entsprechenden Betreff enthalten werden in scheinbar zufälliger Reihenfolge abgearbeitet. Im Ideal würde aber erst, die
älteste Mail in das Worksheet geschrieben, dann die zweitälteste ...
Geht sowas?
mailItems.Sort "[ReceivedTime]",False
Hallo colinardo, vielen Dank für Dein gut dokumentiertes Script. Weitgehend verstehe ich es, aber ich habe Probleme damit, es auf meinen Anwendungsfall zu übertragen. Meine Daten liegen leider nicht hübsch in den Zeilen separiert vor, sondern sie verstecken sich im Fließtext:
0 Guten Tag, xxx yyy!
1
2 Die Batterieaufladung Ihres Fahrzeuges mit der Fahrgestellnummer VF1AGVYA123456789 begann an 25/12/2014 23:57.
3 Der aktuelle Batterie-Ladestatus beträgt 80 %, was einer geschätzten Fahrleistung von 103.0 km entspricht.
4
5 Bis bald im Renault-Portal.
6 Ihr Renault-Team Sie können im Renault-Portal einstellen, ob Sie solche E-Mail-Benachrichtigungen erhalten.
7 Bitte antworten Sie nicht auf diese E-Mail. Dieses Postfach wird nur für den Versand verwendet – wir würden Ihre Antwort nicht erhalten. Wenn Sie Hilfe benötigen, wenden Sie sich bitte an den Renault-Kundendienst.
Die Daten, die mich interessieren liegen in den Zeilen 2 und 3: Fahrgestellnummer, Datum-Uhrzeit, Batterieladestatus (ohne das %), Fahrleistung
(ohne Punkt und Nachkomma).
Die Mail wird als HTML versendet und hat noch einige Grafiken und auch eine Tabelle drin. Die Zeilennummerierung habe ich bekommen, nachdem ich die Mail von Hand in TXT umgewandelt habe.
Bin leider kein VBA-Profi, wird wohl ne Text-Handling-Frage sein.
Danke für die Hilfe!
0 Guten Tag, xxx yyy!
1
2 Die Batterieaufladung Ihres Fahrzeuges mit der Fahrgestellnummer VF1AGVYA123456789 begann an 25/12/2014 23:57.
3 Der aktuelle Batterie-Ladestatus beträgt 80 %, was einer geschätzten Fahrleistung von 103.0 km entspricht.
4
5 Bis bald im Renault-Portal.
6 Ihr Renault-Team Sie können im Renault-Portal einstellen, ob Sie solche E-Mail-Benachrichtigungen erhalten.
7 Bitte antworten Sie nicht auf diese E-Mail. Dieses Postfach wird nur für den Versand verwendet – wir würden Ihre Antwort nicht erhalten. Wenn Sie Hilfe benötigen, wenden Sie sich bitte an den Renault-Kundendienst.
Die Daten, die mich interessieren liegen in den Zeilen 2 und 3: Fahrgestellnummer, Datum-Uhrzeit, Batterieladestatus (ohne das %), Fahrleistung
(ohne Punkt und Nachkomma).
Die Mail wird als HTML versendet und hat noch einige Grafiken und auch eine Tabelle drin. Die Zeilennummerierung habe ich bekommen, nachdem ich die Mail von Hand in TXT umgewandelt habe.
Bin leider kein VBA-Profi, wird wohl ne Text-Handling-Frage sein.
Danke für die Hilfe!
Hallo tangokom, Willkommen auf Administrator.de!
Beispiel für dein Textfragment und deinen gewünschten Daten
Für eine Dokumentation zu Regular Expressions siehe das Regular Expressions Tutorial
Weitere Hilfe kannst du mich gerne via PM anschreiben damit der Thread hier nicht zugemüllt und die anderen User nicht weiter belästigt werden. Danke.
Grüße Uwe
Die Daten, die mich interessieren liegen in den Zeilen 2 und 3: Fahrgestellnummer, Datum-Uhrzeit, Batterieladestatus (ohne das %), Fahrleistung (ohne Punkt und Nachkomma).
Für solche Fälle gibt es Regular Expressions mit der sich solche Textfragmente gezielt extrahieren lassen:Beispiel für dein Textfragment und deinen gewünschten Daten
Set regex = CreateObject("vbscript.regexp")
regex.Global = False: regex.IgnoreCase = True: regex.MultiLine = False
regex.Pattern = "Fahrgestellnummer ([^\s]*) begann an ([^.]*)[\s\S]*?Batterie-Ladestatus beträgt (\d+)[\s\S]*? Fahrleistung von (\d+)"
set matches = regex.Execute(txtContent)
if matches.count > 0 then
strFarhgestellnummer = matches(0).submatches(0)
strDatum = matches(0).submatches(1)
strBatterieLadestatus = matches(0).submatches(2)
strFahrleistung = matches(0).submatches(3)
End if
Weitere Hilfe kannst du mich gerne via PM anschreiben damit der Thread hier nicht zugemüllt und die anderen User nicht weiter belästigt werden. Danke.
Grüße Uwe
WICHTIGER HINWEIS FÜR KÜNFTIGE FRAGESTELLER
Für alle zukünftigen Fragesteller die eine Anpassung des Scripts an Ihre persönliche Situation benötigen, bitte ich sich direkt an mich über eine persönliche Nachricht zu wenden. Dann können die Details und ein Preis für eine Anpassung verhandelt werden. Danke.Weitere Fragen in diesem Thread zu persönlichen Anpassungen werden von mir nicht beantwortet..
Grüße @colinardo
Hallo Zusammen,
habe mich hier soeben eingetragen, da ich hoffe, daß ihr mein Problem am schnellsten lösen könnt.
Da meine Zielsetzung fast identisch ist zu der hier aufgelisteten und ich schon die Hoffnung hatte, es ginge alles jetzt ganz schnell, hänge ich mein Idee hier mal dran:
Unter Office 2007 will ich
die Email die ein bestimmter User mit einer feststehenden Beschreibung bekommt erkennen - findet täglich statt
die Email hat einen Anhang
der Anhang (Zip Datei) soll genommen werden, entzippt werden - dann ist es eine Textdatei - und in die erste Tabelle einer Exceldatei eingelesen werden 1 zu 1 keine Änderungen o.ä.
Email in einen anderen Ordner schieben -> z.B. Gelöschte Dateien
Es kann, muß aber keine Zwischenspeicherung der Zip/TXT Datei stattfinden
Die Mail kann, muß aber nicht als gelesen gekennzeichnet werden
Die Version von Colinardo sieht super aus und ich habe sie entsprechend meiner Bedürfnisse angefangen zu verändern, hänge aber schon in Zeile 8
Set fMails = objOL.Session.Stores.Item("user@domain.det").GetRootFolder.Folders.Item("Druckeralerts") <- habe hier den Empfängeruser eingetragen und Druckeralerts ist Posteingang.
mit dem Fehler
Laufzeitfehler '-2147221233(8004010f)':
Der Vorgang konnte nicht ausgeführt werden. Ein Objekt wurde nicht gefunden.
!! Ach ja: die Mail wird in einem Unter- Unterordner abgelegt. Die dazu hier stehende Syntax wird von meinem System ebenfalls bemeckert. Sch...eibenkleister !!!
Liegt das an unterschiedlichen Office Versionen?
Hoffe auf Eure Hilfe und sage schon mal Danke im Voraus.
habe mich hier soeben eingetragen, da ich hoffe, daß ihr mein Problem am schnellsten lösen könnt.
Da meine Zielsetzung fast identisch ist zu der hier aufgelisteten und ich schon die Hoffnung hatte, es ginge alles jetzt ganz schnell, hänge ich mein Idee hier mal dran:
Unter Office 2007 will ich
die Email die ein bestimmter User mit einer feststehenden Beschreibung bekommt erkennen - findet täglich statt
die Email hat einen Anhang
der Anhang (Zip Datei) soll genommen werden, entzippt werden - dann ist es eine Textdatei - und in die erste Tabelle einer Exceldatei eingelesen werden 1 zu 1 keine Änderungen o.ä.
Email in einen anderen Ordner schieben -> z.B. Gelöschte Dateien
Es kann, muß aber keine Zwischenspeicherung der Zip/TXT Datei stattfinden
Die Mail kann, muß aber nicht als gelesen gekennzeichnet werden
Die Version von Colinardo sieht super aus und ich habe sie entsprechend meiner Bedürfnisse angefangen zu verändern, hänge aber schon in Zeile 8
Set fMails = objOL.Session.Stores.Item("user@domain.det").GetRootFolder.Folders.Item("Druckeralerts") <- habe hier den Empfängeruser eingetragen und Druckeralerts ist Posteingang.
mit dem Fehler
Laufzeitfehler '-2147221233(8004010f)':
Der Vorgang konnte nicht ausgeführt werden. Ein Objekt wurde nicht gefunden.
!! Ach ja: die Mail wird in einem Unter- Unterordner abgelegt. Die dazu hier stehende Syntax wird von meinem System ebenfalls bemeckert. Sch...eibenkleister !!!
Liegt das an unterschiedlichen Office Versionen?
Hoffe auf Eure Hilfe und sage schon mal Danke im Voraus.
Hallo Liebe Programmierer,
habe den Code so übernommen. Funktionieren tut es auch soweit sehr gut, allerdings müssen paar Sachen nach meinen Bedürfnissen angepasst werden.
Benötige einen VBA Code mit dem ich meine Mails in Excel importieren kann.
1. Den Code oben habe ich soweit angepasst, nur möchte ich nun, dass in der Zeile 29 meiner Mail nur das 4 Wort (ist eine Zahl) übernommen wird in Excel. Mit Trim(Split bekomme ich es irgendwie nicht hin.
2. Bei der Übernahme der Zeile 30 (E-Mail-Adresse) wird in Excel dieser Text (E-Mail: HYPERLINK "mailto:test@gmx.de"test@gmx.de) eingetragen. Hier soll nur die Mail Adresse übertragen werden.
3. letzte Zelle in der Arbeitsmappe-Tabelle8 soll das heutige Datum eingetragen werden.
4. Es sollen nur die Mails importiert werden die den Absender test@gmx.de haben.
Hoffe ich konnte mich ordentlich Ausdrücken. bin leider kein Fachmann des VBA´s.
habe den Code so übernommen. Funktionieren tut es auch soweit sehr gut, allerdings müssen paar Sachen nach meinen Bedürfnissen angepasst werden.
Benötige einen VBA Code mit dem ich meine Mails in Excel importieren kann.
1. Den Code oben habe ich soweit angepasst, nur möchte ich nun, dass in der Zeile 29 meiner Mail nur das 4 Wort (ist eine Zahl) übernommen wird in Excel. Mit Trim(Split bekomme ich es irgendwie nicht hin.
2. Bei der Übernahme der Zeile 30 (E-Mail-Adresse) wird in Excel dieser Text (E-Mail: HYPERLINK "mailto:test@gmx.de"test@gmx.de) eingetragen. Hier soll nur die Mail Adresse übertragen werden.
3. letzte Zelle in der Arbeitsmappe-Tabelle8 soll das heutige Datum eingetragen werden.
4. Es sollen nur die Mails importiert werden die den Absender test@gmx.de haben.
Hoffe ich konnte mich ordentlich Ausdrücken. bin leider kein Fachmann des VBA´s.
Hallo colinardo,
bei der Suche nach einer Lösung für ein ähnlich gelagertes Problem bin ich auf dieses Forum aufmerksam geworden.
Bevor ich ins Detail gehe, würde ich gerne fragen, ob das von Dir erstellte Makro auch auf das komische mail-Programm
DAVID (statt Outlook) anpassbar wäre..
Ich freue mich auf Dein Feedback!
Gruß!
stocki260714
bei der Suche nach einer Lösung für ein ähnlich gelagertes Problem bin ich auf dieses Forum aufmerksam geworden.
Bevor ich ins Detail gehe, würde ich gerne fragen, ob das von Dir erstellte Makro auch auf das komische mail-Programm
DAVID (statt Outlook) anpassbar wäre..
Ich freue mich auf Dein Feedback!
Gruß!
stocki260714
Servus @stocki260714,
Von DAVID habe ich k.A. und kann dir deswegen keinen Support anbieten, sorry.
Du solltest dir die Powershell-Beispiel von mir hier im Forum ansehen die direkt auf ein Postfach (via IMAP/POP) zugreifen und die Mails so direkt auslesen, ohne einen Client wie Outlook oder DAVID.
Wie z.B. E-Mail Client für Kommandozeile
Grüße Uwe
Zitat von @stocki260714:
Bevor ich ins Detail gehe, würde ich gerne fragen, ob das von Dir erstellte Makro auch auf das komische mail-Programm
DAVID (statt Outlook) anpassbar wäre..
Keine Ahnung, und wenn dann bestimmt nicht nur anpassen sondern komplett neu schreiben.Bevor ich ins Detail gehe, würde ich gerne fragen, ob das von Dir erstellte Makro auch auf das komische mail-Programm
DAVID (statt Outlook) anpassbar wäre..
Von DAVID habe ich k.A. und kann dir deswegen keinen Support anbieten, sorry.
Du solltest dir die Powershell-Beispiel von mir hier im Forum ansehen die direkt auf ein Postfach (via IMAP/POP) zugreifen und die Mails so direkt auslesen, ohne einen Client wie Outlook oder DAVID.
Wie z.B. E-Mail Client für Kommandozeile
Grüße Uwe
Hallo Uwe,
ich versuche auch derzeit ein solches Programm zu basteln. Ich habe bisher kaum Erfahrungen mit VBA gemacht und versuche mir gerade sehr viel anzulesen. Im Prinzip verstehe ich das Programm als solches , allerdings hapert es bei bestimmten Methoden..
Ich habe (glaube ich) alle nötigen Anpassungen vorgenommen, allerdings habe ich einen Laufzeitfehler durch die Zeile
Set fMails =Application....
Ich habe dort meinen Outlook Account ergänzt und den Unterordner XY vom Posteingang.
Die Beschreibung vom Laufzeitfehler lautet: Der versuchte Vorgang konnte nicht ausgeführt werden. Ein Objekt wurde nicht gefunden.
Woran kann das liegen? Muss ich noch bestimmte Einstellungen vornehmen?
Ich würde mich über eine Antwort sehr freuen.
Viele Grüße
Sophie
ich versuche auch derzeit ein solches Programm zu basteln. Ich habe bisher kaum Erfahrungen mit VBA gemacht und versuche mir gerade sehr viel anzulesen. Im Prinzip verstehe ich das Programm als solches , allerdings hapert es bei bestimmten Methoden..
Ich habe (glaube ich) alle nötigen Anpassungen vorgenommen, allerdings habe ich einen Laufzeitfehler durch die Zeile
Set fMails =Application....
Ich habe dort meinen Outlook Account ergänzt und den Unterordner XY vom Posteingang.
Die Beschreibung vom Laufzeitfehler lautet: Der versuchte Vorgang konnte nicht ausgeführt werden. Ein Objekt wurde nicht gefunden.
Woran kann das liegen? Muss ich noch bestimmte Einstellungen vornehmen?
Ich würde mich über eine Antwort sehr freuen.
Viele Grüße
Sophie
Hallo,
ich benötige momentan genau so ein Programm nur ohne das Verschieben von den Emails.
Wenn ich nur dein Programm probiere auszuführen, sagt er mir das "arrLines" nicht deklariert ist, nach dem deklarieren muss ich auch noch "txtStatus" bis "txtCountColor" deklarieren und danach vertragen sich die Deklarationen nicht?
ich benötige momentan genau so ein Programm nur ohne das Verschieben von den Emails.
Wenn ich nur dein Programm probiere auszuführen, sagt er mir das "arrLines" nicht deklariert ist, nach dem deklarieren muss ich auch noch "txtStatus" bis "txtCountColor" deklarieren und danach vertragen sich die Deklarationen nicht?