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.
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
Please also mark the comments that contributed to the solution of the article
Content-Key: 3450912459
Url: https://administrator.de/contentid/3450912459
Printed on: April 24, 2024 at 21:04 o'clock
3 Comments
Latest comment
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.
regex.Pattern = "Abrechnungszeitpunkt:\s*(\d{1,2}\.\d{1,2}\.\d{1,4}|\d{1,2}\.\d{1,2})
Grüße Uwe