VBA-Code mit LLMs schreiben: Excel-Auswertungen ohne Rechenfehler
Sprachmodelle schreiben guten Code, rechnen aber unzuverlässig. Am Beispiel eines URL-Audits zeige ich Dir, wie Du Daten aus dem Screaming Frog, der Google Search Console, GA4 und Backlink-Tools zusammenführst und per VBA-Makro bewertest. Den Code schreibt die KI, und Du bekommst Auswertungen, die reproduzierbar und prüfbar sind und bei denen Deine Daten in Deiner Hand bleiben.

Auswertungen via Excel für Profis mit KI: Excel VBA Code mit KI erstellen.
Das Wichtigste in Kürze
✓ Sprachmodelle rechnen nicht zuverlässig und liefern bei gleicher Eingabe nicht immer dasselbe Ergebnis.
✓ Lass die KI den VBA-Code schreiben, nicht die Zahlen auswerten.
✓ Erst das Ziel klären, dann die Daten beschaffen, aufbereiten, bewerten und prüfen.
✓ URLs vor dem Zusammenführen normalisieren, sonst entstehen leere Treffer.
✓ Regeln in fester Reihenfolge prüfen, damit jede URL genau eine Empfehlung bekommt.
Warum KI allein für SEO-Auswertungen riskant ist
Der erste Gedanke ist: die auszuwertende Excel-Datei hochzuladen, die Frage stellen und dann von der LLM das Ergebnis zu bekommen. Das Problem: Sprachmodelle verarbeiten Zahlen nicht nach festen Rechenregeln, sondern erzeugen Text. Das Ergebnis sieht plausibel aus, auch wenn es falsch ist. Für eine Analyse auf dessen Basis Entscheidungen getroffen werden, ist das suboptimal. Häufige Stolperfallen in der Arbeit mit KI:
- Falsche Zahlen, die plausibel wirken: In einer Auswertung löste GPT-4 nur 59 Prozent der dreistelligen Multiplikationen korrekt, bei fünfstelligen keine einzige (Quelle). Auch neuere Studien zeigen: Je höher die Rechenlast, desto stärker sinkt die Genauigkeit (Quelle).
- Nicht reproduzierbar: Gleicher Datensatz, gleiche Frage, andere Antwort. Das passiert sogar bei Temperatur 0, also der Einstellung, die eigentlich feste Ergebnisse liefern soll (Quelle).
- Große Exporte gehen still verloren: Ein Crawl mit zehntausenden URLs sprengt schnell das Kontextfenster. Und selbst wenn er hineinpasst, nutzen Modelle Informationen in der Mitte langer Eingaben deutlich schlechter als am Anfang oder Ende (Quelle).
- Datenschutz: (Kunden-)Daten im Chatfenster sind heikel. Denn was in das Chatfenster eines LLMs eingegeben wird, verlässt das Unternehmen und kann beim Anbieter gespeichert, ausgewertet oder je nach Einstellung sogar fürs Training genutzt werden. Dies verstößt bei Kundendaten schnell gegen DSGVO und Vertraulichkeitsvereinbarungen (Quelle).
- Kein Rechenweg: Fragt ein Vorgesetzter oder eine Kundin, warum eine URL gelöscht werden soll, brauchst Du ein valides Argument. „Hat die KI gesagt“ reicht nicht.
Meine Konsequenz: Die KI schreibt den Code, Excel rechnet. Ein VBA-Makro arbeitet deterministisch. Gleiche Daten und gleiche Regeln ergeben immer dasselbe Ergebnis, und jeder Schritt lässt sich nachvollziehen.
Und was ist mit Copilot & Python in Excel oder Code Interpreter?
Copilot in Excel, Python in Excel und die Code-Funktionen von ChatGPT oder Claude rechnen ebenfalls per Code. Das Rechenproblem lösen sie also auch. Der Unterschied liegt in
- Kontrolle,
- Wiederverwendbarkeit und
- Datenhoheit

VBA, KI-Chatbot oder Python in Excel: Wo gerechnet wird und wie verlässlich das Ergebnis ist.
Python in Excel läuft laut Microsoft in einem abgesicherten Container, speichert keine Daten dauerhaft und ist DSGVO-konform (Microsoft). Nutzt Deine Organisation ohnehin Microsoft 365, ist das eine gute Alternative.
Bei VBA verlassen Deine Daten den Rechner gar nicht. Daher bevorzuge ich bei meinen Analysen Excel und VBA-Code.
Das Praxisbeispiel: URL-Audit mit klaren Empfehlungen
Ich zeige Dir den Workflow am Beispiel eines URL-Audits. Ziel ist eine klare Empfehlung für jede URL, zum Beispiel:
- OK
- Überarbeiten
- Löschen
- Weiterleiten
- Manuell prüfen
Ein URL-Audit ist eine Form des Content-Audits: Du bewertest jede einzelne URL und leitest daraus Maßnahmen ab. Was ein Content-Audit grundsätzlich leisten muss und wie wir einen URL-Audit für Kund*innen aufsetzen, liest Du in eigenen Beiträgen. Hier geht es um die Technik dahinter.
Bevor Du die erste Zeile Code schreiben lässt, legst Du zwei Dinge fest:
- Welche Entscheidung soll am Ende stehen? Und
- in welcher Reihenfolge bauen die Bewertungen aufeinander auf?
Erst daraus ergibt sich, welche Daten Du brauchst.

Der Workflow für SEO-Auswertungen in Excel: vier Stufen von der Datenbeschaffung bis zur Prüfung.
Die Spalten im Beispiel
Damit Prompts, Formeln und Makros in diesem Beitrag zusammenpassen, hier die Spalten meines Bewertungsblatts. Die Rohdaten aus der Master-Tabelle stehen ab Spalte T.

Von der URL bis zum Todo: Diese Daten landen in der Master-Tabelle für Deinen Content-Audit.
Ein Hinweis vorab:
Zeiträume, Schwellenwerte und Regeln in diesem Beitrag sind meine Entscheidungen für dieses Beispiel. Du kannst und solltest sie an Deine Ziele anpassen. Ein Onlineshop mit saisonalen Produkten braucht andere Grenzen als ein B2B-Magazin.
Schritt 1: Ziel und Datenbasis festlegen
Im ersten Schritt legst Du fest, welche Daten die Entscheidung tragen. Für das URL-Audit brauche ich drei Blickwinkel:
- Welche URLs gibt es überhaupt? (Crawl der gesamten Domain mit dem Screaming Frog und Export der HTML-Seiten)
- Wie performen die Inhalte?
- Search Console für die aktuelle SEO-Performance
- GA4 für die Frage, ob der Inhalt über andere Kanäle eine Rolle spielt, etwa über interne Klicks
- Welche äußeren Faktoren fließen ein?
- Backlinks, die Du nicht verlieren möchtest.
- Optional die Sichtbarkeit aus Sistrix oder XOVI (in diesem Beispiel nicht berücksichtigt).

Welche Daten aus welchem Tool, über welchen Zeitraum und warum: die Quellen hinter dem Content-Audit.
Limits der GSC kennen: 1.000 Zeilen sind keine Datenbasis
Die Oberfläche der Search Console exportiert maximal 1.000 Zeilen (Google). Für kleine Websites reicht das oft, für große nicht. Diese Alternativen nennt Google:
- Die Search Console API liefert bis zu 50.000 Zeilen pro Tag und Suchtyp.
- Der Bulk-Export nach BigQuery liefert alle Leistungsdaten ohne dieses Limit, setzt aber ein Google-Cloud-Konto voraus (Google).
- Für kleine und mittlere Websites reicht laut Google auch der Looker-Studio-Connector (Google).
Ich nutze für die Google-Daten SeoTools for Excel. Das kostenpflichtige Add-in holt Search Console und GA4 direkt in die Arbeitsmappe, läuft aber nur unter Windows. Wie Du es einrichtest, zeigen wir in SeoTools for Excel und die Google Search Console.
Auf dem Mac kannst Du zur API-Anbindung im Screaming Frog greifen: Der Crawler hängt Search-Console- und GA4-Daten direkt an jede gecrawlte URL. Das ist auch unter Windows eine gute Lösung, weil die Daten dann schon pro URL vorliegen. Mehr dazu in unseren Tipps zum Screaming Frog.
Datum per Custom Extraction prüfen
Beim Scrapen des Datums per Custom Extraction im Screaming Frog lohnt ein zweiter Blick: Oft erwischst Du das Veröffentlichungsdatum statt der letzten Aktualisierung, oder das Datum wird nicht sauber übernommen.
Fehlt das Datum auch nach manueller Prüfung ganz, handelt es sich meist um Kategorie- oder Evergreen-Seiten.
Prüfe das Datum deshalb stichprobenartig, bevor es in die Bewertung einfließt.
Schritt 2: Daten aufbereiten
Rohdaten aus den Tools sind selten direkt auswertbar: Erst wenn Du die Daten aus verschiedenen Quellen zusammenführst und anschließend Formate, Spalten und Werte bereinigst, liefern Analysen korrekte Ergebnisse.
Feste Ordnerstruktur und Standard-Exporte
Lege für jedes Projekt dieselbe Ordnerstruktur an und behalte die Dateinamen der Standard-Exporte bei. Zieht ein Makro / eine Formel die Daten später automatisch aus den Exporten, findet es sie so immer am gleichen Ort.
Je mehr Du manuell anpasst, desto wahrscheinlicher schleichen sich Fehler ein. Deshalb nehme ich immer die Standard-Exporte der Tools.
Quellen per URL zusammenführen
Basis ist ein eigener Reiter mit allen URLs aus dem Screaming-Frog-Crawl. Daran hängst Du die Werte aus jeder Quelle. Am Ende hat jede URL eine Zeile mit Statuscode, Indexierbarkeit, Wortanzahl, Inlinks, Datum, GA4-Traffic, GSC-Impressionen und -Klicks, Title, Description, H1, Canonical, Weiterleitungsziel sowie den Backlinks aus Semrush und ahrefs.

Die Master-Tabelle: eine Zeile pro URL, alle Datenquellen nebeneinander.
Für das Zusammenführen gibt es drei Wege:

SVERWEIS, VBA oder Power Query: Welcher Weg zum Zusammenführen der Daten zu Dir passt.
Ich nutze meist den VBA-Weg. Die Daten landen reduziert und sauber in der Master-Tabelle, und für die Bewertung arbeite ich ohnehin mit Makros. Power Query ist technisch elegant, für viele aber ein neues Werkzeug, und niemand stellt gern eine Arbeitsweise um, die funktioniert.
Mein Rat:
Nimm den Weg, den Du und Dein Team schon beherrschen. Den Code für VBA oder Power Query (M-Code) kann Dir die KI in beiden Fällen schreiben.
Typische Fehlerquellen beim Zusammenführen
- Dezimal- und Datumsformate: Englische Exporte nutzen den Punkt als Dezimaltrennzeichen, deutsches Excel das Komma. Aus 1.234 Impressionen wird so schnell eine Kommazahl. Beim Datum passiert dasselbe mit Monat und Tag. Lege das Gebietsschema deshalb schon beim Import fest, statt die Werte nachträglich zu reparieren.
- URLs normalisieren: GA4 liefert Seitenpfade ohne Domain, Search Console und Screaming Frog volle URLs. Schon kleine Unterschiede lassen den Abgleich ins Leere laufen, und Seiten wirken trafficlos, obwohl sie es nicht sind. Bringe die URLs deshalb vor dem Zusammenführen in eine einheitliche Form und ergänze GA4-Pfade um die Domain (oder die Domain überall entfernen).
Hilfsspalten vorbereiten
Bevor das Makro bewertet, brauchst Du ein paar Hilfsspalten. Ich habe sie mit klassischen Excel-Formeln gebaut, Du kannst sie aber genauso als VBA umsetzen.
Bei großen Datenmengen spricht einiges für VBA: Ein Makro schreibt fertige Werte statt Formeln, Excel muss also nicht bei jeder Änderung zehntausende Zellen neu berechnen. Die Logik steht an einer Stelle statt in jeder Zeile, eine Korrektur wirkt sofort überall. Und beim nächsten Export startest Du das Makro einfach neu, statt Formeln herunterzuziehen. Formeln haben dafür einen Vorteil: Kolleg*innen ohne VBA-Kenntnisse sehen direkt in der Zelle, was passiert.
Achtung:
Die Formeln funktionieren nur, wenn die Inhalte in denselben Spalten stehen wie in meinem Beispiel (siehe Spaltenübersicht oben).
Indexierbarkeit
Diese Spalte (C) zeigt nicht nur, ob eine URL indexierbar ist, sondern auch, warum nicht. So sehen alle Nutzer*innen der Datei auf einen Blick, woran es liegt. Die Formel greift auf den Statuscode (B), die Indexierbarkeit laut Crawl (T) und das Canonical (X) zu.

Die Spalte Indexierbarkeit nennt auch den Grund, warum eine URL nicht indexierbar ist.

Fehlerseite, Weiterleitung oder indexierbar: So ordnet die Formel jede URL ein.
Beispielformel für Spalte C:
=LET(_url;GLÄTTEN(A2);_stat;LINKS(GLÄTTEN(B2);1);_idx;GLÄTTEN(T2);_can;GLÄTTEN(X2);WENN(_idx=“Indexierbar“;UNIZEICHEN(9745)&“ Indexierbar“;WENN(_idx<>“Nicht indexierbar“;“-„;WENN(_stat=“3″;UNIZEICHEN(8597)&“ Weitergeleitete URL“;WENN(ODER(_stat=“4″;_stat=“5″);UNIZEICHEN(11197)&“ Fehlerseite“;WENN(UND(_can<>““;_can<>“-„;NICHT(IDENTISCH(_url;_can)));UNIZEICHEN(9676)&“ Nicht kanonische URL“;UNIZEICHEN(11198)&“ Nicht indexierbar“))))))
Cluster
Für das Cluster nehme ich das erste sprechende Verzeichnis der URL, etwa Produkt, Magazin oder Kategorie. Sprachverzeichnisse wie /de/ oder /en/ überspringt die Formel. Für komplexere Strukturen funktioniert die Zuordnung auch per regulärem Ausdruck.
So erkennst Du am Ende schnell, ob sich Bewertungen in einem Bereich häufen, zum Beispiel weil der Blog besonders viele schwache Inhalte hat. Daraus leitest Du Maßnahmen für ganze Bereiche statt für einzelne URLs ab.

Das erste sprechende Verzeichnis dient als Inhaltscluster.
Beispielformel:
=LET(_u;GLÄTTEN(A2);_e;LÄNGE(_u)+1;_o;LINKS(_u;MIN(WENNFEHLER(FINDEN(„?“;_u);_e);WENNFEHLER(FINDEN(„#“;_u);_e))-1);_r;WENN(ISTZAHL(FINDEN(„://“;_o));TEIL(_o;FINDEN(„://“;_o)+3;_e);WENN(LINKS(_o;2)=“//“;TEIL(_o;3;_e);_o));_x;WECHSELN(_r;“/“;WIEDERHOLEN(“ „;500));_s1;GLÄTTEN(TEIL(_x;501;500));_s2;GLÄTTEN(TEIL(_x;1001;500));WENN(ODER(_s1=“de“;_s1=“en“);_s2;_s1))
Backlinks
Sobald in einer der Spalten „Backlinks Semrush“ (Z) oder „Backlinks ahrefs“ (AA) ein Link steht, gibt die Formel in Spalte S „ja“ aus, sonst „nein“. Der Hintergrund: URLs mit einem guten Backlink sollen nicht einfach gelöscht, sondern weitergeleitet werden.

Die Spalte „Backlink?“ zeigt, ob eine URL mindestens einen brauchbaren Backlink hat.
Beispielformel für Spalte S:
=WENN(ODER(UND(GLÄTTEN(Z2)<>““;GLÄTTEN(Z2)<>“-„);UND(GLÄTTEN(AA2)<>““;GLÄTTEN(AA2)<>“-„));“ja“;“nein“)
Aktualität
Ein Artikel, der älter als ein Jahr ist, sollte aktualisiert werden, oder er ist ein Evergreen und braucht kein Datum. Inhalte, die jünger als 100 Tage sind, gelten als „Neuer Inhalt“, alles dazwischen als „Mittelalter Inhalt“.
Inhalte ohne Datum gibt die Formel als „Evergreen / Kategorie?!“ aus. Fehlerseiten, kanonisierte URLs, noindex-Seiten und Weiterleitungen behandle ich gesondert: Für sie gibt es eigene To-dos, unabhängig vom Score.

Alt, mittelalt oder neu: So wird die Aktualität jeder URL eingeordnet.

Die Spalte Aktualität ordnet jede URL nach Alter und Indexierbarkeit ein.
Auf dieser Spalte baut im nächsten Schritt der Aktualitäts-Score auf.
Schritt 3: Daten per VBA bewerten
Jetzt übernimmt das Makro. Jede Regel ist exakt definiert, deshalb liefert die Bewertung bei denselben Daten immer dasselbe Ergebnis. Das ist der entscheidende Unterschied zur LLM: Das Makro rechnet nicht ungefähr, es führt aus, was dasteht. Läuft der Audit in drei Monaten erneut, wendest Du dieselben Regeln auf die neuen Daten an und kannst die Ergebnisse direkt vergleichen. Und fragt jemand nach, zeigst Du die Regel statt einer Vermutung.
Meine Logik besteht aus mehreren Scores. Daraus bilde ich einen Gesamt-Score, aus dem ich am Ende die To-dos ableite.
Für den ersten Score zeige ich Dir den konkreten Prompt und die Makros, die Google Gemini und Claude daraus erstellt haben.
So promptest Du VBA-Code richtig
Je genauer Du Deine Daten und Regeln beschreibst, desto besser wird der Code. Wie Du Claude generell für SEO-Aufgaben nutzt, zeigen wir in Claude für SEO: 3 Cases, die Dir Stunden sparen. Ein guter Prompt für VBA enthält:
- Blattname und exakte Spaltennamen
- Datentypen und Formate, zum Beispiel deutsches Dezimalkomma
- die Logik Schritt für Schritt inklusive Prüfreihenfolge
- den Umgang mit leeren Zellen und Sonderfällen
- die gewünschte Ausgabe, etwa Zielspalte und Farbmarkierung
- die Bitte um Kommentare im Code
Teste neuen Code immer an einer Kopie Deiner Datei. Lass Dir von der KI erklären, was jede Zeile tut, und speichere funktionierende Makros als Vorlage für das nächste Projekt.
Beispiel 1: Aktualitäts-Score
Je nachdem, wie alt ein Inhalt ist, wird er besser oder schlechter eingeordnet. Nicht indexierbare Inhalte bewertet das Makro neutral mit 0:

Von der Einordnung zur Zahl: So entsteht der Aktualitäts-Score.
Hintergrund:
Je älter ein Artikel ist, desto dringender sollte dieser überarbeitet werden.
Prompt:
Erstelle eine performante VBA für die Score-Aktualität:
Zu bewertende Werte stehen in Spalte N, die Score-Aktualität soll in Spalte J geschrieben werden
WENN „Alter Inhalt“, DANN -1;
WENN „Neuer Inhalt“ ODER „Evergreen / Kategorie?!“, DANN +1;
WENN „Mittelalter Inhalt“, DANN +0,5
Sonst 0 (Nicht indexierbare URLs)

Gleiche Aufgabe, zwei Lösungen: der Aktualitäts-Score als VBA-Makro von Gemini und von Claude.
Was Gemini besser macht
- EnableEvents = False: Sinnvoll, falls im Blatt Worksheet Change-Makros liegen, die sonst beim Schreiben feuern.
- MsgBox als Rückmeldung: Geschmackssache, für Kolleg*innen ohne VBA-Erfahrung aber hilfreich. Es handelt sich hierbei um eine kleine Infobox, welche manuell festgelegte Inhalte ausgibt, wenn das Makro durchgelaufen ist, z. B. „Ermittlung Score-Aktualität beendet“.
Was Claude besser macht
- Kein Absturz bei nur einer Datenzeile: Das Gemini-Makro stürzt bei Tabellen mit einer einzigen Datenzeile ab. Die Claude-Version berücksichtigt diesen Sonderfall.
- Kein Absturz bei Formelfehlern: Steht in einer Zelle ein Fehlerwert wie #NV oder #WERT!, bricht das Gemini-Makro ab. Die Claude-Version vergibt in diesem Fall einfach den Score 0.
- Weniger Abbrüche, weniger Folgeschäden: Bricht das Gemini-Makro mit einem Fehler ab, bleiben die automatische Berechnung und die Makro-Ereignisse abgeschaltet. Formeln aktualisieren sich nicht mehr, und andere Makros reagieren nicht. Die Claude-Version fängt die häufigsten Abbruchgründe (eine einzige Datenzeile, Formelfehler) vorher ab und lässt die Ereignissteuerung gar nicht erst los. Einen vollständigen Fehler-Handler hat aber auch sie nicht: Den baut Claude erst im zweiten Makro mit „On Error GoTo Aufraeumen“ ein.
- Respektiert Deine Excel-Einstellungen: Wer Excel bewusst so eingestellt hat, dass Formeln nur auf Knopfdruck neu berechnet werden, findet nach dem Gemini-Makro wieder die automatische Berechnung vor. Die Claude-Version stellt die ursprüngliche Einstellung wieder her.
- Sauberer Programmierstil: Gemini nennt eine Variable „val“, obwohl VBA unter diesem Namen bereits eine eigene Funktion hat. Das funktioniert, ist aber unsauber und kann bei späteren Änderungen verwirren.
Selbst Gemini schätzt den Claude-Code als robuster ein:

So fügst Du das Makro in Excel ein
Das Makro steht, aber wohin damit? Arbeite bei Änderungen immer an einer Kopie Deiner Datei, denn Änderungen durch ein Makro lassen sich nicht mit Strg+Z rückgängig machen.
Zuerst blendest Du die Entwicklertools ein. Klicke dazu auf „Datei“ und dann auf „Optionen“.

Schritt 1: Excel-Optionen öffnen

Schritt 2: Menüband anpassen und „Entwicklertools“ einblenden.
Der Reiter „Entwicklertools“ erscheint jetzt im Menüband. Klicke dort auf „Visual Basic“, um den Editor zu öffnen.

Schritt 3: Den Visual Basic Editor öffnen.
Im Editor klickst Du auf „Einfügen“ und dann auf „Modul“. In das leere Fenster kopierst Du den Code, den die KI erstellt hat.

Schritt 4: Neues Modul anlegen und den Code einfügen.
Zum Starten klickst Du auf das grüne Play-Symbol oder drückst F5. Im folgenden Fenster wählst Du das Makro aus, hier „ScoreAktualitaet“, und klickst auf „Ausführen“. Später startest Du Makros direkt in Excel über „Entwicklertools“ > „Makros“ oder mit Alt+F8.

Schritt 5: Makro auswählen und ausführen.
Das Makro läuft durch und schreibt den Aktualitäts-Score in Spalte J.
Wichtig:
Speichere die Datei als „Excel-Arbeitsmappe mit Makros“ (.xlsm). Im normalen .xlsx-Format verwirft Excel den Code beim Speichern. Fragt Excel beim nächsten Öffnen nach, aktivierst Du die Makros über „Inhalt aktivieren“, sofern die Datei aus einer vertrauenswürdigen Quelle stammt.
Exkurs: Weitere Scores und der Gesamt-Score
Für das zweite Makro brauchst Du noch weitere Scores. Welche Bereiche Du bewertest, entscheidest Du selbst. Wichtig ist nur, dass jeder Score auf der Skala von -1 bis +1 bleibt.
Bei Messwerten mit großer Spannweite, etwa Traffic oder Wortanzahl, vergleichst Du jede URL mit dem Median aller URLs: Liegt der Wert darüber, gibt es +1, darunter -1, genau auf dem Median 0. Mehrere Kennzahlen fasst Du zu einem Score zusammen, indem Du ihre Werte addierst (Du kannst sie anschließend auch durch die Anzahl an Werten teilen).
Content-Score
Für den Content-Score (Spalte K) eignen sich zum Beispiel Lesbarkeit, Wortanzahl und die Zahl eindeutiger Inlinks.
SEO-Score
Für den SEO-Score (Spalte L) nehme ich Klicks und Impressionen aus der Search Console sowie den Traffic aus GA4.
Hinweis:
Der Median macht die Bewertung relativ. Auf einer durchweg schwachen Website bekommt trotzdem die Hälfte der URLs +1. Haben viele URLs gar keine Impressionen, liegt der Median oft bei 0. Das ist kein Fehler, sollte Dir aber bei der Interpretation bewusst sein.
Gesamt-Score
Für den Gesamt-Score (Spalte M) addiere ich alle Scores, gleich gewichtet. Mit Aktualitäts-, Content- und SEO-Score liegt er damit zwischen -3 und +3. Ist Dir ein Bereich wichtiger, gewichtest Du ihn einfach höher:
Multipliziere den Score mit einem Faktor, z. B. =J2+K2+2*L2, wenn der SEO-Score doppelt zählen soll. Damit verschiebt sich auch der Wertebereich, hier auf -4 bis +4. Willst Du wieder bei -3 bis +3 landen, teilst Du durch die Summe der Gewichte (hier 4) und multiplizierst mit der Anzahl der Scores (3): =(J2 + K2 + 2*L2)/4*3. So bleibt der Gesamt-Score trotz Gewichtung mit der ungewichteten Variante vergleichbar.
Zusätzlich übersetze ich den Gesamt-Score in Worte, von „Sehr gut“ bis „Sehr schlecht“. So können auch Kolleg*innen die Bewertung einordnen, die nicht mit den Zahlen arbeiten. Diese Inhaltsbewertung steht in Spalte O und fließt mit Stufen wie „Mittelmäßig“, „Schwach“ oder „Schlecht“ in die To-do-Regeln ein.
Beispiel 2: To-dos ableiten, die Reihenfolge entscheidet
Das Makro prüft die Regeln in fester Reihenfolge, die erste zutreffende Regel gewinnt. Ohne diese Reihenfolge würden sich Regeln überschneiden: Eine URL mit Score 1 und Bewertung „Mittelmäßig“ wäre sonst gleichzeitig „OK“ und „überarbeitungswürdig“.

Die Todo-Logik als Entscheidungsbaum: Jede URL bekommt genau eine Empfehlung.
Der Prompt für die Spalte „Todos“ (R):
Schreibe mir ein Excel-Makro, das die Ergebnisse in Spalte R schreibt.
- Technische Fehler & Status (Wert in Spalte C):
- WENN „↕ Weitergeleitete URL“, DANN „✂ Internen Link entfernen – Redirect“;
- WENN „⮽ Fehlerseite“, DANN „⛔ Internen Link entfernen – Fehlerseite“;
- WENN „⮾ Nicht indexierbar“, DANN „⚪ noindex“;
- WENN „◌ Nicht kanonische URL“, DANN „⚠ Nicht kanonische URL – Struktur/Relevanz prüfen“;
- Sonderfälle (Wert in Spalte A):
- WENN URL enthält „p=*“, „page=*“, „/page*/“ oder „/seite*“, DANN „! Paginierung“;
- WENN URL enthält „?*=*“, DANN „⛔ Parameter-URL – interne Verlinkung prüfen“;
- Indexierbare Inhalte (Aktualität in Spalte N, Inhaltsbewertung in O, Backlink? in S, Impressionen GSC 3 Monate in H, Traffic GSC 3 Monate in I, Gesamt-Score in M, Traffic GA 6 Monate in G):
- Löschen:
- WENN Aktualität = „Alter Inhalt“ UND Inhaltsbewertung = „Schlecht“ UND Backlink? = „nein“, DANN „✘ Löschen“;
- WENN Aktualität = „Alter Inhalt“ UND Inhaltsbewertung = „Schwach“ UND Impressionen GSC 3 Monate <= Median UND Backlink? = „nein“, DANN „✘ Löschen“;
- WENN Traffic GA 6 Monate = 0 ODER leer UND Traffic GSC 3 Monate = 0 ODER leer UND Aktualität ungleich „Neuer Inhalt“ UND Backlink? = „nein“, DANN „✘ Löschen – Kein Traffic“;
- Weiterleiten:
- WENN Aktualität = „Alter Inhalt“ UND Inhaltsbewertung = „Schlecht“ UND Backlink? = „ja“, DANN „↪ Weiterleiten“;
- Inhalt überarbeiten / aktualisieren:
- WENN Gesamt-Score 0 bis 2 UND Aktualität = „Evergreen“ UND Traffic GA 6 Monate > Median, DANN „✎ Inhalt überarbeiten“;
- WENN Gesamt-Score 0 bis 2 UND Aktualität ungleich „Alter Inhalt“ UND Inhaltsbewertung = „Mittelmäßig“, DANN „✎ Inhalt überarbeiten“;
- WENN Gesamt-Score 0 bis 2 UND Aktualität ungleich „Alter Inhalt“ UND Impressionen GSC 3 Monate > Median, DANN „✎ Inhalt überarbeiten: Interesse“;
- WENN Gesamt-Score > 0 UND Aktualität = „Alter Inhalt“ UND Inhaltsbewertung = „Mittelmäßig“, DANN „✎ Alten Inhalt aktualisieren?“;
- WENN Traffic GA 6 Monate > 0 UND Traffic GSC 3 Monate = 0 UND Impressionen GSC 3 Monate > Median, DANN „❓ GSC Impressionen prüfen – ggf. Interesse“;
- Noindex:
- WENN Traffic GSC 3 Monate = 0 ODER leer UND Traffic GA 6 Monate > 0 ODER leer, DANN „⚪ ggf. noindex – Kein SEO Traffic“;
- OK:
- WENN Gesamt-Score > 0,5 UND Aktualität ungleich „Alter Inhalt“, DANN „✔ OK“;
- Sonst:
- „❓ Manuelle Prüfung notwendig“
Auch hier war der Code von Claude robuster, deshalb nutze ich direkt diese Version:
Option Explicit
Option Compare Text ‚ Groß-/Kleinschreibung egal
Sub Handlungsempfehlung()
Dim ws As Worksheet, data As Variant, outArr() As Variant
Dim lastRow As Long, i As Long, n As Long
Dim medImp As Double, medTr As Double
Dim hasMedImp As Boolean, hasMedTr As Boolean
Dim calcMode As XlCalculation
Set ws = ActiveSheet
lastRow = ws.Cells(ws.Rows.Count, „A“).End(xlUp).Row
If lastRow < 2 Then Exit Sub
calcMode = Application.Calculation
Application.ScreenUpdating = False
Application.Calculation = xlCalculationManual
Application.EnableEvents = False
On Error GoTo Aufraeumen
data = ws.Range(„A2:S“ & lastRow).Value2
n = UBound(data, 1)
ReDim outArr(1 To n, 1 To 1)
hasMedImp = BerechneMedian(data, 8, medImp) ‚ Spalte H: Impressionen GSC
hasMedTr = BerechneMedian(data, 7, medTr) ‚ Spalte G: Traffic GA
For i = 1 To n
outArr(i, 1) = Empfehlung(data, i, medImp, hasMedImp, medTr, hasMedTr)
Next i
ws.Range(„R2“).Resize(n, 1).Value2 = outArr
Aufraeumen:
Application.Calculation = calcMode
Application.ScreenUpdating = True
Application.EnableEvents = True
If Err.Number <> 0 Then MsgBox „Fehler: “ & Err.Description, vbExclamation
End Sub
Private Function Empfehlung(data As Variant, i As Long, medImp As Double, hasMedImp As Boolean, medTr As Double, hasMedTr As Boolean) As String
Dim url As String, status As String, akt As String, bew As String, bl As String
Dim score As Double, impWert As Double, trWert As Double, gscWert As Double
Dim hasScore As Boolean, hasImp As Boolean, hasTr As Boolean, hasGsc As Boolean
Dim isAlt As Boolean, isEver As Boolean, isNeu As Boolean, score02 As Boolean
Dim impLow As Boolean, impHigh As Boolean, trHigh As Boolean
Dim gaPos As Boolean, gaZeroOrLeer As Boolean, gaPosOrLeer As Boolean
Dim gscZero As Boolean, gscZeroOrLeer As Boolean
url = Txt(data(i, 1))
status = Txt(data(i, 3))
akt = Txt(data(i, 14))
bew = Txt(data(i, 15))
bl = Txt(data(i, 19))
hasScore = Num(data(i, 13), score)
hasImp = Num(data(i, 8), impWert) ‚ H: Impressionen GSC 3 Monate
hasGsc = Num(data(i, 9), gscWert) ‚ I: Traffic GSC 3 Monate
hasTr = Num(data(i, 7), trWert) ‚ G: Traffic GA 6 Monate
‚ Logik Empfehlung 1. Technische Fehler & Status (Spalte C)
If InStr(status, „Weitergeleitete URL“) > 0 Then
Empfehlung = ChrW(&H2702) & “ Internen Link entfernen – Redirect“: Exit Function
ElseIf InStr(status, „Fehlerseite“) > 0 Then
Empfehlung = ChrW(&H26D4) & “ Internen Link entfernen – Fehlerseite“: Exit Function
ElseIf InStr(status, „Nicht indexierbar“) > 0 Then
Empfehlung = ChrW(&H26AA) & “ noindex“: Exit Function
ElseIf InStr(status, „Nicht kanonische URL“) > 0 Then
Empfehlung = ChrW(&H26A0) & “ Nicht kanonische URL – Struktur/Relevanz prüfen“: Exit Function
End If
‚ Logik Empfehlung 2. Sonderfälle (Spalte A)
If url Like „*[?&]p=*“ Or url Like „*[?&]page=*“ Or url Like „*/page*/*“ Or url Like „*/seite*“ Then
Empfehlung = „! Paginierung“: Exit Function
ElseIf url Like „*[?]*=*“ Then
Empfehlung = ChrW(&H26D4) & “ Parameter-URL – interne Verlinkung prüfen“: Exit Function
End If
‚ Logik Empfehlung 3. Indexierbare Inhalte
isAlt = (akt = „Alter Inhalt“)
isEver = (akt Like „Evergreen*“)
isNeu = (akt = „Neuer Inhalt“)
score02 = hasScore And score >= 0 And score <= 2
impLow = hasImp And hasMedImp And impWert <= medImp
impHigh = hasImp And hasMedImp And impWert > medImp
trHigh = hasTr And hasMedTr And trWert > medTr
gaPos = hasTr And trWert > 0
gaZeroOrLeer = (hasTr And trWert = 0) Or IstLeer(data(i, 7))
gaPosOrLeer = gaPos Or IstLeer(data(i, 7))
gscZero = hasGsc And gscWert = 0
gscZeroOrLeer = gscZero Or IstLeer(data(i, 9))
‚ Logik Empfehlung Löschen
If isAlt And bew = „Schlecht“ And bl = „nein“ Then
Empfehlung = ChrW(&H2718) & “ Löschen“
ElseIf isAlt And bew = „Schwach“ And impLow And bl = „nein“ Then
Empfehlung = ChrW(&H2718) & “ Löschen“
ElseIf gaZeroOrLeer And gscZeroOrLeer And Not isNeu And bl = „nein“ Then
Empfehlung = ChrW(&H2718) & “ Löschen – Kein Traffic“
‚ Logik Empfehlung Weiterleiten
ElseIf isAlt And bew = „Schlecht“ And bl = „ja“ Then
Empfehlung = ChrW(&H21AA) & “ Weiterleiten“
‚ Logik Empfehlung Inhalt überarbeiten / aktualisieren
ElseIf score02 And isEver And trHigh Then
Empfehlung = ChrW(&H270E) & “ Inhalt überarbeiten“
ElseIf score02 And Not isAlt And bew = „Mittelmäßig“ Then
Empfehlung = ChrW(&H270E) & “ Inhalt überarbeiten“
ElseIf score02 And Not isAlt And impHigh Then
Empfehlung = ChrW(&H270E) & “ Inhalt überarbeiten: Interesse“
ElseIf hasScore And score > 0 And isAlt And bew = „Mittelmäßig“ Then
Empfehlung = ChrW(&H270E) & “ Alten Inhalt aktualisieren?“
ElseIf gaPos And gscZero And impHigh Then
Empfehlung = ChrW(&H2753) & “ GSC Impressionen prüfen – ggf. Interesse“
‚ Logik Empfehlung Noindex
ElseIf gscZeroOrLeer And gaPosOrLeer Then
Empfehlung = ChrW(&H26AA) & “ ggf. noindex – Kein SEO Traffic“
‚ Logik Empfehlung OK
ElseIf hasScore And score > 0.5 And Not isAlt Then
Empfehlung = ChrW(&H2714) & “ OK“
Else
Empfehlung = ChrW(&H2753) & “ Manuelle Prüfung notwendig“
End If
End Function
‚ Text sicher auslesen (Fehlerwerte wie #NV werden zu „“)
Private Function Txt(v As Variant) As String
If Not IsError(v) Then Txt = Trim$(CStr(v))
End Function
‚ Zahl sicher auslesen; False, wenn leer, Text oder Fehler
Private Function Num(v As Variant, ByRef result As Double) As Boolean
If IsError(v) Or IsEmpty(v) Then Exit Function
If IsNumeric(v) Then result = CDbl(v): Num = True
End Function
‚ Leer = leere Zelle, nur Leerzeichen oder Fehlerwert (z. B. #NV)
Private Function IstLeer(v As Variant) As Boolean
IstLeer = (Txt(v) = „“)
End Function
‚ Median aller Zahlen einer Spalte
Private Function BerechneMedian(data As Variant, col As Long, ByRef med As Double) As Boolean
Dim vals() As Double, cnt As Long, i As Long, x As Double
ReDim vals(1 To UBound(data, 1))
For i = 1 To UBound(data, 1)
If Num(data(i, col), x) Then cnt = cnt + 1: vals(cnt) = x
Next i
If cnt = 0 Then Exit Function
ReDim Preserve vals(1 To cnt)
med = Application.WorksheetFunction.Median(vals)
BerechneMedian = True
End Function
Nach dem Durchlauf stehen in Spalte R die To-dos. Manuell prüfen musst Du die URLs mit „❓Manuelle Prüfung notwendig“: Auf sie passt keine der Regeln. Meist sind das alte Inhalte mit schwacher Bewertung, bei denen ich bewusst keine automatische Empfehlung vergebe, sondern jeden Fall einzeln ansehe.

Diese To-dos schreibt das Makro in Spalte R (je nach Datenbasis).
Kein Makro ist garantiert fehlerfrei, egal ob es von Gemini, Claude oder ChatGPT stammt. Die gute Nachricht: Die KI, die den Fehler verursacht hat, kann ihn auch beheben.

Die VBA-Fehlermeldung: Nach dem Klick auf „OK“ markiert der Editor die betroffene Zeile.
Diese Zeile kopierst Du zusammen mit der Fehlermeldung in den Chat:
Syntaxfehler:
Private Function Empfehlung(data As Variant, i As Long, medImp As Double, hasMedImp As Boolean, medTr As Double, hasMedTr As Boolean) As String

Claude findet die Ursache: „Imp“ ist in VBA ein reserviertes Wort.
Im Anschluss lässt Du Dir den korrigierten Code ausgeben. Übrigens: Genau dieser Fehler steckte in der ersten Fassung des To-do-Makros, im Code oben ist er bereits behoben.
Schritt 4: Ergebnisse prüfen
Deterministisch heißt nicht automatisch richtig. Ein Denkfehler in der Regel wird zuverlässig auf jede Zeile angewendet. Deshalb prüfe ich jede Auswertung, bevor sie unsere Kunden erreicht:
- Zeilen zählen: Stimmt die Zahl der URLs vor und nach dem Zusammenführen?
- Summen abgleichen: Vergleiche die Summe der Klicks mit der Oberfläche der Search Console. Die Summen dort enthalten auch Daten, die im Export abgeschnitten werden (Google).
- Leere Treffer zählen: Viele URLs ohne GA4- oder GSC-Werte deuten meist auf ein Normalisierungsproblem hin.
- Stichproben ziehen: Prüfe pro To-do einige URLs von Hand.
- Verteilung ansehen: Sollen plötzlich 80 Prozent aller Seiten gelöscht werden, stimmt vermutlich eine Schwelle nicht.
Fazit: Die KI programmiert, Excel rechnet
Sprachmodelle schreiben hervorragend Code, rechnen aber unzuverlässig. Wer SEO-Auswertungen direkt im Chat der LLM erledigt, bekommt Zahlen, die sich weder reproduzieren noch erklären lassen. Mit einem klaren Workflow aus
- Beschaffung,
- Aufbereitung,
- Bewertung und
- Prüfung
bleiben Rechenweg und Daten bei Dir.
Die Regeln in meinem URL-Audit sind ein Startpunkt, kein Gesetz. Passe Zeiträume und Schwellen an Dein Ziel an, schreib sie genau auf und lass Dir den Code dafür generieren.
Bevor Du eine Seite überarbeitest, lohnt sich ein Blick auf die Ursachen. Unsere Checkliste Warum rankt meine Seite nicht? hilft Dir dabei. Halte Deine Entscheidungen in der Kommentarspalte fest, dann weißt Du beim nächsten Audit, warum eine URL so bewertet wurde.
Du willst einen URL-Audit, der Kund*innen und Geschäftsführung überzeugt, weil jede Empfehlung nachvollziehbar ist? Dann lass uns sprechen: Mit unserer SEO-Beratung unterstützen wir Dich gern bei Audit, Auswertung und Umsetzung.
Häufige Fragen zu SEO-Auswertungen in Excel
In diesem Abschnitt beantworten wir oft gestellte Fragen zum Thema.
Kann ChatGPT SEO-Daten zuverlässig auswerten?
Nur eingeschränkt. Sprachmodelle machen Rechenfehler und liefern bei gleicher Eingabe nicht immer dasselbe Ergebnis. Nutze sie besser, um Code für die Auswertung zu schreiben, und lass Excel rechnen.
Wie exportiere ich mehr als 1.000 Zeilen aus der Search Console?
Über die Search Console API mit bis zu 50.000 Zeilen pro Tag und Suchtyp oder über den Bulk-Export nach BigQuery ohne dieses Limit. Bequem in Excel funktioniert der API-Zugriff mit SeoTools for Excel oder über die API-Anbindung im Screaming Frog.
Brauche ich Programmierkenntnisse für VBA?
Grundkenntnisse helfen, sind aber kein Muss. Wenn Du Deine Datenstruktur und Regeln exakt beschreibst, schreibt die KI den Code für Dich. Wichtig ist, dass Du ihn an einer Kopie testest und Dir erklären lässt.
Funktioniert der Workflow auch auf dem Mac?
Ja, mit kleinen Anpassungen. SeoTools for Excel läuft nur unter Windows, die Search-Console- und GA4-Daten holst Du auf dem Mac deshalb über die API-Anbindung im Screaming Frog. VBA gibt es auch in Excel für Mac, einzelne Befehle etwa für den Dateizugriff können sich aber unterscheiden.