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

VBA Formula en Excel — escribe fórmulas en código con .Formula y .FormulaR1C1

|

VBA Formula en Excel — escribe fórmulas en código con .Formula y .FormulaR1C1

TL;DRRange("D2").Formula = "=B2*C2" pone una fórmula viva en una celda, a diferencia de .Value, que pone un resultado estático. La regla que hace tropezar a todos: .Formula es siempre nombres de función en inglés de EE. UU. y comas como separador, sea cual sea el idioma del usuario. =SUM(A1,B1) funciona en todas partes y Excel localiza la visualización; un alemán =SUMME(A1;B1) lanza el error 1004. Usa .FormulaR1C1 para estampar una fórmula relativa por todo un rango, y no olvides nunca el = inicial.

Range("D2").Formula = "=B2*C2"               ' una formula viva - Excel la evalua
Range("E2").Formula = "=IF(D2>100,""Big"",""OK"")"   ' las comillas de dentro van duplicadas

' estampa una formula relativa por toda una columna en una sola asignacion:
Range("D2:D1000").FormulaR1C1 = "=RC[-2]*RC[-1]"     ' cada fila: dos celdas a la izquierda

Meter una fórmula en una celda desde código parece asignar texto, y mecánicamente lo es — le pasas una cadena a .Formula. Pero esa cadena vive en un dialecto fijo, y esa es la idea sobre la que se construye esta guía: .Formula siempre usa nombres de función en inglés de EE. UU. y comas como separador, sin importar la configuración regional del usuario, y Excel te traduce la visualización. En cuanto lo tienes claro, los errores 1004, la cuestión de .FormulaLocal y la forma R1C1 cobran todos sentido.

Lo que aprenderás

  • El modelo mental — .Formula escribe una fórmula viva en un único dialecto fijo
  • La regla más importante — nombres de función en inglés y comas, siempre
  • .FormulaLocal — cuándo necesitas de verdad el idioma y los separadores del usuario
  • .FormulaR1C1 — estampar una fórmula relativa por todo un rango
  • El = inicial es obligatorio, y las comillas de dentro deben duplicarse
  • Leer una fórmula de vuelta, y .HasFormula

El modelo mental: una fórmula viva en un dialecto fijo

.Value guarda un resultado; .Formula guarda una receta que Excel recalcula. Asignar .Formula es cómo haces que el código produzca hojas de cálculo que siguen funcionando después de que la macro termina:

Range("C2").Value = 42               ' un numero estatico
Range("C2").Formula = "=A2+B2"       ' una formula - se actualiza cuando A2 o B2 cambian

La cadena que asignas está escrita en un dialecto canónico: nombres de función en inglés de EE. UU. (SUM, VLOOKUP, IF) y comas entre argumentos — incluso en una máquina cuya interfaz de Excel muestra SUMME y usa punto y coma. Excel guarda la fórmula en esa forma neutral y la muestra en el idioma del usuario. Así que la misma línea de VBA produce una fórmula correcta y localizada para cualquier usuario del planeta, y por eso justamente el dialecto es fijo. En cuanto intentas escribir en el idioma del usuario, te topas con el error de abajo.

La regla más importante: nombres en inglés, comas, siempre

Este es el único hecho que convierte una macro que funciona en un 1004 en la máquina de un colega. .Formula acepta solo nombres de función en inglés de EE. UU. y solo la coma como separador de argumentos:

Range("A1").Formula = "=SUM(B1:B10)"     ' correcto en CUALQUIER maquina
Range("A1").Formula = "=SUMME(B1;B10)"   ' nombres alemanes + punto y coma -> error de tiempo de ejecucion 1004

Hay dos cosas bloqueadas, no una. Los nombres de función son ingleses (SUM, no SUMME ni SOMME), y el separador de lista es siempre una coma — incluso en regiones donde la interfaz de Excel usa punto y coma y el separador decimal es la coma. Escribir en este dialecto fijo es una ventaja: escribe .Formula = "=SUM(...)" una vez y es correcto para un usuario alemán, francés o español, que la ven cada uno en su propio idioma. Si una cadena de fórmula construida con nombres en inglés aún da error, el culpable habitual es el separador — un punto y coma perdido que vino de copiar la fórmula desde una interfaz de Excel localizada.

.FormulaLocal: cuando quieres el idioma del usuario

Hay una propiedad hermana, .FormulaLocal, que lee y escribe en el idioma y los separadores del usuario:

' en una maquina alemana:
Range("A1").FormulaLocal = "=SUMME(B1;B10)"   ' nombres alemanes + punto y coma - OK aqui
Debug.Print Range("A1").Formula               ' se lee de vuelta como "=SUM(B1:B10)"

.FormulaLocal es la herramienta adecuada cuando repites exactamente lo que el usuario tecleó, o cuando construyes una interfaz que muestra las fórmulas en su idioma. Pero hace tu código no portable — la misma cadena que funciona en una máquina alemana falla en una inglesa. La regla práctica: escribe con .Formula (inglés, comas) para todo lo que distribuyas, y echa mano de .FormulaLocal solo cuando necesitas específicamente hablar el dialecto del usuario. Cuando lees la fórmula de una celda para mostrarla, .FormulaLocal le da al lector su propio idioma; cuando la lees para comparar o guardar, .Formula te da la forma estable y neutral.

.FormulaR1C1: una fórmula relativa para todo un rango

Cuando generas una fórmula a lo largo de muchas filas, el estilo A1 te obliga a pensar en las referencias de cada fila. La notación R1C1 describe las referencias como desplazamientos desde la celda actual, así que una sola cadena es correcta para cada celda del rango:

' estilo A1 - la referencia es literal, ajustada segun Excel la copia hacia abajo:
Range("D2:D1000").Formula = "=B2*C2"          ' Excel desplaza B2/C2 por fila

' estilo R1C1 - la referencia es un desplazamiento, identica en cada fila:
Range("D2:D1000").FormulaR1C1 = "=RC[-2]*RC[-1]"   ' "dos celdas a la izquierda por una celda a la izquierda"

RC[-2] significa «misma fila, dos columnas a la izquierda»; R[-1]C significa «una fila arriba, misma columna»; un número sin corchetes como R1C1 es absoluto (equivalente a $A$1). Las dos líneas de arriba producen el mismo resultado, pero R1C1 es inequívoca para las fórmulas generadas: no vas siguiendo mentalmente cómo ajustará Excel B2 en la fila 837. Para todo lo que tu código escribe a lo largo de un rango, R1C1 suele ser la opción más clara, y es la notación que emite la grabadora de macros. Consulta VBA Range para construir el rango de destino.

El = inicial y las comillas duplicadas

Dos trampas mecánicas pillan a todo principiante. Primero, la cadena debe empezar con =, o Excel la guarda como texto literal, no como fórmula, sin ningún error que te avise:

Range("A1").Formula = "SUM(B1:B10)"      ' sin "=" -> la celda muestra literalmente el texto SUM(B1:B10)
Range("A1").Formula = "=SUM(B1:B10)"     ' correcto

Segundo, como toda la fórmula es una cadena de VBA entre comillas dobles, cualquier comilla dentro de la fórmula debe duplicarse:

Range("A1").Formula = "=IF(B1="""",""empty"",B1)"   ' cada "" es una comilla literal en la formula

Eso se representa en la celda como =IF(B1="","empty",B1). Contar mal las comillas es el segundo 1004 más común después del problema del separador. Cuando una cadena de fórmula se hace larga y cargada de comillas, constrúyela por partes o usa un ayudante que te escape las comillas.

Leer una fórmula de vuelta

.Formula lee además de escribir. En una celda que contiene una fórmula devuelve la cadena de la fórmula; en una celda que contiene una constante devuelve el valor como cadena:

Debug.Print Range("D2").Formula          ' "=B2*C2" si D2 tiene una formula, si no p.ej. "100"
Debug.Print Range("D2").HasFormula       ' True solo si es de verdad una formula

Usa .HasFormula para saber cuál tienes antes de actuar sobre la cadena — es True solo para una fórmula real, False para una constante. Es la forma fiable de distinguir una celda calculada de una tecleada, y se combina de forma natural con leer el número subyacente a través de .Value o .Value2, que se trata en VBA Value vs Value2 vs Text. Si en cambio quieres la respuesta en una variable de VBA sin poner nunca una fórmula en una celda, llama a la función directamente con VBA WorksheetFunction — esa es la vía del «resultado en una variable», mientras que .Formula es la vía de la «fórmula viva en la celda».

Cómo ayuda ExcelMaster

Los bugs de .Formula que te gastan una tarde son los silenciosos: un punto y coma que funciona en tu máquina y da 1004 en la de un compañero, un = que falta y convierte una fórmula en texto, un "" mal contado en lo profundo de un IF anidado, y una fórmula A1 estampada por 1.000 filas con las referencias desviadas en uno. Cada uno es un detalle de cadena, invisible hasta que se ejecuta.

ExcelMaster escribe cadenas de fórmula que son correctas en cualquier máquina. Describe la fórmula — «multiplica las dos columnas de la izquierda, por toda la tabla» — y emite .Formula en el dialecto neutral de inglés de EE. UU., o .FormulaR1C1 cuando la fórmula es relativa y generada, con el = inicial y cada comilla interna duplicada correctamente. Sabe cuándo quieres de verdad .FormulaLocal, y cuándo en realidad querías la respuesta en una variable a través de WorksheetFunction. Tú describes el cálculo; él escribe la cadena que corre en todas partes.

Preguntas frecuentes

¿Cómo pongo una fórmula en una celda con VBA?

Asigna una cadena que empiece por = a la propiedad Formula: Range("D2").Formula = "=B2*C2". Usa nombres de función en inglés de EE. UU. y comas — =SUM(A1,B1), no un nombre localizado ni punto y coma — y Excel muestra la fórmula en el idioma del usuario automáticamente. Para escribir la misma fórmula por todo un rango, asígnala al rango; para fórmulas relativas generadas, usa .FormulaR1C1.

¿Por qué mi fórmula de VBA da el error de tiempo de ejecución 1004?

La causa más común es escribir en un dialecto localizado: .Formula exige nombres de función en inglés de EE. UU. y comas como separador, así que =SUMME(A1;B1) falla mientras que =SUM(A1,B1) funciona. Otras causas son un = inicial que falta, o comillas desequilibradas dentro de la cadena de la fórmula (cada comilla literal debe duplicarse como ""). Si tienes que escribir en el idioma y los separadores del usuario, usa .FormulaLocal en su lugar.

¿Cuál es la diferencia entre .Formula y .FormulaR1C1?

Ambas escriben una fórmula viva; se diferencian en el estilo de referencia. .Formula usa la notación A1 (=B2*C2), donde las referencias son celdas literales. .FormulaR1C1 usa la notación R1C1 (=RC[-2]*RC[-1]), donde las referencias son desplazamientos desde la celda actual, así que una sola cadena es correcta para cada celda de un rango. R1C1 es más clara para las fórmulas que tu código genera a lo largo de muchas filas, y es lo que produce la grabadora de macros.

¿Cuál es la diferencia entre .Formula y .FormulaLocal en VBA?

.Formula siempre usa nombres de función en inglés de EE. UU. y comas como separador, así que es portable — la misma cadena funciona en cualquier máquina. .FormulaLocal usa el idioma y el separador de lista del usuario, así que =SUMME(A1;B1) funciona en una máquina alemana pero falla en una inglesa. Usa .Formula para el código que distribuyes, y .FormulaLocal solo cuando necesitas específicamente leer o escribir fórmulas en el propio idioma del usuario.

¿Cómo leo la fórmula de una celda en VBA?

Lee la propiedad Formula: s = Range("D2").Formula devuelve la cadena de la fórmula (como "=B2*C2") en una celda con fórmula, o el valor como texto en una constante. Comprueba antes Range("D2").HasFormula — devuelve True solo cuando la celda contiene de verdad una fórmula, así que puedes distinguir una celda calculada de una tecleada antes de actuar sobre la cadena.

Probado en

Probado en: Excel 365 (Windows 11), VBA 7.1 — última verificación el 31/08/2026.

Guías relacionadas: VBA Cell Value · VBA Value vs Value2 vs Text · VBA WorksheetFunction · VBA Range · VBA VLOOKUP