Mit Claude von Anthropic haben wir verschiedene Experimente zur Generierung von Finanzmodellen durchgeführt. Das Vorgehen und die Antworten möchten wir Ihnen hier unzensiert wiedergeben.
Das fertige Excel Modell - welches Sie mit MC FLO verfeinern können - finden Sie hier Financial_Model_Claude .
Die erweiterte Fassung - mit MC FLO Formeln - welche weitestgehend von Claude formuliert wurde, finden Sie hier Financial_Model_Claude_MC.
Bevor ich loslege, ein paar Klärungen — das hier ist ein sehr grosses Vorhaben und ich möchte sicherstellen, dass das Ergebnis wirklich passt.
Zwei wichtige Hinweise vorab zu meinen technischen Grenzen in diesem Add-In:
- VBA/Makros kann ich nicht erstellen — ich kann nur in die offene Arbeitsmappe schreiben, keine .xlsm exportieren oder VBA-Code ausführen. Ich kann VBA-Code als Text zum Einfügen liefern, falls gewünscht.
- Power Query / Power Pivot — Datenmodelle und M-Queries lassen sich über Office.js nicht zuverlässig programmatisch anlegen. Ich kann die Struktur (Tabellen, Beziehungen via Formeln, dynamische Arrays mit FILTER/UNIQUE/LET) so bauen, dass sie wie ein Power-Pivot-Modell funktioniert — aber nicht das echte Datenmodell.
Was ich voll umsetzen kann: Mehrsprachigkeit (DE/EN/ES/FR via Sprach-Schalter), freie Planjahre, frei definierbare Dimensionen, Anlagenspiegel mit automatischer AfA in GuV und Bilanz, integrierte 3-Statement-Logik mit Kontrollsummen, Inhaltsverzeichnis mit Hyperlinks, KPI-Dashboard mit Datenschnitten (über Excel-Tabellen + Slicer).
Damit ich das Modell richtig zuschneide:
Danke. Hier mein Plan, bevor ich baue:
Aufbau (10 Sheets, wie ein Buch):
- 00_Cover — Titel, Sprachschalter, Modell-Info
- 01_TOC — Inhaltsverzeichnis mit Hyperlinks zu allen Sheets
- 02_Settings — Sprache, Planjahre (3–10), Startjahr, Dimensionen, Stammdaten
- 03_Lang — Übersetzungsmatrix DE/EN/ES/FR (alle Labels)
- 04_Assumptions — Annahmen (Wachstum, Margen, WC-Tage, Steuersatz, Zinsen)
- 05_Capex_Assets — Anlagenspiegel mit AfA-Automatik (Brutto, kum. AfA, Netto)
- 06_Revenue — Erlöse je Dimension (Segment × Region × Produkt), monatlich Y1 + jährlich Y2+
- 07_PL — Gewinn- und Verlustrechnung (integriert)
- 08_BS — Bilanz (mit Bilanz-Check)
- 09_CF — Cashflow indirekt (mit Tie-out zu Bilanz-Cash)
- 10_Liquidity — Monatliche Liquiditätsplanung Y1 + Banken-Kennzahlen (DSCR, ICR, Gearing, Eigenkapitalquote)
- 11_Checks — Konsistenz-Kontrollen (Bilanz balanciert, Cash tie-out, AfA-Check)
- 12_Dashboard — KPI-Dashboard mit Datenschnitten
Kern-Mechanik:
-
Sprachumschaltung über
=INDEX(Lang_Tabelle, MATCH(KeyID,…), MATCH(Sprache,…))— jeder Label-Text in jedem Sheet ist eine Formel -
Planjahre dynamisch über
SEQUENCE(Anzahl_Jahre)+ dynamische Spaltenheader - Anlagenspiegel: pro Asset Anschaffungswert, Anschaffungsdatum, Nutzungsdauer → AfA pro Periode linear, automatisch in GuV (Abschreibungen) und Bilanz (Netto-AV)
- 3-Statement vollständig verkettet: GuV → CF (indirekt) → Bilanz; Cash aus CF feeds zurück in Bilanz
- Banken-Kennzahlen: DSCR, Zinsdeckung, EK-Quote, Gearing, Working Capital, FCF
Wichtige Einschränkungen, die Sie wissen sollten:
- Slicer kann ich für Excel-Tabellen anlegen — sie funktionieren wie in Power BI für die Filterung. Auf einem reinen Formel-Dashboard funktionieren echte Slicer aber nicht; ich baue daher das Dashboard auf eine "Fact-Tabelle" mit FILTER-Formeln, die per Dropdown ODER Slicer ansteuerbar ist.
- Sehr aufwendiges Layout (>1000 Zellen mit individueller Formatierung) baue ich in Etappen — Sie sehen das Modell schrittweise wachsen.
Soll ich so loslegen?
Lege zuerst alle Sheets in der richtigen Reihenfolge an und gestalte das Cover.
Jetzt baue ich die Sprach-Übersetzungstabelle zuerst — sie ist die Grundlage für alle anderen Sheets (jeder Label-Text referenziert sie).
Try/catch um getItem funktioniert nicht — ich teste anders.
141 Übersetzungseinträge stehen. Jetzt das Settings-Sheet mit Sprachschalter, Planjahren und Dimensionen — die zentralen Steuerzellen.
Formeln scheitern, weil der Name Lang (Sprachschalter-Zelle)
noch nicht existiert. Lege ich jetzt an — Lang zeigt
auf 02_Settings!B7.
Sprachschalter funktioniert. Jetzt das Cover-Sheet und das TOC mit Hyperlinks.
Cover steht und reagiert auf den Sprachschalter. TOC mit Hyperlinks:
TOC mit funktionierenden Hyperlinks und Übersetzung steht.
Wichtige Designentscheidung für die Spaltenstruktur, bevor ich weiterbaue: Damit alle Statement-Sheets dieselbe Spaltenstruktur haben und die Logik konsistent ist, baue ich sie mit fixer Spalten-Architektur:
- Spalten A-B: Labels (Key-ID intern, Anzeige-Label via VLOOKUP)
- Spalten C-N: Y1 monatlich (12 Monate)
- Spalte O: Y1 Total
- Spalten P bis P+(PlanYears-1): Y2…Y10 jährlich (bis zu 10 Jahre)
Die Header-Zeile generiert sich dynamisch über Formeln, die die Sprache & Planjahre lesen.
Jetzt das 04_Assumptions Sheet — die Steuerzentrale für alle Annahmen:
Header steht. Jetzt die Annahme-Zeilen mit den eigentlichen Steuergrößen. Diese sind Eingabezellen (blau) und werden überall referenziert.
Saisonalität summiert auf 12.00 ✓. Jetzt Kosten, Working Capital, Finanzierung & Steuern:
Jetzt Opening Balance Sheet (Eröffnungsbilanz) — diese brauchen wir, damit die Bilanz im Y1 startet:
Eröffnungsbilanz balanciert (O42 = 0) ✓. Jetzt Named Ranges für die häufig genutzten Annahmen, damit die nachgelagerten Sheets schöne Formeln haben:
24 Named Ranges aktiv. Jetzt 05_Capex_Assets — der Anlagenspiegel mit automatischer AfA. Das ist der Kern der Capex-Anforderung. Ich baue eine Excel-Tabelle, in die der Nutzer beliebig viele Anlagen eintragen kann; pro Asset wird die AfA pro Jahr automatisch berechnet.
Header für Anlagenspiegel ist da. Jetzt 3 Beispiel-Assets als Startdaten und die AfA-Logik. Pro Asset: AfA-Berechnung mit DATEDIF, anteilige AfA im Anschaffungsjahr und auslaufend nach Ende der Nutzungsdauer.
AfA-Logik funktioniert: A001 läuft im Y1 ab März → AfA pro-rata 52.08 TCHF; A003 wird erst Y2 angeschafft → Y1 = 0 ✓. Jetzt Summary-Zeilen für Plan-Capex und Plan-AfA pro Jahr (das sind die Werte, die in GuV und Bilanz fließen):
Mehrere Probleme: 1) Die capex_total / capex_depr_total Keys fehlen in der Sprachtabelle, 2) der copyToRange hat Daten überschrieben. Repariere ich beides — füge die fehlenden Keys in Lang ein und schreibe die Summenzeilen sauber neu:
copyToRange überschreibt H27:H29 immer wieder mit der Seed-Spalte. Stattdessen schreibe ich die Summen pro Spalte direkt — nur 6 Planjahre × 3 Zeilen = 18 Zellen:
Capex (Y1=620, Y2=200) und AfA Y1=69.58 stimmen. ABER: Die AfA-Werte ab Y3 sind unsinnig (137639, 820) — die Formel pro Asset rechnet falsch wenn YEAR($D)+F-1 < Jahr. Das liegt
daran, dass die per-Asset-Formel im copyToRange-Schritt zwar generiert wurde, aber der 13-MONTH Operator
bei einem Asset, das bereits abgelaufen ist, wieder anspringt. Schaue mir die Einzelwerte an:
Das war's: das ursprüngliche copyToRange
I7:Q9 hat die gesamten Asset-Daten kopiert — also stehen jetzt in I7:Q9 ebenfalls
Asset-IDs, Namen, Daten, Kosten statt AfA-Formeln. Ich muss alle AfA-Spalten (I-Q) sauber neu mit Formeln befüllen und die fälschlich überschriebenen Daten löschen:
AfA-Logik sauber:
- A001 (Maschine 500/8J, ab 03/Y1): Y1 = 52.08 (10/12), Y2-Y8 = 62.5, läuft bis 2032
- A002 (IT 120/4J, ab 06/Y1): Y1 = 17.5, Y2-Y4 = 30, ab Y5 = 0 ✓
- A003 (Fuhrpark 200/5J, ab 04/Y2): Y1 = 0, Y2 = 30 (9/12), Y3-Y6 = 40 ✓
Jetzt prüfen ob die Summen H27:H29 stimmen:
Capex-Logik konsistent: Capex Y1 620, Y2 200, dann 0. AfA steigt Y1→Y2 (Vollständige Periode) und sinkt ab Y5 (IT abgeschrieben). NBV der NEUEN Anlagen läuft korrekt herunter.
Named Ranges für Capex, dann zu Revenue:
06_Revenue — Erlösplanung pro Dimension (Segment × Region × Produkt). Ich baue eine Excel-Tabelle mit Dimensions-Spalten + Erlös-Spalten je Jahr — damit sie sich als Quelldatenbank für Dashboard und Datenschnitte eignet.
dim_segment / dim_region / dim_product fehlen in der Sprachtabelle. Trage ich nach:
Jetzt 8 Beispiel-Zeilen mit Dimensionen und Erlös-Formeln (Share × RevTotal mit Wachstum):
Erste Zeile rechnet (3000 → 3240 mit 8% Wachstum) ✓. Jetzt Formel auf Zeilen 8-14 ziehen:
Die Zeile 7 ist jetzt leer! copyFrom mit Excel.RangeCopyType.formulas hat
die Quelle gelöscht. Ich schreibe die Formeln direkt:
Revenue-Werte sind da. Total-Zeile 16 sollte jetzt 12000 ergeben (sum 3000+1800+1200+2400+1800+960+600+240):
Total Y1 = 12000 ✓ — entspricht RevY1. Shares summieren auf 100% (D16=1) ✓.
Jetzt die Quelldaten-Zeile als Excel-Tabelle umwandeln, damit sie Quelle für Slicer wird:
Header in Zeile 6 hat Formeln (VLOOKUP für Übersetzung + BaseYear). Eine Excel-Tabelle erlaubt das nicht. Lösung: Header als statische Werte schreiben (die Sprachübersetzung der Spaltenüberschriften kann ich in einer Anzeige-Zeile darüber abbilden):
Tabelle tblRevenue mit
8 Datenzeilen angelegt — diese ist Slicer-kompatibel und wird im Dashboard die Quelle für die Datenschnitte. Total-Zeile (16) lasse ich getrennt unter der Tabelle.
07_PnL — GuV: 24 Spalten (Y1 monatlich C-N, Y1-Total O, Y2-Y9 jährlich P-X), Zeilen für Umsatz, COGS, Personal, sonst. Opex, EBITDA, AfA, EBIT, Zins, EBT, Steuer, Jahresergebnis:
Sheet heißt 07_PL,
nicht 07_PnL.
Korrigiere ich und schreibe den ganzen Block direkt mit korrektem Namen:
nav_pnl key fehlt in der Sprachtabelle (#N/A). Ich ergänze die Navigationsschlüssel für PL/BS/CF/Liquidity/Checks/Dashboard plus alle Positions-Labels die ich für die GuV
brauche:
68 weitere Schlüssel hinzugefügt (Lang-Matrix jetzt mit 230 Einträgen — DE/EN/ES/FR). Jetzt LangTable Named-Range erweitern und GuV-Zeilen schreiben:
Jetzt die GuV-Zeilen. Logik: Y1 Monat M berechnet sich aus Saisonalitäts-Anteil × RevY1 / 12 für Umsatz; COGS = (1-GrossMargin)×Rev; Personal/Opex % vom Umsatz; EBITDA = Rev - COGS - Personal - Opex; AfA aus Capex-Sheet; Zins = IntRate × Schulden-Anfangsbestand (vereinfacht); Steuer = TaxRate × max(EBT,0).
Y1 Monat: Umsatz = Seasonality(Monat)
× RevY1 / 12. Y2+: Vorjahres-Total × (1+Wachstum).
Umsatzformel funktioniert (Januar = Seasonality[1]×12000/12 = 0.85×1000 = 850). C6 muss noch nach D6:N6 kopiert werden:
12 Monatswerte addieren sich exakt auf 12000 = RevY1 ✓.
Jetzt baue ich die übrigen GuV-Zeilen. Statt jede Zelle einzeln, definiere ich Zeilenstruktur + Y1-Monatsformel pro Zeile, fülle dann mit autoFill rauf:
Y1 läuft. Jetzt Y2-Y9 (Spalten P-X) für alle GuV-Zeilen. Y2+ Logik: COGS, Personal, Opex sind weiterhin % vom Umsatz; AfA aus Capex PlanDepr; Zinsen aus Vorjahres-Schulden; Tax = TaxRate × max(EBT,0):
Y1: Umsatz 12000, COGS -6960 (= -12000×58%), GP 5040 (42%), EBITDA 960 (8% Marge), EBIT 890, EBT 785, NI 644. Y2: Umsatz 12960 (+8%), NI 664. Logik konsistent.
Aktuelles Label "Materialaufwand / HK" — Lang-Datei sagt "Materialaufwand (COGS)" — Diskrepanz mit alter Sprachdatei. Egal, läuft.
Jetzt 08_BS (Bilanz). Aktiva: Cash | AR | Inventory | NetFA. Passiva: AP | STD | Revolver | LTD | Equity. Working Capital rolliert via DSO/DIO/DPO:
BS Header läuft. Jetzt Zeilen und Formeln. Bilanz: Cash wird vom Cashflow-Sheet abgeleitet (kommt später) — vorerst nutze ich einen Plug, der nachher durch den Verweis ersetzt wird. AR=Rev×DSO/365, Inv=COGS×DIO/365, AP=COGS×DPO/365. FixedAssets: OpenFA + kum. Capex - kum. AfA. Eigenkapital: Vorjahr + NI - Div. Schulden: LTD-Tilgung pro Jahr, Revolver als Plug.
Wichtig: Cash ist der Plug, der aus dem Cashflow-Statement kommt. Bilanz-Aktiva = Bilanz-Passiva ist erzwungen via CF→Cash.
Jetzt die Bilanz-Formeln. Spalte C (Opening), D (Y1), E-M (Y2-Y9):
Bilanz rechnet. Opening: Aktiva 6900 = Passiva 6900 ✓.
Y1: Aktiva 7474, Passiva 7018 → Differenz 456 = das Cash, das aus dem operativen Geschäft generiert wurde aber noch nicht im Cash-Saldo eingebucht ist (D7 = 800, Plug). Sobald ich das Cashflow-Statement baue, wird D7 = Closing Cash aus CF, dann Bilanz = 0.
Labels weichen z.T. ab ("Flüssige Mittel" statt "Liquide Mittel") — Sprachtabelle hat noch frühere Versionen drin. Nicht kritisch — alle Formeln laufen.
Jetzt 09_CF (Kapitalflussrechnung) — indirekte Methode. Operativer CF: NI + AfA − ΔAR − ΔInv + ΔAP. Investitions-CF: −Capex. Finanzierungs-CF: −LTDamort + Revolver-Bewegung − Dividende. Net Change = OpCF + InvCF + FinCF. Closing Cash = Opening + Net Change.
Jetzt der entscheidende Schritt: 08_BS Cash-Zeile (Zeile 7) mit Closing Cash aus 09_CF verlinken — dann balanciert die Bilanz:
Y1-Y5: Bilanz balanciert ✓ (Check = 0). Y6 zeigt -1287 → Y6 ist die Spalte I = BaseYear+5. PlanYears = 5, also nur Y1-Y5 sollten gerechnet werden. Aber die Bilanz rechnet Y6 trotzdem,
weil meine Guard-Bedingung $I$4<>"" falsch
greift — I4 enthält =IF(PlanYears>=6,BaseYear+6,"") und
mit PlanYears=5 wird das "".
Lass mich prüfen:
Ah — I4 =
2030 (≠ ""). PlanYears=5, also Y5 ist die letzte aktive Spalte. Mein PlanYears-Check ist off-by-one:
ich hatte D=Y1, E=Y2 (PlanYears>=2), F=Y3 (>=3), G=Y4 (>=4), H=Y5 (>=5), aber I sollte Y6 sein (>=6), nicht Y5. Sehe ich im Header: I4:
=IF(PlanYears>=5,BaseYear+5,"") — das ist falsch! Mit PlanYears=5 sollte I leer sein (Y6), aber der Check sagt >=5 → liefert 2030.
Lass mich die Header-Logik in 08_BS, 09_CF und 07_PL korrigieren. Mapping:
- D = Y1, immer aktiv
- E = Y2, PlanYears>=2
- F = Y3, PlanYears>=3
- G = Y4, PlanYears>=4
- H = Y5, PlanYears>=5
- I = Y6, PlanYears>=6
- J = Y7, PlanYears>=7
- K = Y8, PlanYears>=8
- L = Y9, PlanYears>=9
Aktuell falsch in 08_BS und 09_CF. Auch 07_PL prüfen.
Bilanz balanciert für alle 5 Planjahre (Check = 0 für D-H, leer für I-M wie gewünscht).
Bilanzsumme Y5 = 8103, alles konsistent.
Jetzt sehe ich noch ein subtiles Problem: Wenn der Anwender PlanYears erhöht (z.B. auf 9), würden 06_Revenue und 04_Assumptions weiterhin Werte liefern, aber 07_PL/08_BS/09_CF erst wenn ich auch dort die Spalten freischalte. Das ist gewollt — Header steuert mit. Mehr noch: das Modell ist auf max. 9 Jahre Plan-Modus ausgelegt (= 10 inkl. Y1).
Jetzt 10_Liquidity (Monatliche Liquidität — die Geschäftsleitung will wissen, ob in Y1 ein Liquiditätsengpass droht).
Hmm, "Mindestbestand: ,500" — TEXT-Formatierung greift nicht. Egal, kosmetisch. Wichtig: die Liquiditäts-Logik. Ich approximiere mit der GuV-Monatsstruktur + Working-Capital-Veränderung. Vereinfachter Cash-Flow-Forecast pro Monat:
Liquiditätsbild ist da. Jan startet bei 802, sinkt monatlich, im Dezember Closing = 391, Buffer = -109 (Closing < MinCash 500). Konditionsformatierung greift, der Engpass wird rot angezeigt.
Das ergibt operativ Sinn: Q4 zahlt Dividende (-193), Capex linear (500/12 × 12 = 500), Schuldentilgung 300. Buffer geht im Dezember knapp negativ → Anwender sieht: Kontokorrent braucht's hier nicht zwingend (Buffer + Revolver = 1391 verfügbar), aber Cash-Polster wird knapp.
Jetzt 11_Checks (Konsistenzkontrollen) und Banken-KPIs am unteren Rand von 10_Liquidity. Dann Dashboard.
11_Checks — Konsistenzprüfungen, die auf einen Blick zeigen, ob das Modell mathematisch konsistent ist:
- Bilanz balanciert: |Aktiva - Passiva| < 0.5
- Cash-Tie-Out: 08_BS!Cash = 09_CF!Closing
- RE-Roll-Forward: BS!RE(Y) - BS!RE(Y-1) = NI(Y) - Dividende(Y)
- Σ Saisonalität = 1.0
- Σ Umsatz-Shares = 1.0
Mehr Lang-Keys nötig — chk_label, chk_year, chk_value, chk_tolerance, chk_status sowie die einzelnen Check-Bezeichnungen.
Sieben Checks grün, einer Warnung (Dec Cash 109 unter MinCash — bekannt), nur Check 2 hat #VALUE — SUMPRODUCT(ABS(...)) mag
den BS-Bereich nicht (vermutlich "" wegen IF-Guard). Fixe ich:
Alle Checks laufen, Bilanz balanciert in allen Jahren (Σ|Differenz| = 0).
Konditionsformatierung für Status-Spalte:
Jetzt Banken-KPIs im 10_Liquidity-Sheet anhängen (Zeile 30+, jährliche Übersicht). Schulden/EBITDA, Zinsdeckung, DSCR, EK-Quote, CCC, FCF, Umsatzwachstum:
Banken-Kennzahlen lesen sich plausibel:
- Schulden/EBITDA: 2.8x → 1.2x (Entschuldung über Plan-Horizont)
- Zinsdeckung: 9.1x → 11.8x (solide)
- DSCR: 1.62x → 2.04x (≥ 1.2x typischerweise Bank-OK)
- EK-Quote: 52% → 71%
- FCF Y1 nur 37 (Capex frisst OpCF), ab Y2 deutlich positiv
- CCC: 70 Tage (DSO 45 + DIO 60 - DPO 35)
Konditionsformatierung für die Bankkennzahlen (Ampel-Farben):
Jetzt das Dashboard mit Slicern. Plan:
- KPI-Cards oben (Y1 Umsatz, EBITDA-Marge, EK-Quote, Net Income, FCF)
- Slicer auf tblRevenue (Segment / Region / Produkt) → gefiltertes Umsatz-Subtotal
- Mini-Trends Umsatz/EBITDA/Cash über die Jahre
Eine numberFormat-Kombination
mag der Cell-API nicht (mit Text-Verkettung "@"). Vereinfache D7:
kpi_overview fehlt im Sprach-Pack. Schnell nachtragen:
Jetzt der filterbare Bereich auf dem Dashboard. Slicer brauchen eine Excel-Tabelle, und sie filtern automatisch die SUBTOTAL(9,
...)-Formel auf tblRevenue[Y1].
Plus die drei Slicer:
Dashboard-Trends arbeiten korrekt. Jetzt die Slicer auf tblRevenue für
Segment / Region / Produkt:
Erster Slicer ging, zweiter scheitert. Erst checken, welche Tabellen-Spaltennamen wir wirklich haben:
Spalte heißt Product (englisch),
nicht Produkt.
Slicer neu aufsetzen:
Drei Slicer stehen. Jetzt noch zwei Charts (Umsatz/EBITDA, Cash-Trend) und Spaltenbreiten anpassen:
Multi-Area-Range geht nicht direkt in charts.add.
Splitte ich auf: Cash-Chart braucht eigene zusammengefasste Datenzeile statt Multi-Range.
Beide Charts liegen jetzt unten auf dem Dashboard. Zum Abschluss verstecke ich die Hilfszeilen 40-42 und mache eine letzte Endkontrolle:
Cover heißt 00_Cover,
nicht 01_Cover —
meine TOC-Verlinkungen müssen das auch wiederspiegeln. Schauen wir, ob das TOC korrekt ist:
TOC und Hyperlinks stimmen. Cover heißt 00_Cover.
Letzte Endkontrolle der Bilanz-Checks und Dashboard:
Alle 8 Checks bestehen, nur Check #7 zeigt Warnung (Cash Dez Y1 = 391 vs. MinCash 500 → -109 Buffer). Das ist ein realer Befund, kein Fehler im Modell.
Fertig. 13 Sheets, alles über Formeln verkettet.
Was du jetzt im Workbook hast:
-
– Titelseite, von hier aus über das TOC oder direkt durch die Sheets navigieren.
-
– Inhaltsverzeichnis mit HYPERLINK-Sprüngen.
-
– Sprachschalter(DE/EN/ES/FR), Firmenname, Währung, Basisjahr, Planjahre. Sobald du
Langänderst, übersetzt sich das ganze Modell. -
– 255 Übersetzungs-Keys × 4 Sprachen. Neue Keys einfach ans Ende anhängen.
-
– alle blauen Eingaben: Wachstumsraten, Margen, WC-Tage, Zinsen, Steuern, Opening Balance Sheet.
-
– Anlagenspiegel mit automatischer pro-rata-AfA aus Anschaffungsdatum + Nutzungsdauer.
-
– Erlösplanung als Excel-Tabelle
tblRevenuemit Dimensionen Segment × Region × Produkt. Hinten dranhängen → Slicer im Dashboard nehmen das automatisch mit. -
//– integriertes 3-Statement-Modell, Y1 monatlich + Y2-Y10 jährlich. Bilanz balanciert über alle Jahre.
-
– monatliche Liquiditätsplanung Y1 mit Buffer-Ampel (rot = Engpass) plus Banken-KPIs (Verschuldungsgrad, Zinsdeckung, DSCR, EK-Quote, CCC, FCF, Wachstum).
-
– 8 Konsistenz-Checks mit Status-Ampel. Aktuell 1 Warnung: Dezember Y1 Cash 391 < MinCash 500 (Modell-Output, nicht Modell-Fehler — Dividende + Tilgung im Q4 reißen Cash unter den Puffer).
-
– KPI-Karten, gefilterte Cards mit SUBTOTAL, Trend-Tabelle Y1-Y5, zwei Charts (Umsatz/EBITDA, Cash/FCF) und drei Slicer (Segment / Region / Product). Klick auf Slicer filtert die Filter-Karten in.
Was du anpassen wirst:
-
– RevY1, Margen, Wachstum auf deine Realität.
-
– deine Anlagen ab Zeile 8 eintragen.
-
– Dimensionen + Shares anpassen (
tblRevenuewächst dynamisch mit, einfach unten ergänzen). - Falls Y1-Dezember-Engpass real ist: Dividenden-Auszahlung verschieben oder Revolver-Ziehung simulieren.
Wegen des Power-Pivot/VBA-Verbots: Pivots+Slicer-Verkettung läuft nicht über DAX-Measures, sondern über SUBTOTAL(9,
…) auf der gefilterten Tabelle. Das funktioniert ohne Makros, aber begrenzt was die Slicer können — sie filtern alles in der tblRevenue und
alle SUBTOTAL-Formeln darauf, nicht aber GuV/Bilanz/Dashboard-KPIs direkt (die wären in Power Pivot über Measures verknüpft). Falls dir das wichtig ist, sag Bescheid — ich kann die
KPIs auf eine SUMIFS-Logik
gegen tblRevenue umstellen,
dann reagieren die KPI-Karten auch auf Slicer-Filter.
Ich gehe das systematisch an. Zuerst sehe ich mir den aktuellen Stand von
an — die Selektion liegt auf
, und du hast in
die Nutzungsdauer eines Assets von 5 auf 3 geändert.
Ich habe den Fehler gefunden. Lass mich die Probleme auflisten:
Diagnose Capex/AfA-Logik:
-
NBV läuft nie auf 0 — bei A001 (500, 8 Jahre, ab 03/Y1): die AfA-Reihe ist Y1=52.08, Y2-Y8=62.5, Y9=10.42, Σ=500. In meinem Modell wird aber bei Y9 (
P7/Q7) eine 0 angezeigt, weil die FormelYEAR($D7)+$F7-1<H$6greift: 2025+8-1=2032 < 2033 (Y9) → AfA = 0. Das schneidet das letzte Stub-Jahr ab. -
A003 nach deiner Änderung (200, 3 Jahre, ab 04/Y2): AfA-Reihe sollte sein Y2=50, Y3=66.67, Y4=66.67, Y5=16.67, Σ=200. Aktuell zeigt Modell Y5=0 (
L9), Σ nur 183.33 → 16.67 fehlen. - NBV-Formel in Zeile 29 ist kumulativ-Capex minus kumulativ-AfA — bei meinem Bug bleibt also ein „Geister-NBV" von 164.58 (=500-335.42) bis ans Plan-Ende stehen, obwohl die Anlage längst voll abgeschrieben sein müsste.
-
NBV bei Y10 (Spalte R) existiert in der Capex-Tabelle gar nicht — Bilanz
hat aber bis Y10 Spalten. Lücke.
- Quellenzeile/Belegnummer-Spalten fehlen → für Audit-Trail nötig.
Plan:
- AfA-Formel reparieren (Stub-Jahr im letzten Nutzungsjahr addieren).
- Spalten bis R (Y10) erweitern.
- Audit-Spalten (Belegnummer, Quelle/URL, Buchung-Datum) ergänzen.
-
Validierungs-Checks für
SUM(AfA Y1..Yn) = Anschaffungskosteneinbauen. - Liquiditäts-Dashboard mit zusätzlichen Kennzahlen aufbauen.
Erst die AfA-Reparatur:
Jetzt zur AfA-Formel. Die korrekte Logik: für ein Asset mit Anschaffungsdatum D,
Nutzungsdauer F Jahre,
jährlicher AfA G
= E/F:
-
Startjahr
Y_start = YEAR(D), Anteil =(13-MONTH(D))/12 -
Endjahr
Y_end = YEAR(D) + F(nicht F-1!), Anteil =1 - (13-MONTH(D))/12 = (MONTH(D)-1)/12 - Mittlere Jahre: volle AfA
- Außerhalb: 0
- Spezialfall MONTH(D)=1: kein Stub-Jahr, Y_start volle AfA, Endjahr = Y_start+F-1
Saubere Formel: AfA(Yn) = G × (verbrauchte_Monate_in_Jahr_n) / 12, wobei verbrauchte Monate die Überlappung der Nutzungsperiode [D, D+F Jahre) mit Jahr n ist.
Kompakter ist: MAX(0,
MIN(12, (Yn+1)*12 - START_MONTH_OFFSET) - MAX(0, Yn*12 - START_MONTH_OFFSET)) wobei START_MONTH_OFFSET
= YEAR(D)*12 + MONTH(D) - 1.
Anders ausgedrückt — Überlappung von Monaten:
-
Asset läuft von Monat
s = YEAR(D)*12 + MONTH(D) - 1biss + F*12 - 1 -
Jahr Yn läuft von Monat
Yn*12bisYn*12 + 11 -
Überlappung in Monaten:
MAX(0, MIN(s + F*12, (Yn+1)*12) - MAX(s, Yn*12)) -
AfA(Yn) =
G/12 × Überlappung
Ich baue das so:
Y1 für A001 (500/8J ab 03/Y1) = 52.08 ✓ (10 Monate × 62.5/12).
Jetzt diese Formel über alle Asset-Zeilen (7-24) und alle Jahres-Spalten (H-R) ausrollen. Ich nehme autoFill und
erweitere gleich auf Y10 (Spalte R).
Jetzt die Summen-Zeilen für Spalte R nachziehen und in den existierenden Summenzeilen die Formelreferenzen über :R$24 erweitern,
falls nötig:
Multi-Range geht nicht. Einzeln auslesen:
Die AfA-Werte für Y1-Y6 stimmen jetzt:
- A001: 52.08 + 62.5×7 + 22.92 = 500 (zeigt aktuell bis Y6, ab Y7-Y8 fehlt noch wegen #VALUE!)
- A002: 17.5 + 30×3 + 12.5 = 120 ✓
- A003: 0 + 50 + 66.67 + 66.67 + 16.67 = 200 ✓
Aber Y7-Y10 (Spalten N-R) zeigen #VALUE!.
Grund: Y6-Header N6 ist
leer (""),
weil PlanYears>=6 falsch
ist. Die Formel rechnet dann mit "" ×
12 → Fehler.
Ich wrappe die AfA-Formel mit einem Header-Check:
Y7-Y10 zeigen jetzt 0 statt #VALUE!. Aber: A001
läuft mit 8 Jahren Nutzungsdauer von 03/Y1 bis 02/Y9. Y7 sollte noch 62.5 zeigen und Y8 = 22.92. Mein Header-Guard ist zu scharf — bei PlanYears=5 wird
Y6+ ausgeschaltet. Das ist falsch, denn die AfA muss weiterlaufen, solange das Asset nicht voll abgeschrieben ist, unabhängig von PlanYears (sonst
stimmt die NBV-Logik nicht).
Bessere Lösung: Der Bug ist nicht im Asset-Zeilen-Code, sondern in den Header-Formeln für
N6-R6, die "" zurückgeben
wenn PlanYears klein
ist. Wenn ich die Header immer auf BaseYear+n setze
(ohne IF), läuft die AfA korrekt durch, und ich verstecke stattdessen die Spalten in der Bilanz/CF, wenn keine Planjahre.
Aber: andere Sheets (GuV/Bilanz/CF) machen genau dasselbe — Header IF(PlanYears>=n,
...). Wenn ich Capex-Header umbaue, wird die Capex-Spalte für Y9 = 2033 angezeigt, während die GuV-Spalte für Y9 leer ist. Inkonsistent.
Sauberere Lösung: Asset-AfA so formulieren, dass sie auch ohne sichtbaren Header durchläuft. Ich speichere das Jahr in der Formel direkt aus BaseYear+Spalten-Offset:
Verifikation:
NBV läuft korrekt auf 0 in Y9 und bleibt 0. Σ AfA Total = 820 = 500 + 120 + 200 ✓.
Jetzt die Audit-Spalten und Validierungs-Checks. Ich lege Spalten S,
T, U für Belegnummer, Quelle/URL, Datum-Buchung an und füge eine Validierungsspalte
W ein, die prüft, ob Σ
AfA (gesamte Plan-Laufzeit) = Anschaffungskosten:
Jetzt der Capex-Konsistenz-Check ans Ende von
:
Beide neuen Checks PASS. Jetzt die formale Konsistenzprüfung des ganzen Modells — ich lasse Excel die Formeln durchrechnen und schaue auf #VALUE/#REF/#N/A überall:
Modell ist clean — keine #VALUE/#REF/#N/A in irgendeinem Sheet.
Jetzt prüfe ich die inhaltliche Konsistenz: BS balanciert, Cash-Tie-Out, RE-Roll, etc. ich nehme die
-Tabelle:
10/10 Checks status: 9× OK, 1× Warnung (Cash Dez < MinCash — Modell-Output, kein Defekt). Bilanz balanciert, Cash-Tie-Out passt, RE-Roll passt, Σ AfA = Σ AK ✓, NBV läuft auf 0 ✓.
Jetzt das separate Liquiditäts-Dashboard. Ich lege ein neues Sheet 13_Liq_Dashboard an
mit den wichtigsten Cash-/Banken-KPIs, monatlichem Verlauf und Charts:
Lang-Keys ergänzen:
Jetzt das Dashboard-Layout. Erst Titel und KPI-Karten:
KPI-Cards leuchten. Status zeigt "Kritisch" für den Min-Buffer wegen Dez Y1 = -109. D7 (Monatsname zu Min-Cash) zeigt 0 weil ich auf Zeile 5 referenziert habe, da liegen die Monatsheader in
wahrscheinlich nicht. Lass mich kurz prüfen:
Monatsnamen sind in Zeile 4, nicht 5. Korrigiere die Referenz:
„Niedrigster Cash-Wert: 391 (Dez)" — passt. Niedrigster Stand ist tatsächlich Dezember, weil im Dezember Dividende ausgezahlt wird.
Jetzt die monatliche Liquiditäts-Tabelle (Datenblock für das Chart) und ein zweites Chart-Datenblock für die CF-Komponenten. Direkt-Verweise sind sauberer als kopierte Werte:
Jetzt die Datenzeilen 13-17, die direkt auf
verweisen — eine Seed-Formel je Zeile dann nach rechts kopieren:
Schauen, dass die Referenzen auf die richtigen Zeilen in
gehen — kurz die Struktur dort prüfen, damit Investitions-CF und Finanzierungs-CF korrekt mappen:
Investitions-CF korrekt referenziert (Zeile 14), Finanzierungs-CF korrekt (Zeile 19). Operativer CF (Zeile 11) und Cash-Endbestand (Zeile 22) auch ok.
Jetzt das zweite Tabellenelement — Banken-KPIs je Jahr — und die Charts:
Jetzt prüfe ich, wie die Banken-KPIs in
Zeilen 33-39 aufgebaut sind, dann referenziere ich sie:
Banken-KPIs liegen in
. Ich verlinke direkt:
Jetzt die Y2-Y5-Werte über autoFill (Pattern in C23 nach D23:G23 etc.):
Multi-Range geht nicht — Zebra-Streifen einzeln setzen:
Letzter Schritt: Quellen-Footer ergänzen, das TOC um den neuen Tab erweitern, und Cover aktualisieren.
TOC um den neuen Eintrag ergänzen:
Letzte Kontrolle — alle Checks bestehen und das neue Sheet sieht aus:
Fertig. Zusammenfassung:
1. AfA-Bug behoben —
Die alte Formel IF(YEAR(D)+F-1<Yn,
0, ...) schnitt das letzte Stub-Jahr ab. Neue Formel rechnet die Monatsüberlappung zwischen Nutzungsperiode [D,
D+F·12 Monate) und Kalenderjahr n direkt
aus:
=IF($F7=0,
0, $G7/12 * MAX(0, MIN((YEAR($D7)*12+MONTH($D7)-1)+$F7*12, (BaseYear+COLUMN()-COLUMN($H$6)+1)*12) - MAX( YEAR($D7)*12+MONTH($D7)-1, (BaseYear+COLUMN()-COLUMN($H$6))*12) ))
Verifikation: A001 (500/8J, ab 03/Y1) Σ = 52.08 + 7×62.5 + 10.42 = 500 ✓; A002 = 120 ✓; A003 (nach deiner Änderung 200/3J) = 200 ✓. NBV läuft sauber auf 0.
2. Spalten bis Y10 (R) erweitert — Capex-Header N6:R6 zeigen
weiterhin nur Jahre, wenn PlanYears groß
genug, aber die AfA-Berechnung läuft jetzt aus der Jahres-Spalten-Position heraus, nicht aus dem Header. Das macht das ganze Sheet robust gegen leere Header-Zellen.
3. Audit-Trail —
: Belegnummer, Quelle/Referenz, Buchungsdatum, Σ-AfA-vs-AK-Validierung mit Ampel (grün bei |Δ| ≤ 0.5, sonst rot). Beispiel-Quellenangaben in S7:U9 + Cell-Notes auf
.
4. Zwei zusätzliche Konsistenz-Checks in
Zeile 12-13: „Σ AfA = Σ Anschaffungskosten" (=0, OK) und „NBV läuft auf 0" (=0, OK). Insgesamt 10 Checks, 9× OK, 1× Warnung (Dez Y1 Cash < MinCash — das ist Modell-Output durch die Dividenden-Auszahlung im Q4).
5. Formale Konsistenzprüfung — alle Sheets durchgescannt, 0 Formelfehler (kein #VALUE/#REF/#N/A/#NAME?).
6. Neues
:
-
5 KPI-Karten (
): Cash Dez, niedrigster Cash-Wert + Monat, Min. Buffer (zeigt „Kritisch"), Anzahl Engpass-Monate (1/12), Ø monatl. operativer CF (58.7 CHF).
-
Monatliche Liquiditäts-Tabelle (
) — Cash-Endbestand mit Ampel < MinCash, operativer/Investitions-/Finanzierungs-CF.
-
Banken-KPI-Tabelle (
) Y1-Y5 mit Ampeln: Schulden/EBITDA (rot >3.5x), DSCR (rot <1.2), EK-Quote (rot <30%).
- Zwei Charts: Cash-Verlauf vs. Min-Cash (Linie), Cashflow-Komponenten (gestapelte Säulen).
-
Quellen-Footer (
) dokumentiert, woher jede Kennzahl kommt.
- Mehrsprachig (Lang-Schalter wirkt auch hier).
-
Verlinkt aus dem
als Eintrag #13.
Ein Hinweis zur Modell-Aussage selbst: dass Dezember Y1 unter MinCash fällt, ist real und liegt am 30%-Dividenden-Payout. Wenn du den Engpass auflösen willst, sind die einfachsten
Hebel DivPayout in
reduzieren, oder die Dividenden-Ausschüttung im Liquiditäts-Modell auf März Y2 verschieben (Bilanzgewinn-Verwendung nach HV-Beschluss).
Die Warnung in
gehört zu Check #7 „Cash ≥ Min-Cash (Y1)".
Was geprüft wird: Ob der Closing Cash im Dezember Y1 mindestens dem Mindest-Cash-Puffer (MinCash
= 500, definiert in
) entspricht.
Was die Zellen sagen:
-
=
='10_Liquidity'!N22 - MinCash= -109.18 - Closing Cash Dez Y1 = 391, MinCash = 500 → Differenz -109
-
= Toleranz 0
-
prüft
IF(D10>=0, OK, Warnung)→ da -109 < 0 → Warnung
Was das fachlich heißt: Das Modell rechnet korrekt — es ist kein Formel-Fehler. Aber die Plan-Logik führt dazu, dass dein Cash-Bestand am Jahresende Y1 unter dem selbst definierten Sicherheitspuffer von 500 liegt. Die Treiber im Q4 Y1:
- Dividenden-Ausschüttung (30% Payout in Dezember)
- Capex-Auszahlungen
- LTD-Tilgung 300
Diese drei zusammen drücken den Cash-Bestand kurzfristig unter MinCash. Der Revolver (1.500) ist nicht gezogen — du hast also rechnerisch noch genug Reserve (Buffer + Revolver = 1.391), aber das Polster ist eng.
Mögliche Reaktionen (alle in
einstellbar):
-
DivPayoutreduzieren (z. B. von 30 % auf 20 %) → entlastet Dezember sofort. - Dividenden-Ausschüttung in Y2 verschieben (entspricht HV-Beschluss nach Bilanzfeststellung — realistischer für ein neues Geschäftsjahr).
-
MinCashreduzieren, falls 500 zu konservativ ist. - Revolver bewusst ziehen — dann verschwindet die Warnung, aber Zinsaufwand steigt.
Solange die Warnung steht, hat sie nur Hinweis-Charakter — die Bilanz balanciert, Cash-Tie-Out und alle anderen 9 Checks sind OK.
Schaue mir kurz an, was schon da ist und welche Kennzahlen ich verlinken kann:
Ein Mini-Cover steht schon, aber sehr karg. Ich baue daraus ein professionelles Deckblatt mit Layout, KPI-Block, Status-Strip und Navigations-Buttons.
Erst die fehlenden Lang-Keys, dann das Layout. Ich brauche Labels für: Headline-Block, KPI-Karten (Y1 Umsatz/EBITDA-Marge/NI/FCF/Cash Y1End/EK-Quote/Verschuldungsgrad/DSCR/Bilanzcheck/Modellstatus), Navigation, Footer.
Lang erweitert. Jetzt die Layout-Vorbereitung — alte Inhalte löschen, Spaltenbreiten/Zeilenhöhen, Gridlines aus.
Jetzt baue ich die KPI-Karten in
— 5 nebeneinander, 1 in Zeile 13/14 als zweite Reihe. Erst Section-Header, dann die Karten.
Section-Header steht. Jetzt fünf KPI-Karten als 2-Zeilen-Blöcke nebeneinander. Layout: B-C / D-E / F-G / H-I / J-K, jede Karte 2 Spalten breit, Zeile 10 Label, Zeile 11 Wert (groß), Zeile 12 Subtext.
KPIs ziehen Live-Werte. Lang-Keys cover_fcf_note / cover_cash_note / cover_equity_note fehlen noch (kleinere Subtexte). EBITDA-Format zeigt komische Zahl wegen TEXT-Format — passe das an und ergänze die Lang-Keys.
Jetzt die EBITDA-Subzeile korrigieren (TEXT-Format) und zweite KPI-Reihe (Debt/EBITDA und DSCR) auf Zeilen 13-14 + Status-Strip Zeile 16-17:
Zwei Probleme:
-
EBITDA: ,960— das Komma kommt vonTEXT(960,"#,##0")mit DE-Locale, das ist eigentlich korrekt (Tausender-Trennzeichen), aber bei 960 < 1000 fügt es trotzdem ein Komma ein. Workaround: anderes Format. -
H14 = #VALUE!—SUMPRODUCT(ABS(...))schluckt Strings in der Range nicht (HeaderBaseYear+offsetproduziert Text wennPlanYears<n).
H14 ist jetzt 0 (Bilanz balanciert). EBITDA-Subtext zeigt immer noch "EBITDA: ,960" — das ist ein lokales Locale-Verhalten der TEXT-Funktion. Lasse ich so stehen, da es nur ein kosmetisches Detail im 9pt-Subtext ist (Wert ist klar lesbar als "960").
Status-Strip Zeile 17, Navigations-Buttons Zeile 19-20, Footer/Disclaimer Zeile 22-24:
Status-Strip funktioniert (in Orange), Text bleibt auf "Beobachten" wegen MinCash-Unterschreitung. Brauche cover_all_consistent-Key
noch:
B22 zeigt schon (eine andere) Disclaimer-Version — die war wohl schon mit ähnlichem Key bestückt. Sticker stehen, B23 hat #VALUE! weil 02_Settings!B14 (Datum) vermutlich anders gespeichert ist. Schaue ich kurz nach:
B14 ist serielle Datumszahl (46158). TEXT-Format "DD.MM.YYYY" müsste
eigentlich klappen — vielleicht erwartet die Excel-Version TT.MM.JJJJ.
Sicherer mit Standard TEXT(...,"yyyy-mm-dd"):
Excel hier nutzt deutsche TEXT-Format-Codes. Versuche JJJJ-MM-TT:
Datum erscheint jetzt korrekt. Letzter Schritt — Rahmen um die KPI-Karten, dünner grauer Border zwischen den Karten damit sie sichtbar getrennt sind:
Lass mich kurz das Endergebnis prüfen, damit ich dir korrekt berichten kann:
Sieht solide aus. Eine Sache fällt mir aber sofort auf: in B17 und ein paar TEXT-Stellen sind Kommas vor Zahlen — das kommt durch das deutsche Excel-Datumsformat JJJJ-MM-TT und
das TEXT(F14,"#,##0"),
das JJJJ-MM-TT lokal
verschluckt aber #,##0 mit
Comma-Tausendertrennzeichen produziert. Im Original-Output siehst du ,391
< ,500 CHF — das ist TEXT(...,"#,##0") mit Komma
als Tausendertrennzeichen, was bei Werten unter 1000 zu führendem Komma wird. Ich repariere das schnell:
Sauber. Auf einen Blick siehst du jetzt:
-
Banner (
) – Titel + Subtitle, beides mehrsprachig.
-
Meta-Block (
) – Unternehmen, Währung, Sprache · Basisjahr, Planungshorizont, Datum.
-
KPI-Karten Y1 (
) – 8 Karten in zwei Reihen, alle per Formel an die Quell-Sheets gehängt:
-
Reihe 1: Umsatz
, EBITDA-Margemit absoluter EBITDA-Note, Jahresergebnis, Free Cash Flow, Cash zum Jahresende, Eigenkapitalquote.
-
Reihe 2: Verschuldungsgrad
mit Ampel-Status, DSCR, Mindest-Cash Y1mit Ampel, Bilanzgleichung(Konsistent), Checks bestanden, Planungshorizont.
-
Reihe 1: Umsatz
-
Status-Strip (
) – orangenes Banner, das aktuell sagt: „Beobachten: Mindest-Cash Y1 391 < 500 CHF. Klick für Details →". Die Formel ist eine Kaskade: erst Cash-Engpass prüfen, dann Bilanzgleichung, sonst „Alles konsistent". Sobald du den Cash-Engpass behebst, wechselt der Status automatisch.
-
Navigations-Buttons (
) – Inhalt, Annahmen, GuV, Dashboard, Liquidität, Checks – alle als
HYPERLINK, springen direkt zu den Tabs. -
Disclaimer + Footer (
) – Hinweis, dass Annahmen vom Anwender geändert werden können, plus Erstellungs-Stempel.
Alles ist über LangTable mehrsprachig
(DE/EN/ES/FR). Keine Hardcodes – jede Kennzahl referenziert das jeweilige Modell-Sheet (
,
,
,
,
). Wenn du im Modell Annahmen änderst, ziehen die KPI-Karten und der Status-Strip automatisch mit..

Kommentar schreiben