VBA es el lenguaje de macros que ya viene con Excel de escritorio. En este tutorial lo usaremos para automatizar una hoja de ventas real: la de una tienda que cada semana suma productos, calcula totales y marca en rojo los importes altos. Al terminar sabrás grabar macros, escribirlas a mano en un módulo, recorrer celdas con Range y Cells, escribir fórmulas desde VBA, sustituir las dependencias con VBScript y dejar tu proyecto preparado para cuando Microsoft deshabilite ese componente.
Funciona en Excel 2007, 2010, 2013, 2016, 2019, 2021, 2024 y Microsoft 365, y en Excel para Mac. La RegExp integrada solo aparece desde la versión 2508 de Office (Microsoft 365, canal actual). Excel para la web no ejecuta macros VBA; allí se usa Office Scripts o Python en Excel.
Qué es VBA y para qué sirve dentro de Excel
VBA (Visual Basic for Applications) es el lenguaje de macros que viene instalado dentro de Excel de escritorio. No es un programa aparte: vive dentro de cada libro y automatiza tareas repetitivas. Una macro es un programa corto escrito en VBA que Excel ejecuta cuando se lo pides.
El caso real de este tutorial es la hoja de ventas de una tienda. Cada lunes la dueña abre el libro, copia los productos nuevos, multiplica unidades por precio, suma el total y revisa qué importes pasan de 1.000 para revisarlos a mano. Son cuatro pasos que se repiten igual semana tras semana. Una macro de VBA los hace en un segundo: escribe los totales, pinta de rojo lo que se pasa del umbral y muestra un cuadro con la suma final.
Gracias a VBA el lector podrá automatizar hojas como esta, crear botones, generar informes, limpiar datos y conectar Excel con otros programas de Office sin salir del libro.
El editor de Visual Basic y la primera macro grabada
VBA se escribe en el Editor de Visual Basic (VBE). Para llegar a él necesitas la pestaña Programador, que viene oculta.
Marca la casilla Programador en la columna derecha y pulsa Aceptar.
Ponle nombre MiPrimeraMacro y acepta. Escribe Hola en la celda A1, pulsa Entrar, vuelve a la cinta y pulsa Detener grabación.
Se abre el editor. En la ventana de la izquierda, dentro de Módulos, verás un módulo nuevo con un Sub MiPrimeraMacro(). Las líneas que VBA generó al escribir Hola en A1 son las que reflejan tu acción. La grabadora es la mejor forma de aprender el nombre exacto de cada botón, menú y formato en VBA.
.xlsx las macros se borran.Cómo escribir una macro a mano en un módulo
Una macro escrita a mano hace lo mismo que la grabada, pero tú decides el código. En el editor, abierto con Alt+F11:
Sub TotalesVentas()
Range("D2").Value = Range("B2").Value * Range("C2").Value
MsgBox "Total calculado"
End Sub
Para ejecutarla tienes dos caminos: pulsar F5 desde el editor, o cerrar el editor y usar Alt+F8, elegir la macro y pulsar Ejecutar. F5 corre la macro donde está el cursor; Alt+F8 muestra la lista de todas las macros del libro.
Debug.Print 1+1 para confirmar que el editor responde.Los objetos básicos de Excel que usa VBA: Application, Workbook, Worksheet y Range
VBA trabaja con un modelo de objetos jerárquico: cada objeto contiene al siguiente. Application es Excel entero. Dentro están los Workbooks (los libros abiertos), cada libro tiene Worksheets (las hojas) y cada hoja tiene Range o Cells (celdas y grupos de celdas).
ThisWorkbook se refiere al libro que contiene la macro en ejecución; usar ThisWorkbook evita errores cuando hay más de un libro abierto. Una celda se puede escribir con su dirección (Range("B2")) o con sus coordenadas (Cells(2, 2), donde el primer número es la fila y el segundo la columna).
Sub ObjetosBasicos()
ThisWorkbook.Worksheets("Ventas").Range("B2").Value = 10
ThisWorkbook.Worksheets("Ventas").Cells(3, 3).Value = 5
Debug.Print ThisWorkbook.Worksheets("Ventas").Range("B2").Value
End Sub
Value sirve para leer o escribir un valor; Formula se usa para escribir una fórmula. Una macro que va a tocar miles de celdas es más rápida si usa Cells(fila, columna) dentro de un For, porque evita tener que concatenar direcciones.
Escribir fórmulas desde VBA: Formula, FormulaLocal, FormulaR1C1 y FormulaR1C1Local
Una celda de Excel puede contener un valor o una fórmula. Desde VBA, las cuatro propiedades que escriben fórmulas son .Formula, .FormulaR1C1, .FormulaLocal y .FormulaR1C1Local. Las dos primeras usan SIEMPRE los nombres de función en inglés y la coma como separador de argumentos; las dos Local usan el idioma y el separador del usuario.
=SUMA(B2:C2)
Para escribir esa fórmula desde VBA, en un Excel en español:
Sub EscribirFormula()
Range("D2:D4").FormulaLocal = "=SUMA(B2:C2)"
Range("E2").Formula = "=SUM(B2:C2)"
Range("F2").FormulaR1C1 = "=SUM(RC[-2]:RC[-1])"
Range("G2").FormulaR1C1Local = "=SUMA(B2:C2)"
End Sub
FormulaR1C1 usa la notación R1C1: RC[-2] es la celda dos columnas a la izquierda de la actual, y RC[-1] la inmediata a su izquierda. La ventaja es que la misma fórmula sirve para cualquier fila del rango sin tener que cambiar las referencias.
Automatizar una hoja de ventas con un recorrido de VBA
La hoja de ventas del tutorial es esta:
| A | B | C | D | |
|---|---|---|---|---|
| 1 | Producto | Unidades | Precio | Total |
| 2 | Cuaderno | 4 | 3,20 | |
| 3 | Lapiz | 12 | 0,80 | |
| 4 | Goma | 10 | 1,50 | |
| 5 | Regla | 3 | 2,10 | |
| 6 | Boligrafo | 25 | 0,95 | |
| 7 | Carpeta | 6 | 4,80 | |
| 8 | Pegamento | 2 | 3,50 | |
| 9 | Tijeras | 1 | 6,90 |
Activar la pestaña Programador y abrir el editor
- Haz clic en Archivo > Opciones > Personalizar cinta de opciones.
- En la columna derecha marca la casilla Programador.
- Pulsa Aceptar.
- Pulsa Alt+F11 para abrir el editor. En Mac la pestaña se activa en Excel > Preferencias > Barra de herramientas y cinta y el editor se abre con
⌥+F11.
La macro que calcula los totales por fila
Inserta un módulo y escribe:
Sub RecorrerTotales()
Dim i As Long
For i = 2 To 9
Cells(i, 4).FormulaLocal = "=B" & i & "*C" & i
Next i
MsgBox "Suma final: " & Application.WorksheetFunction.Sum(Range("D2:D9"))
End Sub
El bucle va de la fila 2 a la 9 y en cada una concatena la fórmula en formato local. Application.WorksheetFunction.Sum ejecuta la función SUMA del propio Excel y devuelve el resultado del rango.
MsgBox con la suma 110,15.Cambiar de FormulaLocal a Formula y ver el error 1004
Cambia la línea del bucle por su equivalente en inglés:
Cells(i, 4).Formula = "=B" & i & "*C" & i
Esta línea sí funciona. El error 1004 aparece al usar una función traducida dentro de .Formula:
Cells(i, 4).Formula = "=SUMA(B" & i & ":C" & i & ")"
Al ejecutar, VBA muestra:
Se ha producido el error '1004' en tiempo de ejecución:
Error definido por la aplicación o el objeto
La causa es que .Formula solo entiende funciones en inglés, aunque Excel esté en español. La regla es clara: si usas .Formula o .FormulaR1C1, los nombres van en inglés (SUM, AVERAGE, VLOOKUP); si usas .FormulaLocal o .FormulaR1C1Local, en el idioma del usuario (SUMA, PROMEDIO, BUSCARV).
.Formula = "=SUM(B" & i & ":C" & i & ")" la macro vuelve a funcionar y ya no aparece el 1004.Trabajar con rangos como matrices y acelerar la macro
Recorrer la hoja celda a celda con un For es claro, pero lento. Cuando la hoja tiene miles de filas, el truco es pasar el rango a una matriz en memoria, operar en la matriz y volcar el resultado de golpe.
Sub Rapido()
Application.ScreenUpdating = False
Dim datos As Variant
Dim i As Long
datos = Range("A1:C10").Value
For i = 2 To UBound(datos, 1)
datos(i, 4) = datos(i, 2) * datos(i, 3)
Next i
Range("A1").Resize(UBound(datos, 1), 4).Value = datos
Application.ScreenUpdating = True
End Sub
datos es un Variant que recibe una copia de los valores del rango. Operar dentro de la matriz es muchísimo más rápido que leer y escribir en cada celda. Resize ajusta el tamaño del destino para que coincida con la matriz. Application.ScreenUpdating = False le dice a Excel que no repinte la pantalla mientras la macro corre; al terminar se vuelve a True.
.Value solo contiene valores, no fórmulas ni formatos. Si necesitas conservar las fórmulas, usa .Formula en su lugar.Por qué fallan las macros al desactivar VBScript en Windows
Microsoft anunció en mayo de 2024 la depreciación de VBScript como característica opcional de Windows. VBScript seguirá disponible durante una fase de transición y después se eliminará de Windows. VBA no usa VBScript para funcionar, pero muchas macros sí lo hacen de dos formas: lanzando archivos .vbs desde VBA con Shell, o creando objetos de la librería VBScript.RegExp para trabajar con expresiones regulares. Cuando VBScript deje de estar disponible, esas macros dejarán de compilar o de ejecutarse.
| Fase | Qué pasa con VBScript en Windows | Efecto en macros VBA |
|---|---|---|
| Hoy | Instalado como FOD (característica opcional) | Las macros con Shell "archivo.vbs" y con CreateObject("VBScript.RegExp") funcionan. |
| Deshabilitado | Microsoft desactiva el FOD por defecto | CreateObject("VBScript.RegExp") falla; los Shell a .vbs también. |
| Eliminado | VBScript se retira de Windows | Las macros que dependían de VBScript dejan de funcionar. |
Las dos dependencias de VBA con VBScript
La primera dependencia es llamar a un script externo con Shell. La macro escribe un .vbs, lo ejecuta y lo borra. La segunda es usar expresiones regulares: VBA no trae un motor de regex propio, así que durante años se ha recurrido a CreateObject("VBScript.RegExp") para validar textos, buscar patrones o extraer partes de una cadena.
Desde la versión 2508 de Office, RegExp ya viene dentro de VBA
A partir de la versión 2508 de Office (Microsoft 365, canal actual), VBA incluye un módulo de expresiones regulares propio con tres tipos: RegExp, Match y SubMatches. Para usarlo ya no hace falta marcar la referencia a Microsoft VBScript Regular Expressions en el menú Herramientas > Referencias del editor. Funciona tanto con enlace temprano (Dim r As New RegExp) como con enlace tardío (CreateObject("VBScript.RegExp")).
| Tipo | Para qué sirve | Ejemplo |
|---|---|---|
RegExp |
El motor de regex; tiene .Pattern, .Global, .IgnoreCase, .Test, .Replace, .Execute. |
r.Pattern = "^[A-Z]{3}\d{4}$" |
Match |
Una coincidencia devuelta por .Execute. |
m.Value |
SubMatches |
Los grupos capturados entre paréntesis dentro de un Match. |
m.SubMatches(0) |
Migrar una macro de RegExp del VBScript antiguo al RegExp integrado
Supón que la hoja de ventas añade una columna Código con un identificador que debe cumplir el patrón tres letras y cuatro números, como ABC1234. La macro valida si el código es correcto.
Enlace tardío con CreateObject, válido en cualquier versión
Sub ValidarCodigo()
Dim r As Object
Set r = CreateObject("VBScript.RegExp")
r.Pattern = "^[A-Z]{3}\d{4}$"
r.IgnoreCase = True
Debug.Print r.Test("ABC1234")
Debug.Print r.Test("AB1234")
End Sub
Verdadero
Falso
Este código funciona en cualquier versión de Excel con VBA, porque CreateObject resuelve el objeto en tiempo de ejecución. El problema es que cuando VBScript se desactive, este CreateObject fallará.
Enlace temprano con la referencia interna, válido desde 2508
Sub ValidarCodigoNuevo()
Dim r As New RegExp
Dim m As Match
r.Pattern = "^[A-Z]{3}\d{4}$"
r.Global = True
r.IgnoreCase = True
For Each m In r.Execute("ABC1234 XYZ9876 AB12")
Debug.Print m.Value
Next m
End Sub
ABC1234
XYZ9876
Dim r As New RegExp usa la referencia interna de Office 2508, sin depender de VBScript. Si abres este mismo archivo en una versión anterior a 2508, VBA no reconoce el tipo RegExp y la macro no compila. La migración consiste en mover el código de la versión con CreateObject a esta nueva estructura, con New en lugar de CreateObject y tipado fuerte en lugar de Object.
New RegExp debe mantenerse en una versión con CreateObject. Lo más práctico hoy es tener dos macros: una antigua que sigue funcionando y una nueva que se activará cuando se desactive VBScript.Comprobar si tu proyecto VBA se rompe con VBScript desactivado
Antes de que Microsoft deshabilite VBScript conviene saber qué macros de tu libro se rompen. El procedimiento de prueba es este:
- Abre Panel de control > Programas > Activar o desactivar características de Windows.
- Busca VBScript, desmarca la casilla y reinicia Windows.
- Abre tu libro
.xlsmy habilita las macros. - Ejecuta cada macro con Alt+F8 y anota cuáles fallan.
- Vuelve a marcar VBScript, reinicia y comprueba que las macros rotas vuelven a funcionar.
Lo que verás al ejecutar las macros rotas:
- Mensaje "No se puede crear el objeto" al usar
CreateObject("VBScript.RegExp"). - Mensaje "Archivo no encontrado" al lanzar un
.vbsconShell. - Caída silenciosa de la macro si el error no está gestionado con
On Error Resume Next.
Lo que VBA no puede hacer y sus alternativas modernas
VBA es muy potente dentro de Excel de escritorio, pero tiene tres límites claros que conviene recordar:
- Excel para la web no ejecuta macros VBA. Los archivos con
.xlsmse pueden abrir, pero las macros no corren; lo que ven los usuarios es la hoja tal cual, sin automatización. - Office Scripts (TypeScript) es la alternativa en Excel para la web y Microsoft 365; permite automatizar hojas desde el navegador y desde Power Automate.
- Python en Excel está disponible en Microsoft 365 con la licencia adecuada; permite análisis de datos, pandas, matplotlib y conexión a servicios externos sin salir del libro.
- LAMBDA (en Excel 2024 y Microsoft 365) crea funciones personalizadas reutilizables con fórmulas, sin abrir el editor de VBA, y sirve para lógica repetible que no necesita acceso al modelo de objetos.
Si la macro solo calcula, la migración a LAMBDA es la más sencilla. Si la macro lee o escribe archivos, abre cuadros de diálogo o se conecta a una base de datos, la migración pasa por Office Scripts o por Python en Excel. La elección depende de dónde se va a usar la hoja: en escritorio sigue mandando VBA; en la web, Scripts o Python.
Lo que ya sabes hacer con VBA en Excel
- Abrir el editor con Alt+F11, grabar una macro con la grabadora y leer el código que genera.
- Escribir un
Suba mano en un módulo, ejecutarlo con F5 o Alt+F8 y guardar el libro como.xlsm. - Recorrer la hoja con
RangeyCells, leer y escribir con.Value, y entender el modeloApplication > Workbook > Worksheet > Range. - Escribir fórmulas con las cuatro propiedades (
.Formula,.FormulaLocal,.FormulaR1C1,.FormulaR1C1Local) y diagnosticar el error 1004 cuando se mezcla el idioma. - Detectar las macros que dependen de VBScript y migrar las que usan
RegExpa la referencia interna de Office 2508.
El siguiente paso es convertir la macro RecorrerTotales en una función LAMBDA que calcule el total por fila sin abrir el editor: en Fórmulas > Administrador de nombres, crea un nombre TotalFila con =LAMBDA(unidades;precio;unidades*precio) y úsala en la columna D como =TotalFila(B2;C2). Tendrás la misma automatización, pero en una fórmula reutilizable.
Datos comprobados en octubre de 2026.
Dudas al usar VBA en Excel
1. ¿Microsoft va a dejar de soportar VBA?
Microsoft ha confirmado que VBA seguirá presente en Office, aunque la apuesta de futuro para la web es Office Scripts. En escritorio puedes seguir usándolo con normalidad, pero conviene ir mirando la alternativa si trabajas con Excel en la nube.
2. ¿VBA está deprecated?
No, VBA no está marcado como obsoleto y sigue incluido en las versiones de escritorio de Excel. Microsoft solo desaconseja VBA para nuevas soluciones en la nube, donde la alternativa oficial es Office Scripts.
3. ¿Qué diferencia hay entre VBA y VBScript?
VBA vive dentro de aplicaciones como Excel y automatiza lo que tienes delante; VBScript es un lenguaje externo de Windows, ya en desuso, que servía para ejecutar scripts desde el sistema o desde páginas web. Hoy, para automatizar Excel, VBA (en escritorio) u Office Scripts (en la web) son las opciones actuales.
4. ¿Qué son los Office Scripts?
Office Scripts son la alternativa a VBA para Excel en la web y para Mac, escritos en JavaScript o TypeScript y grabables con la acción Grabar. Son multiplataforma y funcionan donde VBA no llega, como Excel para la web.
5. ¿Qué es Power Query?
Power Query es el motor de importar, limpiar y combinar tablas de Excel, disponible desde 2016 y como app propia. A diferencia de VBA, trabaja con clics y menús (Datos > Obtener y transformar) y deja las transformaciones grabadas para actualizarlas con un botón.
6. ¿Qué es early binding y late binding en VBA?
Early binding declara la librería (por ejemplo, As Scripting.Dictionary) y da IntelliSense; late binding usa CreateObject("Scripting.Dictionary") sin referencia previa, lo que evita problemas de versión a cambio de no tener autocompletado.
Fuentes
- MicrosoftLAMBDA — documentación oficialconsultado el 06/10/2026
- MicrosoftRange.Formula, FormulaLocal, FormulaR1C1 y FormulaR1C1Local — documentación oficialconsultado el 06/10/2026
- MicrosoftEl editor de VBA y la primera macro — documentación oficialconsultado el 06/10/2026
- MicrosoftAtajos que funcionan igual en cualquier idioma — documentación oficialconsultado el 06/10/2026