cuwie.de
Goto Top

Einzelne Zeilen aus PDF in Excel per VBA auslesen

Hallo zusammen,

ich möchte diesen Thread PDF auslesen und per VBA in Excel schreiben hier mal wieder ein bisschen aufwärmen, weil er mir auch sehr viel geholfen hat, Danke dafür schonmal vorweg.
In meinem Falle nutze ich das Script um PDF-Rechnungen auszulesen und in Excel (2013) zu erfassen. Dank der zusätzlichen Regex-Tipps und -Links aus dem Thread bekomme ich so die Eckdaten (Rechnungsnummer, Datum, Gesamtbetrag etc.) wunderbar raus, aber wie schaffe ich es, die Detailangaben der Rechnungen auszulesen?
Meine Rechnungen sehen ungefähr so aus:

Kopfdaten
Kopfdaten
Kopfdaten
Kopfdaten
Kopfdaten
Kopfdaten
Kopfdaten

Allgemeine Informationen
Allgemeine Informationen
Allgemeine Informationen

Rechnungsdetails:
Bestellung 0815
Mitarbeiter 01                                Tag 01 - Tag 03
Tag 01     5 STD     42,00 EUR     210,00 EUR
Tag 02     5 STD     42,00 EUR     210,00 EUR
Tag 03     5 STD     42,00 EUR     210,00 EUR

Mitarbeiter 02                                Tag 01 - Tag 03
Tag 01     5 STD     42,00 EUR     210,00 EUR
Tag 02     5 STD     42,00 EUR     210,00 EUR
Tag 03     5 STD     42,00 EUR     210,00 EUR
Gesamt Bestellung 0815           1.260,00 EUR

Bestellung 0816
Mitarbeiter 01                                Tag 01 - Tag 03
Tag 01     5 STD     42,00 EUR     210,00 EUR
Tag 02     5 STD     42,00 EUR     210,00 EUR
Tag 03     5 STD     42,00 EUR     210,00 EUR

Mitarbeiter 02                                Tag 01 - Tag 03
Tag 01     5 STD     42,00 EUR     210,00 EUR
Tag 02     5 STD     42,00 EUR     210,00 EUR
Tag 03     5 STD     42,00 EUR     210,00 EUR
Gesamt Bestellung 0816           1.260,00 EUR
Gesamt                           2.520,00 EUR

Fußzeile
Fußzeile
Fußzeile
Fußzeile

Am liebsten wäre mir jetzt eine Liste, in der ich je gearbeitetem Tag eine Zeile bekomme, für die Auswertung brauche ich natürlich je Zeile auch allgemeine Angaben, aber wie gesagt, das klappt ja schon. Wie muss ich vorgehen, um die einzelnen Detailzeilen rauszuziehen, aber nicht alle Zeilen der Rechnung? Mit Regex komme ich da ja nicht wirklich weiter...
Hat noch jemand hier einen Tipp für mich? Danke schonmal im Voraus!

Gruß,

Carsten

Content-Key: 266696

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

Ausgedruckt am: 28.03.2024 um 20:03 Uhr

Mitglied: colinardo
colinardo 18.03.2015 aktualisiert um 15:04:23 Uhr
Goto Top
Hallo Carsten,
Zitat von @cuwie.de:
Mit Regex komme ich da ja nicht wirklich weiter...
Doch, mit folgendem Pattern:
(^Tag.*?$\s*){1,}
Mit diesem landen die Tag .... Zeilen jeweils in einem Block den du dann hinterher mit einem Split() anhand der Zeilenumbrüche trennen kannst.
Dazu muss im Code das Regex-Object auf Global geschaltet werden und MultiLine auf True gesetzt werden
regex.Global = True
regex.MultiLine = True
Alternativ kannst du natürlich auch jede dieser Zeilen direkt einzeln rausziehen:
(^Tag.*$)
Grüße Uwe
Mitglied: cuwie.de
cuwie.de 18.03.2015 um 16:00:27 Uhr
Goto Top
Multiline und Global sind beide true, aber das Script gibt mir immer nur den ersten Treffer in einer Datei raus, wo ist denn da der Wurm drin? Ich bin leider nicht so firm in VBA, dass ich die genauen Details rauslesen kann, ich verstehe es nur einigermaßen, aber "spreche" es nicht...
Mitglied: colinardo
colinardo 18.03.2015 aktualisiert um 16:05:46 Uhr
Goto Top
Zitat von @cuwie.de:

Multiline und Global sind beide true, aber das Script gibt mir immer nur den ersten Treffer in einer Datei raus, wo ist denn da der Wurm drin?
Du musst alle Matches durchlaufen da es ja mehrere sind/sein können:
Set matches = regex.Execute(strTXT)
for each match in matches
   ' nur als Beispiel in einer MsgBox ausgeben  
   msgbox match
next
Mitglied: cuwie.de
cuwie.de 19.03.2015 um 16:22:02 Uhr
Goto Top
Hi, bin erst heute wieder dazugekommen, damit weiterzumachen.

Mein Code zum Einfügen in der Excel-Tabelle sieht so aus:
Set matches = regex.Execute(strTXT)
for each match in matches
            rngLastRow.Cells(1, 1).Value = matches(0).submatches(0)
            rngLastRow.Cells(1, 2).Value = matches(0).submatches(0)
next

Naja, das stimmt nicht ganz, ich habe den Fehler heute dann auch selbst gefunden... Der Index in der zweiten Submatch-Zeile sollte auch ein anderer als in der ersten sein. Das hilft ungemein.
Ich habe aber weiterhin das Problem, dass mein Script nach dem ersten Treffer in einer Datei nicht weitermacht, sondern den Inhalt der nächsten Datei angeht. Das heißt also, egal wieviele Zeilen ich in einer Rechnung stehen habe, in der Tabelle landet nur die erste.
Habe ich etwas übersehen? Und wenn ja, was?
Mitglied: colinardo
Lösung colinardo 19.03.2015, aktualisiert am 20.03.2015 um 09:43:58 Uhr
Goto Top
Habe ich etwas übersehen? Und wenn ja, was?
Ja, du nutzt immer nur matches(0) also immer nur den ersten Match, sagt ja schon der Index !
Du musst match.submatches(0) verwenden, denn in match ist in jedem Durchgang der Schleife eins der Matches. Dafür ist die for each Schleife ja da face-wink

Grüße Uwe
Mitglied: cuwie.de
cuwie.de 20.03.2015 um 09:43:53 Uhr
Goto Top
Autsch... Die Leitung war breit...

Ich habe es sogar geschafft, den Code über meinen Zähler zei so anzupassen, dass eben nicht alles in eine Zeile geschrieben wird:

        regex.Pattern = "^(44\d{6}){1,}"  
        Set matches = regex.Execute(strTXT)
         
        zei = i
        For Each Match In matches
            rngLastRow.Cells(zei, 9).Value = Match.submatches(0)    'Zeile in Spalte I speichern  
            zei = zei + 1
        Next

Das mag jetzt vielleicht nicht besonders elegant sein, aber auf jeden Fall ist es funktional.
zei = i
ist nötig, um den Zähler durch die umgreifende For-Schleife fortzuschreiben, dort muss natürlich der letzte Zeilenwert auch wieder berücksichtigt werden.