VBA - suche in Variablen
Hallo Gemeinschaft
ich lese mit diesem Script eine outlook mail aus
nun folgendes Problem - die Mails ändern sich zum Teil bei den Längen einzelner Zeilen
so sieht eine mail aus
hier steht unterschiedlich langer Text
dann...
Buchungsnummer: rerer454rr4
Buchungsdatum: 20.03.2023 / 21:50
Objektnummer: 4343411
Objektnummer Vermieterbereich: 43434
Objektname Webseite: Freistehendes Ferienhaus (eingezäunt) mit eigenem Grundstück dir. test K 5
Ihre Kennung: K 5
Buchungszeitraum: 01.04.2023 - 08.04.2023
Kundenname: Test Peter
Anzahl der Personen: 5
Haustier: 1
1. Größe: 30-60cm Hund
Buchungszusatz:
nun müsste ich wissen, in welchen arrays
Buchungsnummer
Ihre Kennung
Buchungszeitraum
Kundenname
Anzahl der Personen
Haustier
Buchungszusatz ob überhaupt vorhanden
ich lese mit diesem Script eine outlook mail 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, 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")
Const EXCELFILE = "c:\PrinterAlerts.xlsx"
'Ordner in Outlook referenzieren
' Set fMails = Application.Session.Stores("test@test.eu").GetRootFolder.Folders("Druckalerts")
'Ordner in Outlook referenzieren
Set fMails = objOL.Session.Stores.Item("test@test.eu").GetRootFolder.Folders.Item("Druckalerts")
'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
z1 = arrLines(1)
z2 = arrLines(2)
z3 = arrLines(3)
z4 = arrLines(4)
z5 = arrLines(5)
z6 = arrLines(6)
z7 = arrLines(7)
z8 = arrLines(8)
z9 = arrLines(9)
z10 = arrLines(10)
z11 = arrLines(11)
z12 = arrLines(12)
z13 = arrLines(13)
z14 = arrLines(14)
z15 = arrLines(15)
z16 = arrLines(16)
z17 = arrLines(17)
z18 = arrLines(18)
z19 = arrLines(19)
z20 = arrLines(20)
z21 = arrLines(21)
z22 = arrLines(22)
z23 = arrLines(23)
z24 = arrLines(24)
z25 = arrLines(25)
z26 = arrLines(26)
......... geht bis 200
nun folgendes Problem - die Mails ändern sich zum Teil bei den Längen einzelner Zeilen
so sieht eine mail aus
hier steht unterschiedlich langer Text
dann...
Buchungsnummer: rerer454rr4
Buchungsdatum: 20.03.2023 / 21:50
Objektnummer: 4343411
Objektnummer Vermieterbereich: 43434
Objektname Webseite: Freistehendes Ferienhaus (eingezäunt) mit eigenem Grundstück dir. test K 5
Ihre Kennung: K 5
Buchungszeitraum: 01.04.2023 - 08.04.2023
Kundenname: Test Peter
Anzahl der Personen: 5
Haustier: 1
1. Größe: 30-60cm Hund
Buchungszusatz:
nun müsste ich wissen, in welchen arrays
Buchungsnummer
Ihre Kennung
Buchungszeitraum
Kundenname
Anzahl der Personen
Haustier
Buchungszusatz ob überhaupt vorhanden
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 6515099651
Url: https://administrator.de/forum/vba-suche-in-variablen-6515099651.html
Ausgedruckt am: 22.12.2024 um 11:12 Uhr
19 Kommentare
Neuester Kommentar
Nimm Regular Expressions , dann bist du nicht auf Zeilen angewiesen
EMail auslesen, verschieben und mit Excel ausgelesene Daten weiterverarbeiten
EMail auslesen, verschieben und mit Excel ausgelesene Daten weiterverarbeiten
Zitat von @martenk:
verstehe nicht, wie ich es bei mir anwenden kann - ich brauche ja nur die entsprechenden werte
also z.b. K5 bei Kennung usw
verstehe nicht, wie ich es bei mir anwenden kann - ich brauche ja nur die entsprechenden werte
also z.b. K5 bei Kennung usw
Dann erteilen wir dir eine Lektion in Regex fürs Wochenende
https://danielfett.de/2006/03/20/regulaere-ausdruecke-tutorial/
Set regex = CreateObject("vbscript.regexp")
regex.Global = False: regex.IgnoreCase = True: regex.MultiLine = False
regex.Pattern = "Ihre Kennung:\s*([^\r\n]*)"
set matches = regex.Execute(txtContent)
if matches.count > 0 then
strKennung = Trim(matches(0).submatches(0))
Msgbox strKennung
End if
Array mit einer Liste von den vorangehenden Texten definieren und dann das Regex in die Schleife packen in der man über das Array itteriert, Suchbegriff im Regex dann durch Schleifen variable ersetzen.
Schöne Hausaufgabe für dich 😉, wir wollen dir den Spass ja nicht verderben..
Schöne Hausaufgabe für dich 😉, wir wollen dir den Spass ja nicht verderben..
HTML Quelltext der Mail raus ziehen
und Regex an die Tabelle anpassen fertig.
txtContent = mail.HTMLBody
Doch auch das klappt, musst den Regex halt an den Quelltext Anpassen da HTML ja aus Tags besteht und Tabellenzeilen mit <tr></tr> und Spalten mit <td></td> etc. ausgezeichnet sind. Bisschen anstrengenmusst du dich halt schon etwas. So denn ich bin dann raus.
Cheers
Cheers
Hallo,
ich meine der Regex sollte in etwa so aussehen:
Hier eine Erklärung dazu:
Ich habe es auf folgender Seite getestet:
https://regex101.com/
Hoffe es hilft dir
Beste Grüße
Somebody
ich meine der Regex sollte in etwa so aussehen:
(\d.+\d+)(?:\s(?:EUR?|€))
Hier eine Erklärung dazu:
/
(\d.+\d+)(?:\s(?:EUR?|€))
/
gm
1st Capturing Group (\d.+\d+)
\d matches a digit (equivalent to [0-9])
. matches any character (except for line terminators)
+ matches the previous token between one and unlimited times, as many times as possible, giving back as needed (greedy)
\d matches a digit (equivalent to [0-9])
+ matches the previous token between one and unlimited times, as many times as possible, giving back as needed (greedy)
Non-capturing group (?:\s(?:EUR?|€))
\s matches any whitespace character (equivalent to [\r\n\t\f\v ])
Non-capturing group (?:EUR?|€)
1st Alternative EUR?
EU matches the characters EU literally (case sensitive)
R matches the character R with index 8210 (5216 or 1228) literally (case sensitive)
? matches the previous token between zero and one times, as many times as possible, giving back as needed (greedy)
2nd Alternative €
€ matches the character € with index 836410 (20AC16 or 202548) literally (case sensitive)
Global pattern flags
g modifier: global. All matches (don't return after first match)
m modifier: multi line. Causes ^ and $ to match the begin/end of each line (not only begin/end of string)
Ich habe es auf folgender Seite getestet:
https://regex101.com/
Hoffe es hilft dir
Beste Grüße
Somebody
Hallo martenk,
ich habe den Regex jetzt noch einmal umgebaut:
Also auf der Seite funktioniert er und er gibt mir auch die Beträge aus deinem HTML Beispiel aus.
Schau mal ob er so bei dir funktioniert, falls du nicht eh schon eine anderen Lösung gefunden hast.
Grüße
Somebody
ich habe den Regex jetzt noch einmal umgebaut:
([\d,\.]+[\.,]\d\d) (EURO|Euro|EUR|€)
Also auf der Seite funktioniert er und er gibt mir auch die Beträge aus deinem HTML Beispiel aus.
Schau mal ob er so bei dir funktioniert, falls du nicht eh schon eine anderen Lösung gefunden hast.
Grüße
Somebody
Hiho,
es gibt in VBA unter der Klasse den Parameter "Global" diesen kannst du auf False setzen.
Dann sollte er nur den ersten Wert verwenden.
Global:
Set to True if you want to match all of the cases that fit our pattern in the string (in which you’re attempting to find the pattern). Set to False to if you want only the first match to be found.
Quelle: https://software-solutions-online.com/vba-regex-guide/
Grüße
Somebody
es gibt in VBA unter der Klasse den Parameter "Global" diesen kannst du auf False setzen.
Dann sollte er nur den ersten Wert verwenden.
Global:
Set to True if you want to match all of the cases that fit our pattern in the string (in which you’re attempting to find the pattern). Set to False to if you want only the first match to be found.
Quelle: https://software-solutions-online.com/vba-regex-guide/
Function RE6(strData As String) As String
Dim RE As Object, REMatches As Object
Set RE = CreateObject("vbscript.regexp")
With RE
.MultiLine = False
.Global = False
.IgnoreCase = True
.Pattern = "\[substep [a-zA-Z]\](.*?); {1}"
End With
Set REMatches = RE.Execute(strData)
RE6 = ""
End Function
Grüße
Somebody
Setzen wir dem Trauerspiel mal ein Ende
Fehlt dann nur noch
Wie kann ich einen Beitrag als gelöst markieren?
Set regex = CreateObject("vbscript.regexp")
regex.Global = False: regex.IgnoreCase = True
regex.Pattern = "[\d\.]+(,\d{1,2})?(?=\s*(EURO?|€))"
set matches = regex.Execute("Das ist ein Test 1.200,50 EUR Blablub 100,30€")
If matches.Count > 0 Then
betrag = matches(0)
MsgBox betrag
Else
MsgBox "No match.",vbExclamation
End If
Fehlt dann nur noch
Wie kann ich einen Beitrag als gelöst markieren?