VBA und Regex in Excel
Hallo Liebe Insider,
folgendes Script habe ich zusammengebastelt, um Rechnungsdaten in Excel einzulesen.
Gleich zu Anfang wird bei Abrechnungszeitpunkt (Datum), "Set matches = regex.Execute(strTXT)" Anwendungs oder objektdefinierter Fehler '5017' angezeigt.
Wo könnte der Fehler liegen?
(Excel 2013, erzeugte Txt-Datei wird erzeugt)
Für Eure Hilfe sehr
dankbar
Bustue
folgendes Script habe ich zusammengebastelt, um Rechnungsdaten in Excel einzulesen.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
Sub PDF2Excel()
Dim i As Integer
Dim strCMDLine As String, strTXT As String
Dim FSO As Object, objSFold As Object, objWks As Object, WSHShell As Object, file As Object, rngLastRow As Range
Dim colPFiles As New Collection, colTFiles As New Collection, regex As Object
Set WSHShell = CreateObject("WScript.Shell")
Set FSO = CreateObject("Scripting.FileSystemObject")
Set regex = CreateObject("vbscript.regexp")
regex.MultiLine = True
Set objSFold = FSO.GetFolder(ThisWorkbook.Path)
strCMDLine = """" & ThisWorkbook.Path & "\pdftotext.exe"" -raw -layout -nopgbrk "
For Each file In objSFold.Files ' alle Dateien einlesen
If Right(file.Path, 4) = ".pdf" Then colPFiles.Add file.Path ' nur *.pdf
Next
For i = 1 To colPFiles.Count
WSHShell.Run strCMDLine & """" & colPFiles.Item(i) & """", 0, True
Next
For Each file In objSFold.Files ' wieder alles einlesen
If Right(file.Path, 4) = ".txt" Then colTFiles.Add file.Path ' nur *.txt
Next
Set objWks = Worksheets(1)
Set rngLastRow = objWks.Cells(Rows.Count, 1).End(xlUp).Offset(1, 0)
For i = 1 To colTFiles.Count
strTXT = FSO.OpenTextFile(colTFiles.Item(i)).ReadAll
'Abrechnungszeit auslesen
regex.Pattern = "(?<=Abrechnungszeitpunkt:)[\s]*(\d{1,2}\.\d{1,2}\.\d{1,4}|\d{1,2}\.\d{1,2})"
Set matches = regex.Execute(strTXT)
If matches.Count > 0 Then
rngLastRow.Cells(1, 1).Value = matches(0).submatches(0) 'Zeitraum in Spalte A speichern
End If
' Rechnungsdatum auslesen
regex.Pattern = "(?<=Rechnungsdatum)([\s]*)(\d{1,2}\.\d{1,2}\.\d{1,4}|\d{1,2}\.\d{1,2})"
Set matches = regex.Execute(strTXT)
If matches.Count > 0 Then
rngLastRow.Cells(1, 2).Value = matches(0).submatches(0) 'Rechnungsdatum in Spalte B Speichern
End If
' Rechnungsnummer auslesen
regex.Pattern = "(?<=Rechnungsnummer)([\s]*)(\d{12})"
Set matches = regex.Execute(strTXT)
If matches.Count > 0 Then
rngLastRow.Cells(1, 3).Value = matches(0).submatches(0) 'Rechnungsnummer in Spalte C Speichern
End If
' Kundennummer auslesen
regex.Pattern = "K\d{7 "
Set matches = regex.Execute(strTXT)
If matches.Count > 0 Then
rngLastRow.Cells(1, 4).Value = matches(0).submatches(0) 'Kundennummer in Spalte D Speichern
End If
' Zahlbetrag auslesen
regex.Pattern = "(?<=Zu zahlender Betrag)[\s]*((((\d+)[,.]{1,10})+\d{0,2})|(\d+(?!,))) "
Set matches = regex.Execute(strTXT)
If matches.Count > 0 Then
rngLastRow.Cells(1, 5).Value = matches(0).submatches(0) 'Kundennummer in Spalte D Speichern
End If
Set rngLastRow = rngLastRow.Offset(1, 0)
'Textdatei löschen
Kill colTFiles.Item(i)
Next
Set FSO = Nothing
Set regex = Nothing
Set WSHShell = Nothing
Set objSFold = Nothing
End Sub
Wo könnte der Fehler liegen?
(Excel 2013, erzeugte Txt-Datei wird erzeugt)
Für Eure Hilfe sehr
dankbar
Bustue
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 3450912459
Url: https://administrator.de/forum/vba-und-regex-in-excel-3450912459.html
Ausgedruckt am: 13.04.2025 um 06:04 Uhr
3 Kommentare
Neuester Kommentar
Servus @bustue,
VB(A/S) unterstützt kein positive/negative lookbehind regex pattern (?<=), deswegen auch die Exception. Die Nutzung dieser Patternart ist aber in den meisten Fällen auch gar nicht nötig da hier ja sowieso mit Submatches gearbeitet wird, lass also den postive lookbehind in allen deinen Pattern matches weg, das macht das gleiche.
usw. Fur die anderen analog zum Beispiel gleich aufbauen.
Grüße Uwe
VB(A/S) unterstützt kein positive/negative lookbehind regex pattern (?<=), deswegen auch die Exception. Die Nutzung dieser Patternart ist aber in den meisten Fällen auch gar nicht nötig da hier ja sowieso mit Submatches gearbeitet wird, lass also den postive lookbehind in allen deinen Pattern matches weg, das macht das gleiche.
1
regex.Pattern = "Abrechnungszeitpunkt:\s*(\d{1,2}\.\d{1,2}\.\d{1,4}|\d{1,2}\.\d{1,2})
Grüße Uwe
Serie: VBA Regex
VBA und Regex in Excel3