PDF auslesen und per VBA in Excel schreiben
Hallo zusammen,
ich bin auf der Suche nach einer Möglichkeit Daten automatisiert aus einem PDF auszulesen und in eine Excel-Tabelle zu schreiben.
Konkret geht es um folgende PDF: http://www.gtai.de/GTAI/Content/DE/Trade/Fachdaten/MKT/2008/07/mkt20080 ...
Hier möchte ich z.B. den Wert
- "Fläche:" "357.137,0 qkm"
- "Einwohner:" "2013" "80,5 Millionen"
usw.
in einzelnen Spalten einer Excel haben.
Ich habe bereits über Google nach einer Lösung gesucht und bin dabei auf dieses Forum gestoßen, nämlich auf diesen Beitrag: Pdf auslesen und in excel schreiben
Hier scheint es einen Lösungsansatz zu geben, allerdings funktioniert das bei mit leider nicht. Selbstverständlich habe ich Zeile 15, also den Suchbegriff, an meine PDF angepasst (Einwohner), aber es tut sich leider gar nichts. Ich arbeite mit Office 2010.
Kennt jemand eine Lösung für mein Problem bzw. könnte man das Script aus oben genannten Beitrag irgendwie an meine Bedürfnisse anpassen?
Ich wäre euch zu ewigem Dank verpflichtet, da ich sonst jedes PDF von jedem Land öffnen müsste und die gewünschten Daten herauskopieren müsste.
Vielen Dank bereits im Voraus für eure Hilfe.
ich bin auf der Suche nach einer Möglichkeit Daten automatisiert aus einem PDF auszulesen und in eine Excel-Tabelle zu schreiben.
Konkret geht es um folgende PDF: http://www.gtai.de/GTAI/Content/DE/Trade/Fachdaten/MKT/2008/07/mkt20080 ...
Hier möchte ich z.B. den Wert
- "Fläche:" "357.137,0 qkm"
- "Einwohner:" "2013" "80,5 Millionen"
usw.
in einzelnen Spalten einer Excel haben.
Ich habe bereits über Google nach einer Lösung gesucht und bin dabei auf dieses Forum gestoßen, nämlich auf diesen Beitrag: Pdf auslesen und in excel schreiben
Hier scheint es einen Lösungsansatz zu geben, allerdings funktioniert das bei mit leider nicht. Selbstverständlich habe ich Zeile 15, also den Suchbegriff, an meine PDF angepasst (Einwohner), aber es tut sich leider gar nichts. Ich arbeite mit Office 2010.
Kennt jemand eine Lösung für mein Problem bzw. könnte man das Script aus oben genannten Beitrag irgendwie an meine Bedürfnisse anpassen?
Ich wäre euch zu ewigem Dank verpflichtet, da ich sonst jedes PDF von jedem Land öffnen müsste und die gewünschten Daten herauskopieren müsste.
Vielen Dank bereits im Voraus für eure Hilfe.
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 239601
Url: https://administrator.de/forum/pdf-auslesen-und-per-vba-in-excel-schreiben-239601.html
Ausgedruckt am: 25.12.2024 um 08:12 Uhr
19 Kommentare
Neuester Kommentar
##edit## Wer aktuellere Varianten für das Auslesen von PDF Dokumenten bevorzugt sollte sich dazu diese Beiträge ansehen
- Powershell: Text anhand seiner Position aus PDF-Dokumenten auslesen
- Pdf in Excel Bestellnummern auslesen
Hallo xsto123, Willkommen auf Administrator.de!
Also du packst die pdftotext.exe (aus dem Paket: Xpdf command line tools) in den Ordner deines Excel-Files und die auszulesenden PDF-Dateien ebenfalls in diesen Ordner. Dann kopierst du den Code von unten in dein Excel-File in den VBA-Editor (ALT-F11). Stelle bitte auch sicher das im Sicherheitscenter von Excel das Ausführen von Makros aktiviert ist!
Dann kannst du die Files hiermit auslesen wenn du im VBA-Editor das Makro ausführst: (WICHTIG: in diesem Beispiel wird nur das Land und die Fläche ausgelesen, das musst du dann noch um die gewünschten Felder erweitern, dies wird entsprechend mit Regular-Expressions aus den Textdateien extrahiert)
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
'Land auslesen
regex.Pattern = "^Wirtschaftsdaten kompakt: ([^\r\n]+)"
Set matches = regex.Execute(strTXT)
If matches.Count > 0 Then
rngLastRow.Cells(1, 1).Value = matches(0).submatches(0) 'Land in Spalte A speichern
End If
' Fläche auslesen
regex.Pattern = "^Fläche\s*([^\r\n]+)"
Set matches = regex.Execute(strTXT)
If matches.Count > 0 Then
rngLastRow.Cells(1, 2).Value = matches(0).submatches(0) 'Fläche in Spalte B 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
Mit Regular Expressions geht fast alles, außer Kaffee kochen
dann kannst du hiermit die Teile aufsplitten:
Die Klammern im Regex legen die Submatches fest, so lässt sich das ganze separaten Variablen zuordnen und weiterverarbeiten.
Wenn man den Regex-Ausdruck ausschreibt, würde sich das so lesen:
Für Tests mit Regex lass dir mal ein PDF mit pdftoexe die Textdatei ausgeben, dann siehst du genauer wie das File formatiert ist.
Für das Beispiel-PDF
Anhand dessen lässt sich dann der entsprechende Pattern aufbauen.
Grüße Uwe
- Regular Expressions Tutorial
- Eine große Hilfe für den Anfang mit Regular Expressions ist das hier das passende Tool: http://www.regexbuddy.com/ oder dieses Online-Tool: http://regexpal.com/
Und was wahrscheinlich wirklich nicht funktionieren wird, ist bestimmt, dass der Wert alleine ohne Maßangabe steht, also "357.137,0" ohne "qkm", "80,5" ohne "Millionen", usw., sodass ich die Daten in der Excel weiterverarbeiten kann. Oder?
Kein Problem, der Pattern in diesem Fall lautet:regex.Pattern = "^Einwohner\s*(\d{4}): ([^\s]+) ([^\s]+)"
jahr = matches(0).submatches(0)
zahl = matches(0).submatches(1)
einheit = matches(0).submatches(2)
Wenn man den Regex-Ausdruck ausschreibt, würde sich das so lesen:
Assert position at the beginning of a line (at beginning of the string or after a line break character) «^»
Match the characters “Einwohner” literally «Einwohner»
Match a single character that is a “whitespace character” (spaces, tabs, and line breaks) «\s*»
Between zero and unlimited times, as many times as possible, giving back as needed (greedy) «*»
Match the regular expression below and capture its match into backreference number 1 «(\d{4})»
Match a single digit 0..9 «\d{4}»
Exactly 4 times «{4}»
Match the characters “: ” literally «: »
Match the regular expression below and capture its match into backreference number 2 «([^\s]+)»
Match a single character that is a “non-whitespace character” «[^\s]+»
Between one and unlimited times, as many times as possible, giving back as needed (greedy) «+»
Match the character “ ” literally « »
Match the regular expression below and capture its match into backreference number 3 «([^\s]+)»
Match a single character that is a “non-whitespace character” «[^\s]+»
Between one and unlimited times, as many times as possible, giving back as needed (greedy) «+»
Für Tests mit Regex lass dir mal ein PDF mit pdftoexe die Textdatei ausgeben, dann siehst du genauer wie das File formatiert ist.
Für das Beispiel-PDF
pdftotext.exe -raw -layout -nopgbrk mkt200807555574_159860.pdf
Grüße Uwe
Hallo,
da hast du dir auch einen nicht so einfachen Fall für den Anfang herausgesucht ! Das Problem was ich gerade bemerke ist, dass der pdftotext-Interpreter je nach PDF mit den jetzigen Parametern keine konsistenten Textdateien erzeugt (die Daten in den rechten Spalten sind dann teilweise mehrfach nach unten versetzt und nicht mehr zuzuordnen) mit denen sich das einigermaßen zuverlässig extrahieren ließe.
Beispiel für dein PDF mit Afghanistan(du siehst alles etwas nach unten verschoben, so nicht handlebar):
Womit ich es jetzt mal probiert habe ist mit folgenden Parametern pdftotext eine Art Tabellenansicht zu generieren, damit ist es einigermaßen konsistent, zumindest bei den beiden PDFs die du bis jetzt gepostet hast, wie das bei anderen aussieht kann ich nicht vorhersehen...
Hiermit sieht das ganze dann so aus:
Dann musst du aber auch für das Land den Regex anpassen.
Bei Regex kommt es auf jeden Buchstaben an, ob sichtbar oder nicht, deswegen passt dein Regex nicht weil ein Leerzeichen zwischen den einzelnen Rohstoffen auftritt und die Option [^\s]+ besagt: Matche alles was kein Whitspace-Character ist. Für den hinterern Submatch müsstest du den hier nehmen ([^\r\n]+ also alles was kein PageBreak ist. Du brauchst für den Regex zweitens einen Begrenzer für die Daten, weil du ja nicht weißt wie viele Klassen an Rohstoffe vorkommen. In diesem Fall wäre das der String Mitglied in internationalen der das ganze im Ganzen begrenzt. Und dann jeweils die Submatches sammeln. Da die Rohstoffe via Komma getrennt sind ließen sich diese mit der Split() Funktion voneinander trennen und in die jeweiligen Spalten überführen. Du siehst das ganze ist nicht so simpel wie du dir das vorstellst.
Ein Beispiel wie dies aussehen könnte(hier jetzt nur mit Ausgabe via MsgBox ohne Zuordnung zu dem Spalten, zum testen) (geht nur mit Abänderung der pdftotext-Zeile von oben:
Eine Liste von verfügbaren Regex-Parametern kannst du in oben verlinkten Tutorial nachlesen, oder eine Referenzübersicht hier und hier
An deiner Stelle würde ich mich an die entsprechende Stelle wenden die die Daten veröffentlicht hat und dort eine Anfrage stellen ob die Daten zu Verfügung gestellt werden können. Das sind ja keine geheimen Daten sondern öffentlich verfügbare, vermutlich vom Bundesministerium für Wirtschaft und Energie zur Verfügung gestellt Das geht schneller und du sparst erheblich an Arbeitszeit (die sicherlich auch nicht umsonst ist). Hab das vor Jahren auch schon mal gemacht, die waren sehr umgänglich und haben mir entsprechende Daten gegen ein kleines Entgelt tabellarisch zur Verfügung gestellt.
Du kannst nämlich nicht sicher sein das alle PDFs alle exakt der selben Struktur folgen, da wird es sicherlich den ein oder anderen Ausreißer geben und du musst trotzdem wieder Hand anlegen. Und ich würde mich auf die Ausgabe von pdftotext nicht verlassen wenn später wichtige Berechnungen mit den Daten vorgenommen werden, und hinterher es dann doch nicht stimmt.
Alternativ die Daten in einem konsistenteren Zustand direkt auf den folgenden Seiten aus dem Web auslesen : http://www.laenderdaten.de/laender.aspx
Viel Erfolg
Grüße Uwe
da hast du dir auch einen nicht so einfachen Fall für den Anfang herausgesucht ! Das Problem was ich gerade bemerke ist, dass der pdftotext-Interpreter je nach PDF mit den jetzigen Parametern keine konsistenten Textdateien erzeugt (die Daten in den rechten Spalten sind dann teilweise mehrfach nach unten versetzt und nicht mehr zuzuordnen) mit denen sich das einigermaßen zuverlässig extrahieren ließe.
Beispiel für dein PDF mit Afghanistan(du siehst alles etwas nach unten verschoben, so nicht handlebar):
Wirtschaftsdaten kompakt: Afghanistan
Stand: April 2013
Basisdaten
Fläche 652.230,0 qkm
Einwohner
Bevölkerungsdichte 2013: 30,6 Millionen *
Bevölkerungswachstum
Geburtenrate 2013: 46,9* Einwohner/qkm
Fertilitätsrate
Altersstruktur 2013: 2,2%
Analphabetenquote 2013: 39,0 Geburten/1.000 Einwohner
Rohstoffe agrarisch 2012: 5,1 Geburten pro Frau
mineralisch 2014: 0-14 Jahre: 42%; 15-24 Jahre: 22,2%; 25-54 Jahre:
29,4%; 55-64 Jahre: 2,5%; 65 Jahre und älter: 2,5%
Mitglied in internationalen
Wirtschaftszusammenschlüssen und 2000: 71,9%
-abkommen
Opium, Weizen, Früchte, Nüsse, Wolle, Hammel, Schafsfell,
Währung Bezeichnung Lammfell
Kurs (März 2014)
Jahresdurchschnitt Erdgas, Erdöl, Kohle, Kupfer, Chromit, Talk, Baryt, Schwefel,
Blei, Zink, Eisenerz, Salz, Edel- und Halbedelsteinen
Womit ich es jetzt mal probiert habe ist mit folgenden Parametern pdftotext eine Art Tabellenansicht zu generieren, damit ist es einigermaßen konsistent, zumindest bei den beiden PDFs die du bis jetzt gepostet hast, wie das bei anderen aussieht kann ich nicht vorhersehen...
strCMDLine = """" & ThisWorkbook.Path & "\pdftotext.exe"" -table -nopgbrk "
15868
Wirtschaftsdaten kompakt: Afghanistan
Stand: April 2013
Basisdaten
Fläche 652.230,0 qkm
Einwohner 2013: 30,6 Millionen *
Bevölkerungsdichte 2013: 46,9* Einwohner/qkm
Bevölkerungswachstum 2013: 2,2%
Geburtenrate 2013: 39,0 Geburten/1.000 Einwohner
Fertilitätsrate 2012: 5,1 Geburten pro Frau
Altersstruktur 2014: 0-14 Jahre: 42%; 15-24 Jahre: 22,2%; 25-54 Jahre:
29,4%; 55-64 Jahre: 2,5%; 65 Jahre und älter: 2,5%
Analphabetenquote 2000: 71,9%
Rohstoffe agrarisch Opium, Weizen, Früchte, Nüsse, Wolle, Hammel, Schafsfell,
Lammfell
mineralisch Erdgas, Erdöl, Kohle, Kupfer, Chromit, Talk, Baryt, Schwefel,
Blei, Zink, Eisenerz, Salz, Edel- und Halbedelsteinen
Mitglied in internationalen SAARC, Colombo-Plan, UN ESCAP u.a.; zu bilateralen
Bei Regex kommt es auf jeden Buchstaben an, ob sichtbar oder nicht, deswegen passt dein Regex nicht weil ein Leerzeichen zwischen den einzelnen Rohstoffen auftritt und die Option [^\s]+ besagt: Matche alles was kein Whitspace-Character ist. Für den hinterern Submatch müsstest du den hier nehmen ([^\r\n]+ also alles was kein PageBreak ist. Du brauchst für den Regex zweitens einen Begrenzer für die Daten, weil du ja nicht weißt wie viele Klassen an Rohstoffe vorkommen. In diesem Fall wäre das der String Mitglied in internationalen der das ganze im Ganzen begrenzt. Und dann jeweils die Submatches sammeln. Da die Rohstoffe via Komma getrennt sind ließen sich diese mit der Split() Funktion voneinander trennen und in die jeweiligen Spalten überführen. Du siehst das ganze ist nicht so simpel wie du dir das vorstellst.
Ein Beispiel wie dies aussehen könnte(hier jetzt nur mit Ausgabe via MsgBox ohne Zuordnung zu dem Spalten, zum testen) (geht nur mit Abänderung der pdftotext-Zeile von oben:
regex.Global = True
regex.IgnoreCase = True
regex.Pattern = "(agrarisch|mineralisch)\s+([\s\S]+?,[\r\n]+[\s\S]+?)[\r\n]{4}|(agrarisch|mineralisch)\s+([\s\S]+?)[\r\n]{4}"
Set matches = regex.Execute(strTXT)
If matches.count > 0 Then
For Each match In matches
' Rohstoffklasse
rohstoffklasse = match.Submatches(0)
MsgBox "Klasse: " & rohstoffklasse
'ungewünschte Zeichen und Zeilenumbrüche entfernen
raw = Replace(Trim(match.Submatches(1)),"," & vbNewLine,",",1,-1,1)
raw = Replace(raw,vbNewLine,"")
'Stoffe in Array splitten
arrStoffe = Split(raw,",",-1,1)
For i = 0 To UBound(arrStoffe)
stoff = Trim(arrStoffe(i))
MsgBox stoff
Next
Next
End If
An deiner Stelle würde ich mich an die entsprechende Stelle wenden die die Daten veröffentlicht hat und dort eine Anfrage stellen ob die Daten zu Verfügung gestellt werden können. Das sind ja keine geheimen Daten sondern öffentlich verfügbare, vermutlich vom Bundesministerium für Wirtschaft und Energie zur Verfügung gestellt Das geht schneller und du sparst erheblich an Arbeitszeit (die sicherlich auch nicht umsonst ist). Hab das vor Jahren auch schon mal gemacht, die waren sehr umgänglich und haben mir entsprechende Daten gegen ein kleines Entgelt tabellarisch zur Verfügung gestellt.
Du kannst nämlich nicht sicher sein das alle PDFs alle exakt der selben Struktur folgen, da wird es sicherlich den ein oder anderen Ausreißer geben und du musst trotzdem wieder Hand anlegen. Und ich würde mich auf die Ausgabe von pdftotext nicht verlassen wenn später wichtige Berechnungen mit den Daten vorgenommen werden, und hinterher es dann doch nicht stimmt.
Alternativ die Daten in einem konsistenteren Zustand direkt auf den folgenden Seiten aus dem Web auslesen : http://www.laenderdaten.de/laender.aspx
Viel Erfolg
Grüße Uwe
zu 1.) Ja es ist auf jeden Fall einfacher da die Daten dort schon in Tabellenform vorliegen, und du nicht auf die unvorhersehbare Umwandlung von pdftotext angewiesen bist.
zu 2.)
Die Parameter wie pdftotext aufgerufen wurde kannst du ja im Code nachvollziehen.
In meiner letzten Variante habe ich die Tabellenformatierung genommen:
Warum das Teil jetzt auf unterschiedlichen Systemen unterschiedliche Ergebnisse liefert kann ich im Moment nicht sagen, entweder du hast andere Parameter verwendet oder ??, da ist aber ein Auslesen aus dem Web wesentlich zuverlässiger. Ich mach die nächste Woche dazu mal ein Beispiel (sowas mach ich dann aber meistens entweder mit Powershell oder AutoIT)
Es wäre aber auch mal gut zu wissen welche Daten du brauchst und von welchen Ländern, sonst mach ich wieder das falsche Beispiel. Ich kann dir hier leider nicht mein ganzes Wissen dazu mitteilen, aber gegen ein entsprechendes Entgeld könnten wir darüber reden das ich dir die Daten als Excel aufbereite, meine Zeit ist ja auch nicht umsonst
Grüße Uwe
zu 2.)
Die Parameter wie pdftotext aufgerufen wurde kannst du ja im Code nachvollziehen.
In meiner letzten Variante habe ich die Tabellenformatierung genommen:
pdftotext.exe -table -nopgbrk deinpdf.pdf"
Es wäre aber auch mal gut zu wissen welche Daten du brauchst und von welchen Ländern, sonst mach ich wieder das falsche Beispiel. Ich kann dir hier leider nicht mein ganzes Wissen dazu mitteilen, aber gegen ein entsprechendes Entgeld könnten wir darüber reden das ich dir die Daten als Excel aufbereite, meine Zeit ist ja auch nicht umsonst
Grüße Uwe
Hi,
habe vorgestern das Factbook komplett mit allen Ländern in ein Excel Sheet eingelesen. Die einzelnen Kategorien befinden sich dabei jeweils in einer separaten Zelle, aber noch nicht von Zahlen und Einheiten getrennt - das ist quasi unmöglich da hier soviel unterschiedliche Varianten vorkommen. Aber mit ein wenig Nacharbeit in Excel mit zusätzlichen Spalten und Formel ist das für dich sicherlich kein Problem.
Schick mir deine E-Mail-Adresse via Personal Message dann lass ich dir das Sheet morgen zukommen Oder ich schick dir einen Downloadlink.
Grüße Uwe
habe vorgestern das Factbook komplett mit allen Ländern in ein Excel Sheet eingelesen. Die einzelnen Kategorien befinden sich dabei jeweils in einer separaten Zelle, aber noch nicht von Zahlen und Einheiten getrennt - das ist quasi unmöglich da hier soviel unterschiedliche Varianten vorkommen. Aber mit ein wenig Nacharbeit in Excel mit zusätzlichen Spalten und Formel ist das für dich sicherlich kein Problem.
Schick mir deine E-Mail-Adresse via Personal Message dann lass ich dir das Sheet morgen zukommen Oder ich schick dir einen Downloadlink.
Grüße Uwe
Hi Daniel,
Also aus der Lameng, ohne groß zu Testen, da ich hier den Originaltext von pdftotext nicht da habe und nur mein Smartphone sollte das in etwa so aussehen:
Ich habe es mit dem Drumherum geschrieben, da dies ja ein zweistufiger Prozess ist (erst mal die Zeile mit den Werten extrahieren und dann jeweils das Gut und die dazugehörige Prozentzahl). Das sind ja nicht immer gleich viele Güter in den PDFs ... deswegen dieser Weg!
Schöne Pfingsten bei diesem Traumwetter
Grüße Uwe
ich wollte kurz Bescheid geben, dass ich fast alle Regex hinbekommen habe
super, respekt Da gibt sich mal einer Mühe, das ist hier oft nicht selbstverständlich. Daumen hoch!Also aus der Lameng, ohne groß zu Testen, da ich hier den Originaltext von pdftotext nicht da habe und nur mein Smartphone sollte das in etwa so aussehen:
Ich habe es mit dem Drumherum geschrieben, da dies ja ein zweistufiger Prozess ist (erst mal die Zeile mit den Werten extrahieren und dann jeweils das Gut und die dazugehörige Prozentzahl). Das sind ja nicht immer gleich viele Güter in den PDFs ... deswegen dieser Weg!
regex.pattern = "^(Einfuhrgüter nach SITC)[\s\S]+?^(\d{4}):([\s\S]+?)^Ausfuhrgüter"
regex.Ignorecase = True
regex.Multiline = True
set matches = regex.Execute(strTXT)
if matches.Count > 0 then
category = matches(0).Submatches(0)
jahr = matches(0).Submatches(1)
msgbox category
msgbox jahr
result = Replace(Trim(matches(0).Submatches(2)),vbNewline,"")
regex.Global = True
regex.pattern = "([^;]+?)([\d,]+)"
set smatches = regex.Execute(result)
for each match in smatches
gut = match.Submatches(0)
prozent = match.Submatches(1)
msgbox gut & ":" & prozent
Next
else
msgbox "No Match"
End if
Grüße Uwe
ich weis jetzt zwar nicht in welcher Spalte du dich befindest, aber das legst du in Zeile 9 fest.
Grüße Uwe
regex.pattern = "^(Einfuhrgüter nach SITC)[\s\S]+?^(\d{4}):([\s\S]+?)^Ausfuhrgüter"
regex.Ignorecase = True
regex.Multiline = True
set matches = regex.Execute(strTXT)
if matches.Count > 0 then
category = matches(0).Submatches(0)
jahr = matches(0).Submatches(1)
currentColumn = 10
rnglastRow.Cells(1,currentColumn).Value = category
rnglastRow.Cells(1,currentColumn + 1).Value = jahr
result = Replace(Trim(matches(0).Submatches(2)),vbNewline,"")
regex.Global = True
regex.pattern = "([^;]+?)([\d,]+)"
set smatches = regex.Execute(result)
currentColumn = currentColumn + 2
for each match in smatches
gut = match.Submatches(0)
prozent = match.Submatches(1)
rnglastRow.Cells(1,currentColumn).Value = gut
rnglastRow.Cells(1,currentColumn + 1).Value = prozent
currentColumn = currentColumn + 2
Next
else
msgbox "No Match"
End if
Hallo zusammen,
ich muss das hier mal wieder ein bisschen aufwärmen, weil es 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 zu erfassen. Dank der zusätzlichen Regex-Tipps und -Links 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 Zeilen rauszuziehen? Mit Regex komme ich da ja nicht wirklich weiter...
Hat noch jemand hier einen Tipp für mich? Danke schonmal im Voraus!
Gruß,
Carsten
ich muss das hier mal wieder ein bisschen aufwärmen, weil es 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 zu erfassen. Dank der zusätzlichen Regex-Tipps und -Links 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 Zeilen rauszuziehen? Mit Regex komme ich da ja nicht wirklich weiter...
Hat noch jemand hier einen Tipp für mich? Danke schonmal im Voraus!
Gruß,
Carsten