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

VBA Evaluate en Excel — Convierta una cadena de fórmula en un valor

|

VBA Evaluate en Excel — Convierta una cadena de fórmula en un valor

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 literalmente Evaluate disfrazado. 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 con IsError antes de usarla. Recurra a él para ejecutar una fórmula que ensambló en código; de lo contrario, una fórmula de celda normal o WorksheetFunction es 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 Evaluate junto a Application.Run y CallByName
  • La forma abreviada de corchetes [ ] y por qué es el mismo método
  • La diferencia crítica: los corchetes son texto fijo, Evaluate toma 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 Evaluate frente a WorksheetFunction o 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