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?

AnbieterVorteilNachteil
NanonetsRechnungs-Modelle out-of-the-boxNur Cloud, limitierte Free-Version
Azure OCRSolide Texterkennung, günstigKein 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.

Tags:

No responses yet

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert