Excel und VBA und Regex

bustue

Grünschnabel
Hallo Freunde,

ich habe folgendes Script zusammengeschustert:

Visual Basic:
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})/s"
        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


Egal was ich mache, es kommt die Fehlermeldung Anwendung- und objektdefinierter Fehler und der Debugger hält bei 'Set matches = regex.Execute(strTXT)'

Wo könnte ich etwas ändern?
(Excel 2013, Im Anhang die Txt-Datei)

Für Eure Hilfe im Voraus dankbar
Bustue
 

Anhänge

  • RG_100000322897.txt
    3,6 KB · Aufrufe: 3
Zuletzt bearbeitet von einem Moderator:

Yaslaw

alter Rempler
Moderator
Welcher der vielen Set matches = regex.Execute(strTXT?
Anstelle des count auf den matches würde ich eh ein Test machen.
Visual Basic:
regex.Pattern = "(?<=Abrechnungszeitpunkt:)[\s]*(\d{1,2}\.\d{1,2}\.\d{1,4}|\d{1,2}\.\d{1,2})/s"
If regex.test(strTXT) Then
    Set matches = regex.Execute(strTXT)
    rngLastRow.Cells(1, 1).Value = matches(0).submatches(0) 'Zeitraum in Spalte A speichern
End If[/code

bei "Rechnungsdatum auslesen" ist das datum im Submatches(1) regex101: build, test, and debug regex

"Rechnungsnummer" wird nicht gefunden. Es sind nur 11 Ziffern. Zduem auch hier der Submatches(1)

Das Pattern für die Kundennummer funktioniert nicht. Nimm \bK\d{7}\b
 
Zuletzt bearbeitet: