SEO

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.

Bildschirm Laptop mit geöffneter Excel Datei und nebenbei ChatGPT geöffnet mit Code.

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-Makro, KI-Tools wie Copilot, ChatGPT und Claude sowie Python in Excel im Vergleich nach Rechenort, Reproduzierbarkeit, Wiederverwendbarkeit und Prüfbarkeit

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:

  1. Welche Entscheidung soll am Ende stehen? Und
  2. in welcher Reihenfolge bauen die Bewertungen aufeinander auf?

Erst daraus ergibt sich, welche Daten Du brauchst.

content-audit-excel-workflow.png Alt-Text: Prozessgrafik mit vier Stufen von links nach rechts: Beschaffung, Aufbereitung, Bewertung und Prüfung

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.

Aufbau der Master-Tabelle für den Content-Audit mit den Spalten A bis AA und ihren Inhalten

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:

  1. Welche URLs gibt es überhaupt? (Crawl der gesamten Domain mit dem Screaming Frog und Export der HTML-Seiten)
  2. 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
  3. 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).
Datenquellen für den Content-Audit – Google Search Console, Google Analytics 4, Semrush, ahrefs und Screaming Frog mit Zeitraum, Daten und Begründung

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.

Excel-Master-Tabelle für ein URL-Audit mit einer Zeile pro URL und Spalten für Statuscode, Wortanzahl, Inlinks, Datum, GA4-Traffic, GSC-Impressionen, GSC-Klicks, Indexierbarkeit, Title, Description, H1, Canonical und Backlinks

Die Master-Tabelle: eine Zeile pro URL, alle Datenquellen nebeneinander.

Für das Zusammenführen gibt es drei Wege:

SVERWEIS oder XVERWEIS, VBA mit Dictionary-Mapping und Power Query im Vergleich nach Vorteil, Nachteil und Zielgruppe

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.

Excel-Filter der Spalte Indexierbarkeit mit den Werten Fehlerseite, Nicht indexierbar, Nicht kanonische URL, Weitergeleitete URL und Indexierbar

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

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.

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.

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.

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:

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)

Tabelle: VBA-Makro zur Berechnung des Aktualitäts-Scores, links von Google Gemini, rechts von Claude erstellt

Gleiche Aufgabe, zwei Lösungen: der Aktualitäts-Score als VBA-Makro von Gemini und von Claude.

Was Gemini besser macht

  1. EnableEvents = False: Sinnvoll, falls im Blatt Worksheet Change-Makros liegen, die sonst beim Schreiben feuern.
  2. 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

  1. 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.
  2. 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.
  3. 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.
  4. 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.
  5. 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:

Antwort von Gemini, dass der Code von Claude deutlich besser und professioneller aufgebaut ist als die bisherigen Versionen
Gemini bewertet den Claude-Code als besser aufgebaut als die eigenen Versionen.

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“.

Im neuen Fenster wählst Du „Menüband anpassen“ und setzt rechts den Haken bei „Entwicklertools“.

Der Reiter „Entwicklertools“ erscheint jetzt im Menüband. Klicke dort auf „Visual Basic“, um den Editor zu ö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.

Visual Basic Editor mit geöffnetem Menü Einfügen, markiertem Eintrag Modul und eingefügtem VBA-Code für den Aktualitäts-Score

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.

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“.

Entscheidungsbaum für die Todos mit sieben Stufen: technische Fehler, Sonderfälle, Löschen und Weiterleiten, Inhalt überarbeiten, noindex, OK und manuelle Prüfung

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.

  1. 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“;
  1. 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“;
  1. 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.

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.

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

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.

Über Stefanie Niggemann
Stefanie studierte an der THWS Würzburg Wirtschaftsinformatik mit dem Schwerpunkt E-Commerce. Nach einem Ausflug in die Inhouse-SEO-Welt hat es sie zu den Online Marketing Agenturen verschlagen. Neben ihrer Leidenschaft zum bouldern ist sie auch gutem Essen mit Leib und Seele verfallen. Wenn sie also nicht gerade ihren Kleiderschrank oder ihr leibeswohl optimiert, dann tut sie das mit den Webauftritten diverser Unternehmen. Sehr gerne lernt die aber auch andere Länder und Kulturen auf Reisen kennen. Hier findest Du alle Beiträge von .
Kontakt

Wie können wir Dir helfen?

Dein Erfolg ist nur einen Klick entfernt. Verbinde Dich jetzt mit unseren Experten und lass uns gemeinsam Deine Ziele erreichen. Wir sind bereit, auf Deine individuellen Bedürfnisse einzugehen.

Lass und miteinander sprechen - kostenlos & unverbindlich

Karin Wagner

Deine Ansprechpartnerin:
Karin Wagner

Erstberatung

Kontaktformular für Landingpages FW

  • Dieses Feld dient zur Validierung und sollte nicht verändert werden.
  • Lass uns miteinander sprechen

    kostenlos & unverbindlich

    Karin Wagner, Seokratie Österreich
    Deine Ansprechpartnerin in Österreich:
    Karin Wagner

Werde fit in SEO und Content Marketing!
Unser kostenloser SEO-Kurs bringt Dir 5 Tage lang täglich SEO-Wissen in Dein E-Mail-Postfach und unseren Newsletter.
Abonnieren
​Du kannst Dich jederzeit wieder abmelden.
close-link