bustue
Goto Top

VBA und Regex in Excel

Hallo Liebe Insider,

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
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

Content-Key: 3450912459

Url: https://administrator.de/contentid/3450912459

Printed on: April 24, 2024 at 21:04 o'clock

Member: colinardo
Solution colinardo Jul 26, 2022 updated at 12:40:47 (UTC)
Goto Top
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.
regex.Pattern = "Abrechnungszeitpunkt:\s*(\d{1,2}\.\d{1,2}\.\d{1,4}|\d{1,2}\.\d{1,2})  
usw. Fur die anderen analog zum Beispiel gleich aufbauen.

Grüße Uwe
Member: bustue
bustue Jul 26, 2022 at 13:03:44 (UTC)
Goto Top
Hallo Uwe,
recht vielen Dank für Deine schnelle Hilfe.
MfG
Burghard
Member: colinardo
colinardo Jul 26, 2022 at 16:36:34 (UTC)
Goto Top
Immer gerne 👍