PowerPoint

Qué es un proyecto VBA en Excel y cómo crear el primero

octubre 17, 2026 Tuto Excel 15 min read
Qué es un proyecto VBA en Excel y cómo crear el primero

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.

ArchivoOpcionesPersonalizar cinta de opciones

Marca la casilla Programador en la columna derecha y pulsa Aceptar.

ProgramadorCódigoGrabar macro

Ponle nombre MiPrimeraMacro y acepta. Escribe Hola en la celda A1, pulsa Entrar, vuelve a la cinta y pulsa Detener grabación.

ProgramadorCódigoVisual Basic

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.

Cuidado: los libros con macros se guardan como .xlsm (Libro de Excel habilitado para macros). Si guardas como .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:

InsertarMódulo

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.

Comprueba: la celda D2 muestra el producto de B2 por C2 y aparece el cuadro con el mensaje. Si no ves el módulo en el editor, abre la ventana Inmediato con Ctrl+G y escribe 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.

Nota: en Excel configurado con punto decimal (México, Estados Unidos) el separador de argumentos es la coma en vez del punto y coma.

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
Ventas

Activar la pestaña Programador y abrir el editor

  1. Haz clic en Archivo > Opciones > Personalizar cinta de opciones.
  2. En la columna derecha marca la casilla Programador.
  3. Pulsa Aceptar.
  4. 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.

Comprueba: la columna D se rellena con los productos (12,80; 9,60; 15,00; 6,30; 23,75; 28,80; 7,00; 6,90) y al final aparece un 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).

Comprueba: al cambiar a .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.

Cuidado: una matriz cargada con .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)
Nota: la versión 2508 se distribuye por el canal actual de Microsoft 365. En canal Semi-Annual o LTSC la disponibilidad puede ir con meses de retraso.

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.

Cuidado: en equipos con Office anterior a 2508, el archivo con 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:

  1. Abre Panel de control > Programas > Activar o desactivar características de Windows.
  2. Busca VBScript, desmarca la casilla y reinicia Windows.
  3. Abre tu libro .xlsm y habilita las macros.
  4. Ejecuta cada macro con Alt+F8 y anota cuáles fallan.
  5. 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 .vbs con Shell.
  • Caída silenciosa de la macro si el error no está gestionado con On Error Resume Next.
Cuidado: desactivar VBScript afecta a otras aplicaciones de Windows, no solo a Excel. Haz la prueba en un equipo de prueba, no en el de producción.

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 .xlsm se 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 Sub a mano en un módulo, ejecutarlo con F5 o Alt+F8 y guardar el libro como .xlsm.
  • Recorrer la hoja con Range y Cells, leer y escribir con .Value, y entender el modelo Application > 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 RegExp a 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

  1. MicrosoftLAMBDA — documentación oficialconsultado el 06/10/2026
  2. MicrosoftRange.Formula, FormulaLocal, FormulaR1C1 y FormulaR1C1Local — documentación oficialconsultado el 06/10/2026
  3. MicrosoftEl editor de VBA y la primera macro — documentación oficialconsultado el 06/10/2026
  4. MicrosoftAtajos que funcionan igual en cualquier idioma — documentación oficialconsultado el 06/10/2026