Worum geht’s?
Du bekommst Rechnungen als PDF.
Immer anders formatiert.
Du willst aber: Rechnungsnummer, Datum, Betrag – direkt in Excel.
Per Hand eintippen? Nee.
Also OCR.
Entweder über Nanonets oder Azure AI Vision.
Ich zeig Dir, wie Du das per VBA automatisierst.
Was brauchst Du?
- Excel 2024 mit Makrozugriff
- Eine API von Nanonets oder Azure OCR
- PDFs (Text oder Scan)
- Einen Ordner mit den Dateien
- Geduld für das API-Testen
Nanonets oder Azure?
Anbieter | Vorteil | Nachteil |
---|---|---|
Nanonets | Rechnungs-Modelle out-of-the-box | Nur Cloud, limitierte Free-Version |
Azure OCR | Solide Texterkennung, günstig | Kein vordefiniertes Rechnungsmodell |
Ich zeig Dir beide Wege.
Du entscheidest, was für Deine Fälle besser passt.
Variante 1: Nanonets API
Setup
- Kostenlosen Account bei Nanonets erstellen
- Dokumentenmodell „Invoice OCR“ auswählen
- API-Key und Model-Endpoint notieren
VBA: PDF hochladen und auslesen
Function NanonetsExtract(filePath As String) As String
Dim http As Object
Dim result As String
Dim apiKey As String
Dim boundary As String
Dim body As String
Dim fileData() As Byte
Dim stream As Object
apiKey = "api_key" ' Dein Nanonets API-Key
boundary = "------------------------" & Format(Now, "yyyymmddhhmmss")
Set stream = CreateObject("ADODB.Stream")
stream.Type = 1
stream.Open
stream.LoadFromFile filePath
fileData = stream.Read
stream.Close
body = "--" & boundary & vbCrLf
body = body & "Content-Disposition: form-data; name=""file""; filename=""" & Dir(filePath) & """" & vbCrLf
body = body & "Content-Type: application/pdf" & vbCrLf & vbCrLf
Dim postData() As Byte
postData = StrConv(body, vbFromUnicode)
postData = postData + fileData
Set http = CreateObject("MSXML2.XMLHTTP")
With http
.Open "POST", "https://app.nanonets.com/api/v2/OCR/Model/<model_id>/LabelFile/", False
.setRequestHeader "Authorization", "Basic " & Base64Encode(apiKey & ":")
.setRequestHeader "Content-Type", "multipart/form-data; boundary=" & boundary
.send postData
result = .responseText
End With
NanonetsExtract = result
End Function
Du brauchst zusätzlich eine Base64Encode
-Funktion für den API-Key.
Ergebnis: JSON mit extrahierten Feldern.
Zugriff z. B. auf "invoice_number"
oder "total_amount"
.
Variante 2: Azure OCR (Read API)
Setup
- Azure Ressource „Computer Vision“ erstellen
- Endpoint und API-Key notieren
- Region beachten (z. B.
westeurope
)
Zwei Schritte: Hochladen → Auslesen
Function AzureOCR(filePath As String) As String
Dim http As Object
Dim apiKey As String
Dim resultUrl As String
Dim result As String
Dim fileData() As Byte
Dim stream As Object
apiKey = "<dein-key>"
Set stream = CreateObject("ADODB.Stream")
stream.Type = 1
stream.Open
stream.LoadFromFile filePath
fileData = stream.Read
stream.Close
Set http = CreateObject("MSXML2.XMLHTTP")
With http
.Open "POST", "https://<region>.api.cognitive.microsoft.com/vision/v3.2/read/analyze", False
.setRequestHeader "Ocp-Apim-Subscription-Key", apiKey
.setRequestHeader "Content-Type", "application/pdf"
.send fileData
End With
resultUrl = http.getResponseHeader("Operation-Location")
' Warten, dann Ergebnis abrufen
Application.Wait Now + TimeValue("0:00:03")
http.Open "GET", resultUrl, False
http.setRequestHeader "Ocp-Apim-Subscription-Key", apiKey
http.send
result = http.responseText
AzureOCR = result
End Function
Die Antwort enthält alle Textzeilen – strukturlos.
Du brauchst danach eine Logik, um Felder wie „Rechnungsnummer“ zu extrahieren.
Zum Beispiel per RegEx.
Beispiel für RegEx-Zugriff
Function ExtrahiereBetrag(jsonText As String) As String
Dim regex As Object
Set regex = CreateObject("VBScript.RegExp")
regex.Pattern = "([0-9]{1,3}(?:\.[0-9]{3})*,[0-9]{2}) ?€"
regex.Global = False
regex.IgnoreCase = True
If regex.Test(jsonText) Then
ExtrahiereBetrag = regex.Execute(jsonText)(0).SubMatches(0)
Else
ExtrahiereBetrag = "nicht gefunden"
End If
End Function
Damit bekommst Du z. B. den Bruttobetrag zurück.
Ähnliche Patterns funktionieren für „Rechnungsnummer“, „Datum“, „IBAN“.
Erweiterungsideen
- Ergebnisse direkt in Excel-Zeilen schreiben
- Mappen auf eigene Felder (Kreditor, Rechnungsnr., Betrag)
- Automatischer Import aus Watchfolder
- HTML-Vorschau des OCR-Textes in UserForm
Was Du beachten solltest
- Nanonets: Ergebnis strukturiert, aber nur für Rechnungen
- Azure: Robuster OCR, aber keine Feldstruktur
- PDFs mit echten Texten funktionieren besser als Scans
- Scans → besser vorher in PNG/JPG umwandeln
Wenn Du viele PDFs automatisch auslesen willst – dann hol Dir die OCR direkt in Excel, per Nanonets oder Azure, und lass die Finger von Copy & Paste.
No responses yet