Zurück

Office + KI Integration

VBA-Makros und Python-Bridge für Word & Excel mit LLM-Anbindung (Ollama, ChatGPT, Claude)

Integrationswege im Überblick

1. Cloud-Copilot

Microsoft 365 Copilot oder ChatGPT-Plugin direkt in Word/Excel. Schnell einzurichten, aber Daten gehen extern.

2. VBA-Makro + API

Eigenes Makro, das selektierten Text an eine LLM-API schickt und das Ergebnis einfügt. Maximale Kontrolle, aber VBA-Wartung.

3. Python-Bridge (lokal)

Lokaler HTTP-Dienst (FastAPI) spricht mit Ollama/API. Office ruft ihn über VBA auf. Vollständig offline möglich.

Variante A: VBA-Makro direkt an Claude/OpenAI

Einfachster Ansatz: ein Word-Makro nimmt den markierten Text, schickt ihn an die Claude- oder OpenAI-API und fügt die Antwort ein. Der API-Key wird als Windows-Umgebungsvariable gespeichert.

Word-VBA-Makro (Claude-API)

Sub AskClaude()
    Dim selText As String, prompt As String, resp As String
    If Selection.Type = wdSelectionNormal Then
        selText = Selection.Text
    Else
        MsgBox "Bitte Text markieren.": Exit Sub
    End If

    prompt = InputBox("Anweisung:", "Claude", "Formuliere patentgerecht um.")
    If prompt = "" Then Exit Sub

    resp = CallClaude(prompt & vbCrLf & vbCrLf & selText)
    Selection.TypeText resp
End Sub

Private Function CallClaude(userMsg As String) As String
    Dim xhr As Object, body As String, apiKey As String
    apiKey = Environ("ANTHROPIC_API_KEY")
    Set xhr = CreateObject("MSXML2.XMLHTTP")

    body = "{""model"":""claude-sonnet-4-6""," & _
           """max_tokens"":2048," & _
           """messages"":[{""role"":""user"",""content"":" & JsonStr(userMsg) & "}]}"

    xhr.Open "POST", "https://api.anthropic.com/v1/messages", False
    xhr.setRequestHeader "content-type", "application/json"
    xhr.setRequestHeader "x-api-key", apiKey
    xhr.setRequestHeader "anthropic-version", "2023-06-01"
    xhr.send body

    ' Minimal-Parsing: content[0].text
    Dim r As String: r = xhr.responseText
    Dim p As Long: p = InStr(r, """text"":""") + 8
    Dim q As Long: q = InStr(p, r, """")
    CallClaude = Replace(Mid(r, p, q - p), "\n", vbCrLf)
End Function

Private Function JsonStr(s As String) As String
    JsonStr = """" & Replace(Replace(s, "\", "\\"), """", "\""") & """"
End Function

Setup: Alt+F11 öffnet den VBA-Editor, Modul einfügen, Code einsetzen, API-Key als Umgebungsvariable ANTHROPIC_API_KEY (bzw. OPENAI_API_KEY) setzen, Makro als Symbolleisten-Button oder Tastenkombination verfügbar machen.

Variante B: Python-Bridge mit lokalem Ollama

Für vollständig lokale Verarbeitung: keine Daten verlassen den Rechner. Ein kleiner FastAPI-Dienst läuft im Hintergrund und verteilt die Anfragen von Office an Ollama.

1. Bridge-Server (bridge.py)

from fastapi import FastAPI
from pydantic import BaseModel
import ollama

app = FastAPI()

class Req(BaseModel):
    instruction: str
    text: str
    model: str = "llama3.3:70b-instruct"

@app.post("/complete")
def complete(req: Req):
    resp = ollama.chat(
        model=req.model,
        messages=[
            {"role": "system", "content": "Du bist Patentanwalts-Assistent. Antworte prägnant und auf Deutsch."},
            {"role": "user", "content": f"{req.instruction}\n\nText:\n{req.text}"},
        ],
    )
    return {"reply": resp["message"]["content"]}

Starten mit uvicorn bridge:app --port 8765. Optional beim Windows-Start automatisieren.

2. Word-Makro, das die Bridge nutzt

Sub AskLocal()
    Dim selText As String, instruction As String, resp As String
    selText = Selection.Text
    instruction = InputBox("Anweisung:", "Lokale KI", "Umformulieren.")
    If instruction = "" Then Exit Sub

    Dim xhr As Object: Set xhr = CreateObject("MSXML2.XMLHTTP")
    Dim body As String
    body = "{""instruction"":" & JsonStr(instruction) & _
           ",""text"":" & JsonStr(selText) & "}"

    xhr.Open "POST", "http://127.0.0.1:8765/complete", False
    xhr.setRequestHeader "content-type", "application/json"
    xhr.send body

    resp = xhr.responseText
    Dim p As Long: p = InStr(resp, """reply"":""") + 9
    Dim q As Long: q = InStrRev(resp, """")
    Selection.TypeText Replace(Mid(resp, p, q - p), "\n", vbCrLf)
End Sub

Excel: Zellen-Funktion =LLM(...)

Mit einer User-Defined Function lässt sich jede Zelle an das LLM schicken, nützlich für Tabellen mit Stichwörtern, Klassifikationen, Übersetzungen.

Public Function LLM(instruction As String, text As String) As String
    Dim xhr As Object: Set xhr = CreateObject("MSXML2.XMLHTTP")
    Dim body As String
    body = "{""instruction"":" & JsonStr(instruction) & _
           ",""text"":" & JsonStr(text) & "}"

    xhr.Open "POST", "http://127.0.0.1:8765/complete", False
    xhr.setRequestHeader "content-type", "application/json"
    xhr.send body

    Dim r As String: r = xhr.responseText
    Dim p As Long: p = InStr(r, """reply"":""") + 9
    Dim q As Long: q = InStrRev(r, """")
    LLM = Replace(Mid(r, p, q - p), "\n", " ")
End Function

In einer Excel-Zelle: =LLM("Klassifiziere als Mechanik/Elektro/Software"; A2)

Typische Anwendungen in der Patentpraxis

Bescheidserwiderung umformulieren

Entwurf markieren → Makro → glatterer Stil, patenttypische Sprache einhalten.

Merkmalsgliederung prüfen

Anspruchstext + Gliederung markieren → „Prüfe Vollständigkeit".

Excel: Aktenliste klassifizieren

=LLM-Funktion in einer Spalte → automatische Einsortierung nach Technikgebiet.

Übersetzung DE ⇄ EN

Kurze Passagen direkt ersetzen lassen; patenttypische Terminologie bleibt erhalten.

MCP-Connectors für Claude Cowork

Claude Cowork (Desktop) kann über das Model Context Protocol (MCP) direkt mit Office-Produkten, E-Mail und Kalender reden, ohne eigenes Makro.

  • Microsoft 365 Connector: liest/schreibt OneDrive, SharePoint, Outlook, Teams
  • Google Workspace: Drive, Gmail, Calendar
  • Gmail / Google Calendar: einzeln verfügbar
  • Box, Egnyte: für Kanzleien mit eigenem Dokumentenmanagement
  • Slack, Atlassian: für interne Kommunikation / Ticket-Systeme

Details: siehe Claude-Code-Guide → Sektion „Hooks & MCP" bzw. die offizielle Dokumentation unter docs.claude.com.

Datenschutz & Sicherheit

  • Mandatsgeheimnis:* Für Akteninhalte die Ollama-Bridge nutzen (nichts verlässt den Rechner) oder eine vertrauenswürdige Cloud-Instanz einsetzen, die den berufsrechtlichen Verschwiegenheitsanforderungen genügt.
  • API-Keys: Niemals in Makros hart codieren. Immer Umgebungsvariablen oder Credential Manager.
  • Makro-Signatur: VBA-Makros digital signieren, damit Office sie ohne Warnung ausführt und sie nicht durch Updates ungewollt aktiviert werden.
  • Audit: Protokollierung der Anfragen lokal speichern, notwendig für spätere Nachvollziehbarkeit.

* Für die Verarbeitung vertraulicher Inhalte gelten u.a. die berufsrechtlichen Verschwiegenheitsanforderungen. Diese können durch ein lokal laufendes Modell oder, im Einzelfall, durch eine vertrauenswürdige oder selbst betriebene Cloud-Instanz erfüllt werden. Dies ist keine Rechtsberatung.

Inhalte teilweise KI-generiert, kuratiert von Sebastian Goebel. Dies ist keine Rechtsberatung, sondern Trainingsmaterial für meine Workshops. Keine Gewährleistung für Richtigkeit oder Vollständigkeit. Keine Haftung. Software wird ohne Mängelgewähr bereitgestellt.