🚀The world's best VBA AI has evolved. ExcelMaster is now an autonomous Agent.Read more →
Back to Blog

VBA Formula in Excel — Formeln im Code schreiben mit .Formula und .FormulaR1C1

|

VBA Formula in Excel — Formeln im Code schreiben mit .Formula und .FormulaR1C1

TL;DRRange("D2").Formula = "=B2*C2" setzt eine lebende Formel in eine Zelle, im Gegensatz zu .Value, das ein statisches Ergebnis setzt. Die Regel, über die jeder stolpert: .Formula sind immer US-englische Funktionsnamen und Kommatrennzeichen, welche Sprache der Nutzer auch hat. =SUM(A1,B1) funktioniert überall, und Excel lokalisiert die Anzeige; ein deutsches =SUMME(A1;B1) löst error 1004 aus. Nehmen Sie .FormulaR1C1, um eine relative Formel über einen ganzen Range zu stempeln, und vergessen Sie nie das führende =.

Range("D2").Formula = "=B2*C2"               ' eine lebende Formel - Excel wertet sie aus
Range("E2").Formula = "=IF(D2>100,""Big"",""OK"")"   ' Anfuehrungszeichen innen sind verdoppelt

' eine relative Formel in einem Zug eine ganze Spalte hinunter stempeln:
Range("D2:D1000").FormulaR1C1 = "=RC[-2]*RC[-1]"     ' jede Zeile: zwei Zellen nach links

Eine Formel aus dem Code in eine Zelle zu setzen sieht aus wie das Zuweisen von Text, und mechanisch ist es das auch — Sie reichen .Formula eine Zeichenkette. Aber diese Zeichenkette lebt in einem festen Dialekt, und das ist die Idee, auf der diese Anleitung aufbaut: .Formula nutzt immer US-englische Funktionsnamen und Kommatrennzeichen, unabhängig vom Gebietsschema des Nutzers, und Excel übersetzt die Anzeige für Sie. Sobald Sie das halten, ergeben die 1004-Fehler, die .FormulaLocal-Frage und die R1C1-Form alle einen Sinn.

Was Sie lernen

  • Das mentale Modell — .Formula schreibt eine lebende Formel in einem festen Dialekt
  • Die wichtigste Regel — englische Funktionsnamen und Kommas, immer
  • .FormulaLocal — wann Sie wirklich die Sprache und Trennzeichen des Nutzers brauchen
  • .FormulaR1C1 — eine relative Formel über einen ganzen Range stempeln
  • Das führende = ist Pflicht, und Anführungszeichen innen müssen verdoppelt werden
  • Eine Formel zurücklesen, und .HasFormula

Das mentale Modell: eine lebende Formel in einem festen Dialekt

.Value speichert ein Ergebnis; .Formula speichert ein Rezept, das Excel neu berechnet. .Formula zuzuweisen ist der Weg, wie Code Tabellen erzeugt, die weiterarbeiten, nachdem das Makro endet:

Range("C2").Value = 42               ' eine statische Zahl
Range("C2").Formula = "=A2+B2"       ' eine Formel - aktualisiert sich, wenn A2 oder B2 sich aendern

Die Zeichenkette, die Sie zuweisen, ist in einem kanonischen Dialekt geschrieben: US-englische Funktionsnamen (SUM, VLOOKUP, IF) und Kommas zwischen den Argumenten — selbst auf einer Maschine, deren Excel-Oberfläche SUMME zeigt und Semikolons nutzt. Excel speichert die Formel in dieser neutralen Form und zeigt sie in der Sprache des Nutzers an. So erzeugt dieselbe Zeile VBA eine korrekte, lokalisierte Formel für jeden Nutzer auf der Welt, was genau der Grund ist, warum der Dialekt fest ist. In dem Moment, in dem Sie stattdessen in der Sprache des Nutzers zu schreiben versuchen, treffen Sie auf den Fehler unten.

Die wichtigste Regel: englische Namen, Kommas, immer

Das ist die eine Tatsache, die ein funktionierendes Makro auf der Maschine eines Kollegen in einen 1004 verwandelt. .Formula akzeptiert nur US-englische Funktionsnamen und nur das Komma als Argumenttrennzeichen:

Range("A1").Formula = "=SUM(B1:B10)"     ' korrekt auf JEDER Maschine
Range("A1").Formula = "=SUMME(B1;B10)"   ' deutsche Namen + Semikolons -> run-time error 1004

Zwei Dinge sind festgelegt, nicht eins. Die Funktionsnamen sind englisch (SUM, nicht SUMME oder SOMME), und das Listentrennzeichen ist immer ein Komma — selbst in Regionen, in denen die Excel-Oberfläche ein Semikolon nutzt und das Dezimalzeichen ein Komma ist. In diesem festen Dialekt zu schreiben ist ein Vorteil: Schreiben Sie .Formula = "=SUM(...)" einmal, und es ist korrekt für einen deutschen, französischen oder spanischen Nutzer, die es jeweils in ihrer eigenen Sprache sehen. Wenn eine aus englischen Namen gebaute Formel-Zeichenkette trotzdem einen Fehler wirft, ist der übliche Übeltäter das Trennzeichen — ein verirrtes Semikolon, das vom Kopieren der Formel aus einer lokalisierten Excel-Oberfläche stammt.

.FormulaLocal: wenn Sie die Sprache des Nutzers wollen

Es gibt eine Schwestereigenschaft, .FormulaLocal, die in der Sprache und den Trennzeichen des Nutzers liest und schreibt:

' auf einer deutschen Maschine:
Range("A1").FormulaLocal = "=SUMME(B1;B10)"   ' deutsche Namen + Semikolons - hier OK
Debug.Print Range("A1").Formula               ' liest sich zurueck als "=SUM(B1:B10)"

.FormulaLocal ist das richtige Werkzeug, wenn Sie genau das wiedergeben, was der Nutzer getippt hat, oder eine Oberfläche bauen, die Formeln in seiner Sprache zeigt. Aber es macht Ihren Code nicht portabel — dieselbe Zeichenkette, die auf einer deutschen Maschine funktioniert, scheitert auf einer englischen. Die praktische Regel: schreiben Sie mit .Formula (englisch, Kommas) für alles, was Sie ausliefern, und greifen Sie nur dann zu .FormulaLocal, wenn Sie ausdrücklich den Dialekt des Nutzers sprechen müssen. Wenn Sie die Formel einer Zelle zur Anzeige lesen, gibt .FormulaLocal dem Leser seine eigene Sprache; wenn Sie sie zum Vergleichen oder Speichern lesen, gibt .Formula Ihnen die stabile, neutrale Form.

.FormulaR1C1: eine relative Formel für einen ganzen Range

Wenn Sie eine Formel über viele Zeilen erzeugen, zwingt Sie der A1-Stil, über die Referenzen jeder Zeile nachzudenken. Die R1C1-Notation beschreibt Referenzen als Versätze von der aktuellen Zelle, sodass eine Zeichenkette für jede Zelle im Range korrekt ist:

' A1-Stil - die Referenz ist woertlich, angepasst, wenn Excel sie nach unten kopiert:
Range("D2:D1000").Formula = "=B2*C2"          ' Excel verschiebt B2/C2 pro Zeile

' R1C1-Stil - die Referenz ist ein Versatz, in jeder Zeile identisch:
Range("D2:D1000").FormulaR1C1 = "=RC[-2]*RC[-1]"   ' "zwei Zellen links mal eine Zelle links"

RC[-2] bedeutet „gleiche Zeile, zwei Spalten nach links"; R[-1]C bedeutet „eine Zeile hoch, gleiche Spalte"; eine Zahl ohne Klammern wie R1C1 ist absolut (entspricht $A$1). Beide Zeilen oben erzeugen dasselbe Ergebnis, aber R1C1 ist eindeutig für erzeugte Formeln: Sie verfolgen nicht im Kopf, wie Excel B2 in Zeile 837 anpasst. Für alles, was Ihr Code über einen Range schreibt, ist R1C1 meist die klarere Wahl, und es ist die Notation, die der Makrorekorder ausgibt. Siehe VBA Range für das Bauen des Ziel-Range.

Das führende = und verdoppelte Anführungszeichen

Zwei mechanische Fallen erwischen jeden Anfänger. Erstens muss die Zeichenkette mit = beginnen, sonst speichert Excel sie als wörtlichen Text, nicht als Formel, ohne einen Fehler, der Sie warnt:

Range("A1").Formula = "SUM(B1:B10)"      ' kein "=" -> die Zelle zeigt woertlich den Text SUM(B1:B10)
Range("A1").Formula = "=SUM(B1:B10)"     ' korrekt

Zweitens, weil die ganze Formel eine VBA-Zeichenkette in doppelten Anführungszeichen ist, müssen alle Anführungszeichen in der Formel verdoppelt werden:

Range("A1").Formula = "=IF(B1="""",""empty"",B1)"   ' jedes "" ist ein woertliches Anfuehrungszeichen in der Formel

Das erscheint in der Zelle als =IF(B1="","empty",B1). Die Anführungszeichen falsch zu zählen ist der zweithäufigste 1004 nach dem Trennzeichen-Problem. Wenn eine Formel-Zeichenkette lang und anführungszeichenlastig wird, bauen Sie sie in Teilen oder nutzen einen Helfer, der die Anführungszeichen für Sie maskiert.

Eine Formel zurücklesen

.Formula liest ebenso, wie es schreibt. Auf einer Zelle, die eine Formel hält, liefert es die Formel-Zeichenkette; auf einer Zelle, die eine Konstante hält, liefert es den Wert als Zeichenkette:

Debug.Print Range("D2").Formula          ' "=B2*C2" wenn D2 eine Formel hat, sonst z. B. "100"
Debug.Print Range("D2").HasFormula       ' True nur, wenn es wirklich eine Formel ist

Nutzen Sie .HasFormula, um zu wissen, welches von beiden Sie haben, bevor Sie auf die Zeichenkette reagieren — es ist True nur für eine echte Formel, False für eine Konstante. Das ist der zuverlässige Weg, eine berechnete Zelle von einer getippten zu unterscheiden, und es passt natürlich zum Lesen der zugrunde liegenden Zahl über .Value oder .Value2, behandelt in VBA Value vs Value2 vs Text. Wenn Sie stattdessen die Antwort in einer VBA-Variablen wollen, ohne je eine Formel in eine Zelle zu setzen, rufen Sie die Funktion direkt über VBA WorksheetFunction auf — das ist der Weg „Ergebnis in einer Variablen", während .Formula der Weg „lebende Formel in der Zelle" ist.

Wie ExcelMaster hilft

Die .Formula-Bugs, die einen Nachmittag kosten, sind die stillen: ein Semikolon, das auf Ihrer Maschine funktioniert und auf der eines Kollegen einen 1004 wirft, ein fehlendes =, das eine Formel in Text verwandelt, ein falsch gezähltes "" tief in einem verschachtelten IF und eine A1-Formel, über 1.000 Zeilen gestempelt mit um eins verschobenen Referenzen. Jeder ist ein Zeichenketten-Detail, unsichtbar, bis es läuft.

ExcelMaster schreibt Formel-Zeichenketten, die auf jeder Maschine korrekt sind. Beschreiben Sie die Formel — „multipliziere die zwei Spalten links, die ganze Tabelle hinunter" — und es gibt .Formula im neutralen US-englischen Dialekt aus, oder .FormulaR1C1, wenn die Formel relativ und erzeugt ist, mit dem führenden = und jedem internen Anführungszeichen korrekt verdoppelt. Es weiß, wann Sie tatsächlich .FormulaLocal wollen und wann Sie in Wahrheit die Antwort in einer Variablen über WorksheetFunction wollten. Sie beschreiben die Berechnung; es schreibt die Zeichenkette, die überall läuft.

Häufig gestellte Fragen

Wie setze ich eine Formel in eine Zelle mit VBA?

Weisen Sie der Formula-Eigenschaft eine Zeichenkette zu, die mit = beginnt: Range("D2").Formula = "=B2*C2". Nutzen Sie US-englische Funktionsnamen und Kommas — =SUM(A1,B1), keinen lokalisierten Namen oder Semikolons — und Excel zeigt die Formel automatisch in der Sprache des Nutzers an. Um dieselbe Formel über einen ganzen Range zu schreiben, weisen Sie sie dem Range zu; für relative, erzeugte Formeln nutzen Sie .FormulaR1C1.

Warum wirft meine VBA-Formel run-time error 1004?

Die häufigste Ursache ist das Schreiben in einem lokalisierten Dialekt: .Formula verlangt US-englische Funktionsnamen und Kommatrennzeichen, also scheitert =SUMME(A1;B1), während =SUM(A1,B1) funktioniert. Weitere Ursachen sind ein fehlendes führendes = oder unausgeglichene Anführungszeichen in der Formel-Zeichenkette (jedes wörtliche Anführungszeichen muss als "" verdoppelt werden). Wenn Sie in der Sprache und den Trennzeichen des Nutzers schreiben müssen, nutzen Sie stattdessen .FormulaLocal.

Was ist der Unterschied zwischen .Formula und .FormulaR1C1?

Beide schreiben eine lebende Formel; sie unterscheiden sich im Referenzstil. .Formula nutzt die A1-Notation (=B2*C2), in der Referenzen wörtliche Zellen sind. .FormulaR1C1 nutzt die R1C1-Notation (=RC[-2]*RC[-1]), in der Referenzen Versätze von der aktuellen Zelle sind, sodass eine Zeichenkette für jede Zelle in einem Range korrekt ist. R1C1 ist klarer für Formeln, die Ihr Code über viele Zeilen erzeugt, und es ist das, was der Makrorekorder produziert.

Was ist der Unterschied zwischen .Formula und .FormulaLocal in VBA?

.Formula nutzt immer US-englische Funktionsnamen und Kommatrennzeichen, also ist es portabel — dieselbe Zeichenkette funktioniert auf jeder Maschine. .FormulaLocal nutzt die Sprache und das Listentrennzeichen des Nutzers, sodass =SUMME(A1;B1) auf einer deutschen Maschine funktioniert, aber auf einer englischen scheitert. Nutzen Sie .Formula für Code, den Sie ausliefern, und .FormulaLocal nur, wenn Sie ausdrücklich Formeln in der eigenen Sprache des Nutzers lesen oder schreiben müssen.

Wie lese ich die Formel einer Zelle in VBA?

Lesen Sie die Formula-Eigenschaft: s = Range("D2").Formula liefert die Formel-Zeichenkette (wie "=B2*C2") für eine Formelzelle oder den Wert als Text für eine Konstante. Prüfen Sie zuerst Range("D2").HasFormula — es liefert True nur, wenn die Zelle tatsächlich eine Formel enthält, sodass Sie eine berechnete Zelle von einer getippten unterscheiden können, bevor Sie auf die Zeichenkette reagieren.

Getestet in

Getestet in: Excel 365 (Windows 11), VBA 7.1 — zuletzt geprüft am 31.08.2026.

Verwandte Anleitungen: VBA Cell Value · VBA Value vs Value2 vs Text · VBA WorksheetFunction · VBA Range · VBA VLOOKUP