TL;DR —
Evaluate("SUM(A1:A10)")entrega una fórmula como texto al motor de cálculo de Excel y devuelve el resultado. La forma abreviada[ ]—[A1],[SUM(A1:A10)]— es literalmenteEvaluatedisfrazado. La diferencia que importa: los corchetes son texto fijo, así que no puede introducir una variable en ellos;Evaluate(aString)toma una cadena que usted construye en tiempo de ejecución. Una fórmula incorrecta vuelve como un Variant de error, no como un fallo, así que pruébela conIsErrorantes de usarla. Recurra a él para ejecutar una fórmula que ensambló en código; de lo contrario, una fórmula de celda normal oWorksheetFunctiones más clara.
Sub EvaluateAFormula()
Dim result As Variant
result = Evaluate("SUM(A1:A10)") ' Excel lo calcula, igual que lo haria una celda
If IsError(result) Then
MsgBox "That formula did not compute"
Else
MsgBox "Total: " & result
End If
End Sub
Las otras dos herramientas de esta familia ejecutan código por su nombre:
Application.Run ejecuta una macro,
CallByName ejecuta un miembro. Evaluate completa el trío ejecutando una
fórmula: usted le entrega a Excel una expresión de hoja de cálculo como texto y él calcula la respuesta
con el mismísimo motor que usan sus celdas. Esa es la idea única detrás de las tres —una cadena se
convierte en una acción ejecutada en tiempo de ejecución— y Evaluate es la versión más al estilo de
Excel, porque la cadena que usted pasa es simplemente una fórmula, el lenguaje que ya conoce de la
cuadrícula. La misma advertencia se mantiene: como la fórmula es texto, nada la comprueba hasta que se
ejecuta, así que pásele a Evaluate únicamente una expresión que usted mismo haya construido o validado.
Lo que aprenderá
- Dónde se sitúa
Evaluatejunto aApplication.RunyCallByName - La forma abreviada de corchetes
[ ]y por qué es el mismo método - La diferencia crítica: los corchetes son texto fijo,
Evaluatetoma una cadena en tiempo de ejecución - Cómo leer el Variant de error que devuelve una fórmula incorrecta, con
IsError - Cómo calificar la llamada a la hoja correcta para que las referencias se resuelvan donde usted quiere
- Cuándo usar
Evaluatefrente aWorksheetFunctiono una fórmula de celda
El modelo mental: tomar prestado el motor de cálculo de la hoja
Todo lo que en Excel calcula un valor —cada =SUM(...), cada =VLOOKUP(...)— pasa por un único motor de
cálculo. Evaluate es una puerta hacia ese motor desde VBA. Usted pasa una fórmula tal como la
escribiría en una celda (con o sin el = inicial), y Excel la evalúa y le da el resultado como un
Variant:
d = Evaluate("TODAY()") ' una fecha
n = Evaluate("2*PI()*10") ' un numero
r = Evaluate("VLOOKUP(""Ada"", A:B, 2, 0)") ' una busqueda, comillas duplicadas para la cadena
El cambio de mentalidad es que aquí usted no está escribiendo lógica de VBA, sino una fórmula de Excel
y pidiéndole a Excel que la ejecute. Cualquier cosa válida en una celda es válida dentro de Evaluate,
incluidas funciones que no tienen equivalente en VBA.
La forma abreviada de corchetes es Evaluate disfrazado
Esto sorprende a casi todo el mundo: la notación [ ] que ha visto en las macros de otras personas no es
un operador especial. Es una abreviatura de Evaluate. Estas dos líneas son idénticas:
x = [SUM(A1:A10)] ' forma abreviada
x = Evaluate("SUM(A1:A10)") ' lo que hace en realidad
[A1] es Evaluate("A1"), [Sales] (un rango con nombre) es Evaluate("Sales"), y [1+2] es
Evaluate("1+2"), que devuelve 3. Ver los corchetes como Evaluate es el momento de revelación que
conecta esta página con el resto de la familia: incluso la pulcra forma abreviada es, bajo la superficie,
indirección gobernada por cadenas.
La diferencia que importa: los corchetes son fijos, Evaluate toma una variable
Esta es la única regla que decide qué forma usar, y el punto de confusión más común. El texto dentro de
[ ] es literal: no puede concatenar una variable en él, porque los corchetes no son una cadena:
Dim col As String: col = "B"
' INCORRECTO - no puede construir una expresion de corchetes a partir de una variable:
' total = [SUM(col & "1:" & col & "10")] ' no hace lo que usted espera
' CORRECTO - construir la cadena y luego pasarla a Evaluate:
total = Evaluate("SUM(" & col & "1:" & col & "10)") ' SUM(B1:B10)
Así que la elección es mecánica: use [ ] cuando toda la fórmula es una constante que escribe una
sola vez; es más corta y se lee bien. Use Evaluate(...) en cuanto cualquier parte de la fórmula se
construye en tiempo de ejecución a partir de variables, valores de celda o entradas del usuario. Esa
es toda la diferencia práctica entre las dos formas, y elegir la forma de corchetes para una fórmula
dinámica es la razón por la que la gente concluye que «los corchetes están rotos» cuando simplemente son
la herramienta equivocada para una variable.
Leer el resultado: una fórmula incorrecta devuelve un Variant de error
Evaluate no lanza un error en tiempo de ejecución cuando la fórmula es incorrecta: devuelve un
Variant de error, la forma que adopta en VBA #NAME?, #REF!, #DIV/0! y compañía. Si usa el
resultado sin comprobarlo, el error se propaga en silencio:
Dim result As Variant
result = Evaluate("SUM(Nonexistent)") ' devuelve un Variant de error, no falla
If IsError(result) Then
MsgBox "Formula error - check the expression"
Else
' seguro usar result
End If
Proteja siempre una expresión construida en tiempo de ejecución con
IsError antes de confiar en el valor. Este es el comportamiento
opuesto al de WorksheetFunction, que lanza un error en tiempo de
ejecución interceptable cuando falla, una diferencia que vale la pena conocer al elegir entre ambos.
Califique la llamada para que las referencias se resuelvan donde usted quiere
Un Evaluate sin calificar (y toda forma abreviada [ ]) resuelve sus referencias contra la hoja
activa. Si la hoja activa no es la que usted pretendía, Evaluate("A1") lee la celda equivocada, un
error sutil cuando una macro se ejecuta desde una hoja distinta de aquella en la que el desarrollador la
probó. Califique la llamada para fijarla:
' Resuelve A1:A10 en Sheet1 sin importar que hoja este activa:
total = Worksheets("Sheet1").Evaluate("SUM(A1:A10)")
Worksheet.Evaluate y Workbook.Evaluate le permiten indicar dónde se ejecuta la fórmula. Confiar en
la hoja activa está bien para algo rápido y puntual; para cualquier cosa que vaya a distribuir, califique
la llamada para que no dependa de lo que el usuario haya pulsado por última vez.
Evaluate frente a WorksheetFunction frente a una fórmula de celda
Tres maneras de obtener un valor calculado, tres cometidos. Una fórmula de celda es adecuada cuando
el resultado pertenece a la hoja y debe recalcularse: ponga =SUM(A1:A10) en una celda.
WorksheetFunction es adecuada cuando quiere una función concreta
desde VBA con IntelliSense y un error limpio que pueda interceptar: WorksheetFunction.Sum(Range("A1:A10")).
Evaluate es adecuada cuando la propia expresión es dinámica —usted construyó la cadena de la
fórmula en tiempo de ejecución— o cuando necesita una función de hoja de cálculo que WorksheetFunction
no expone. Si la fórmula es una constante y la función existe en WorksheetFunction, prefiera
WorksheetFunction; es más clara y sus errores son más fáciles de manejar.
Cómo ayuda ExcelMaster
Las trampas aquí son silenciosas: una forma de corchetes que ignora en silencio su variable, un Variant de error usado como si fuera un número, una referencia sin calificar que lee la hoja equivocada. Ninguna de ellas se anuncia.
ExcelMaster le permite describir el
cálculo con palabras corrientes —«suma esta columna, la que sea que el informe haya elegido, y márcala si
la fórmula falla»— y escribe el código de Evaluate que construye la cadena de forma segura, la comprueba
con IsError y califica la hoja. Usted se queda con el libro y con el código, y se ahorra la respuesta
equivocada silenciosa.
Preguntas frecuentes
¿Qué hace Evaluate en VBA?
Evaluate("expression") pasa una fórmula de hoja de cálculo de Excel, escrita como texto, al motor de
cálculo de Excel y devuelve el resultado calculado como un Variant. Cualquier cosa válida en una celda
funciona dentro de él. Úselo para ejecutar una fórmula que ensambló en tiempo de ejecución, o para llegar
a una función de hoja de cálculo que WorksheetFunction no expone.
¿Qué significan los corchetes en VBA?
La notación [ ] es una abreviatura de Evaluate: [A1] es Evaluate("A1") y [SUM(A1:A10)] es
Evaluate("SUM(A1:A10)"). Es más corta para expresiones constantes, pero el texto de dentro es literal:
no puede concatenar una variable en los corchetes. Cuando cualquier parte de la fórmula es dinámica, use
en su lugar la forma completa Evaluate(aString).
¿Por qué no puedo poner una variable dentro de los corchetes?
Porque [ ] no es una cadena: es texto fijo entregado directamente a Evaluate, así que [col & "1"]
no construye una referencia a partir de col. Construya la fórmula como una cadena y pásesela a
Evaluate: Evaluate("SUM(" & col & "1:" & col & "10)"). Esa es toda la razón por la que la forma
completa existe junto a la abreviada.
¿Cómo compruebo si Evaluate devolvió un error?
Evaluate devuelve un Variant de error para una fórmula incorrecta en lugar de lanzar un error en
tiempo de ejecución, así que pruebe el resultado con IsError(result) antes de usarlo. Esto difiere de
WorksheetFunction, que en cambio lanza un error interceptable; elija
según prefiera probar un valor o manejar una excepción.
¿Debo usar Evaluate o WorksheetFunction?
Use WorksheetFunction cuando la función existe ahí y la fórmula es
fija: ofrece IntelliSense y un error interceptable. Use Evaluate cuando la expresión se construye en
tiempo de ejecución, o cuando necesita una función de hoja de cálculo que WorksheetFunction no expone.
Para un valor que debe vivir y recalcularse en la hoja, use una fórmula de celda normal en lugar de
cualquiera de las dos.
Probado en
Probado en: Excel 365 (Windows 11), VBA 7.1 — última verificación 27/09/2026.
Guías relacionadas: VBA Application.Run · VBA CallByName · VBA WorksheetFunction · VBA Range · VBA On Error · VBA Function · VBA Dictionary
