TL;DR —
Evaluate("SUM(A1:A10)")übergibt eine Formel als Text an Excels Berechnungsmaschine und gibt das Ergebnis zurück. Die Kurzform[ ]—[A1],[SUM(A1:A10)]— ist buchstäblich ein verkapptesEvaluate. Der entscheidende Unterschied: Klammern sind fester Text, Sie können also keine Variable in sie einsetzen;Evaluate(aString)nimmt eine Zeichenfolge, die Sie zur Laufzeit bauen. Eine fehlerhafte Formel kommt als Error-Variante zurück, nicht als Absturz, prüfen Sie sie also mitIsError, bevor Sie sie verwenden. Greifen Sie dazu, um eine im Code zusammengesetzte Formel auszuführen — sonst ist eine normale Zellformel oderWorksheetFunctionklarer.
Sub EvaluateAFormula()
Dim result As Variant
result = Evaluate("SUM(A1:A10)") ' Excel berechnet sie, genau wie eine Zelle
If IsError(result) Then
MsgBox "That formula did not compute"
Else
MsgBox "Total: " & result
End If
End Sub
Die anderen beiden Werkzeuge dieser Familie führen Code über den Namen aus —
Application.Run führt ein Makro aus,
CallByName führt ein Mitglied aus. Evaluate vervollständigt das Trio,
indem es eine Formel ausführt: Sie reichen Excel einen Arbeitsblattausdruck als Text, und es berechnet
die Antwort mit genau derselben Maschine, die auch Ihre Zellen nutzen. Das ist die eine Idee hinter allen
dreien — aus einer Zeichenfolge wird zur Laufzeit eine ausgeführte Aktion — und Evaluate ist die am
stärksten nach Excel schmeckende Ausprägung davon, weil die Zeichenfolge, die Sie übergeben, einfach eine
Formel ist, die Sprache, die Sie aus dem Tabellenraster schon kennen. Dieselbe Warnung gilt weiter: Weil
die Formel Text ist, prüft sie nichts, bis sie läuft, übergeben Sie Evaluate also nur einen Ausdruck,
den Sie selbst gebaut oder validiert haben.
Was Sie lernen
- Wo
EvaluatenebenApplication.RunundCallByNamesteht - Die Kurzschreibweise
[ ]mit eckigen Klammern und warum sie dieselbe Methode ist - Der entscheidende Unterschied: Klammern sind fester Text,
Evaluatenimmt eine Laufzeit-Zeichenfolge - Die Error-Variante lesen, die eine fehlerhafte Formel zurückgibt, mit
IsError - Den Aufruf auf das richtige Blatt qualifizieren, damit Verweise dort aufgelöst werden, wo Sie es meinen
- Wann Sie
EvaluatestattWorksheetFunctionoder einer Zellformel verwenden
Das mentale Modell: sich die Berechnungsmaschine des Arbeitsblatts ausleihen
Alles in Excel, das einen Wert berechnet — jedes =SUM(...), jedes =VLOOKUP(...) —, läuft durch eine
einzige Berechnungsmaschine. Evaluate ist eine Tür in diese Maschine hinein, aus VBA heraus. Sie
übergeben eine Formel so, wie Sie sie in eine Zelle tippen würden (mit oder ohne führendes =), und Excel
wertet sie aus und gibt Ihnen das Ergebnis als Variant:
d = Evaluate("TODAY()") ' ein Datum
n = Evaluate("2*PI()*10") ' eine Zahl
r = Evaluate("VLOOKUP(""Ada"", A:B, 2, 0)") ' ein Lookup, Anfuehrungszeichen fuer die Zeichenfolge verdoppelt
Die gedankliche Verschiebung ist, dass Sie hier keine VBA-Logik schreiben — Sie schreiben eine
Excel-Formel und bitten Excel, sie auszuführen. Alles, was in einer Zelle gültig ist, ist auch
innerhalb von Evaluate gültig, auch Funktionen, die kein VBA-Äquivalent haben.
Die Kurzschreibweise mit eckigen Klammern ist ein verkapptes Evaluate
Das überrascht fast jeden: Die [ ]-Notation, die Sie in den Makros anderer gesehen haben, ist kein
spezieller Operator. Sie ist eine Kurzform für Evaluate. Diese beiden Zeilen sind identisch:
x = [SUM(A1:A10)] ' Kurzform
x = Evaluate("SUM(A1:A10)") ' was es tatsaechlich tut
[A1] ist Evaluate("A1"), [Sales] (ein benannter Bereich) ist Evaluate("Sales"), und [1+2] ist
Evaluate("1+2"), was 3 zurückgibt. Die Klammern als Evaluate zu sehen ist der Aha-Moment, der diese
Seite mit dem Rest der Familie verbindet: Selbst die schicke Kurzform ist unter der Oberfläche
zeichenfolgengesteuerte Indirektion.
Der entscheidende Unterschied: Klammern sind fest, Evaluate nimmt eine Variable
Hier ist die eine Regel, die entscheidet, welche Form Sie nehmen, und der häufigste Punkt der Verwirrung.
Der Text innerhalb von [ ] ist wörtlich — Sie können keine Variable hineinverketten, weil die
Klammern keine Zeichenfolge sind:
Dim col As String: col = "B"
' WRONG - you cannot build a bracket expression from a variable:
' total = [SUM(col & "1:" & col & "10")] ' tut nicht, was Sie hoffen
' RIGHT - build the string, then Evaluate it:
total = Evaluate("SUM(" & col & "1:" & col & "10)") ' SUM(B1:B10)
Die Wahl ist also mechanisch: Nehmen Sie [ ], wenn die ganze Formel eine Konstante ist, die Sie
einmal tippen — das ist kürzer und liest sich gut. Nehmen Sie Evaluate(...), sobald irgendein Teil der
Formel zur Laufzeit aus Variablen, Zellwerten oder Benutzereingaben gebaut wird. Das ist der
gesamte praktische Unterschied zwischen den beiden Formen, und die Klammerform für eine dynamische Formel
zu wählen ist der Grund, warum Leute schlussfolgern, „die Klammern sind kaputt", obwohl sie schlicht das
falsche Werkzeug für eine Variable sind.
Das Ergebnis lesen: eine fehlerhafte Formel gibt eine Error-Variante zurück
Evaluate löst keinen Laufzeitfehler aus, wenn die Formel falsch ist — es liefert eine
Error-Variante zurück, die VBA-Form von #NAME?, #REF!, #DIV/0! und Konsorten. Wenn Sie das
Ergebnis ohne Prüfung verwenden, breitet sich der Fehler still aus:
Dim result As Variant
result = Evaluate("SUM(Nonexistent)") ' gibt eine Error-Variante zurueck, stuerzt nicht ab
If IsError(result) Then
MsgBox "Formula error - check the expression"
Else
' result kann sicher verwendet werden
End If
Sichern Sie einen zur Laufzeit gebauten Ausdruck immer mit IsError ab,
bevor Sie dem Wert trauen. Das ist das umgekehrte Verhalten von
WorksheetFunction, das bei einem Fehlschlag einen abfangbaren
Laufzeitfehler auslöst — ein Unterschied, den man kennen sollte, wenn man zwischen beiden wählt.
Qualifizieren Sie den Aufruf, damit Verweise dort aufgelöst werden, wo Sie es meinen
Ein unqualifiziertes Evaluate (und jede [ ]-Kurzform) löst seine Verweise gegen das aktive Blatt
auf. Ist das aktive Blatt nicht das gemeinte, liest Evaluate("A1") die falsche Zelle — ein subtiler
Bug, wenn ein Makro von einem anderen Blatt aus läuft als dem, auf dem der Entwickler getestet hat.
Qualifizieren Sie den Aufruf, um ihn festzunageln:
' Resolves A1:A10 on Sheet1 no matter which sheet is active:
total = Worksheets("Sheet1").Evaluate("SUM(A1:A10)")
Worksheet.Evaluate und Workbook.Evaluate lassen Sie sagen, wo die Formel läuft. Sich auf das aktive
Blatt zu verlassen ist für einen schnellen Einmalfall in Ordnung; für alles, was in Produktion geht,
qualifizieren Sie den Aufruf, damit er nicht davon abhängt, worauf der Benutzer zuletzt zufällig geklickt
hat.
Evaluate, WorksheetFunction oder eine Zellformel
Drei Wege, einen berechneten Wert zu bekommen, drei Aufgaben. Eine Zellformel ist richtig, wenn das
Ergebnis auf das Blatt gehört und sich neu berechnen soll — setzen Sie =SUM(A1:A10) in eine Zelle.
WorksheetFunction ist richtig, wenn Sie eine bestimmte Funktion
aus VBA mit IntelliSense und einem sauberen, abfangbaren Fehler wollen:
WorksheetFunction.Sum(Range("A1:A10")). Evaluate ist richtig, wenn der Ausdruck selbst dynamisch
ist — Sie haben die Formel-Zeichenfolge zur Laufzeit gebaut — oder wenn Sie eine Arbeitsblattfunktion
brauchen, die WorksheetFunction nicht bereitstellt. Ist die Formel eine Konstante und existiert die
Funktion auf WorksheetFunction, bevorzugen Sie WorksheetFunction; es ist klarer, und seine Fehler
sind leichter zu behandeln.
Wie ExcelMaster hilft
Die Fallen hier sind still: eine Klammerform, die Ihre Variable stillschweigend ignoriert, eine Error-Variante, die verwendet wird, als wäre sie eine Zahl, ein unqualifizierter Verweis, der das falsche Blatt liest. Keine davon meldet sich von selbst.
ExcelMaster lässt Sie die Berechnung
in klaren Worten beschreiben — „summiere diese Spalte, welche Spalte der Bericht auch gewählt hat, und
markiere es, wenn die Formel fehlschlägt" — und schreibt den Evaluate-Code, der die Zeichenfolge sicher
baut, sie mit IsError prüft und das Blatt qualifiziert. Sie behalten die Arbeitsmappe und den Code und
ersparen sich die stille falsche Antwort.
Häufig gestellte Fragen
Was macht Evaluate in VBA?
Evaluate("expression") übergibt eine als Text geschriebene Excel-Arbeitsblattformel an Excels
Berechnungsmaschine und gibt das berechnete Ergebnis als Variant zurück. Alles, was in einer Zelle
gültig ist, funktioniert darin. Nutzen Sie es, um eine zur Laufzeit zusammengesetzte Formel auszuführen
oder um eine Arbeitsblattfunktion zu erreichen, die WorksheetFunction
nicht bereitstellt.
Was bedeuten die eckigen Klammern in VBA?
Die [ ]-Notation ist eine Kurzform für Evaluate: [A1] ist Evaluate("A1") und [SUM(A1:A10)] ist
Evaluate("SUM(A1:A10)"). Sie ist kürzer für konstante Ausdrücke, aber der Text darin ist wörtlich — Sie
können keine Variable in Klammern hineinverketten. Sobald irgendein Teil der Formel dynamisch ist, nehmen
Sie stattdessen die volle Form Evaluate(aString).
Warum kann ich keine Variable in die eckigen Klammern setzen?
Weil [ ] keine Zeichenfolge ist — es ist fester Text, der direkt an Evaluate gereicht wird, sodass
[col & "1"] keinen Verweis aus col baut. Bauen Sie die Formel als Zeichenfolge und übergeben Sie sie
an Evaluate: Evaluate("SUM(" & col & "1:" & col & "10)"). Das ist der ganze Grund, warum die volle
Form neben der Kurzform existiert.
Wie prüfe ich, ob Evaluate einen Fehler zurückgegeben hat?
Evaluate gibt bei einer fehlerhaften Formel eine Error-Variante zurück, statt einen Laufzeitfehler
auszulösen, prüfen Sie das Ergebnis also mit IsError(result), bevor Sie es verwenden. Das unterscheidet
sich von WorksheetFunction, das stattdessen einen abfangbaren Fehler
auslöst — wählen Sie danach, ob Sie lieber einen Wert prüfen oder eine Ausnahme behandeln.
Sollte ich Evaluate oder WorksheetFunction verwenden?
Nehmen Sie WorksheetFunction, wenn die Funktion dort existiert und die
Formel fest ist — es bietet IntelliSense und einen abfangbaren Fehler. Nehmen Sie Evaluate, wenn der
Ausdruck zur Laufzeit gebaut wird oder wenn Sie eine Arbeitsblattfunktion brauchen, die
WorksheetFunction nicht bereitstellt. Für einen Wert, der auf dem Blatt leben und sich neu berechnen
soll, nehmen Sie eine normale Zellformel statt eines von beiden.
Getestet in
Getestet in: Excel 365 (Windows 11), VBA 7.1 — zuletzt geprüft am 27.09.2026.
Verwandte Anleitungen: VBA Application.Run · VBA CallByName · VBA WorksheetFunction · VBA Range · VBA On Error · VBA Function · VBA Dictionary
