Cuando una hoja de cálculo empieza a guardar miles de pedidos, clientes y direcciones, llega un punto en que copiar y pegar deja de servir. VBA es el puente que une Excel y Access: desde una macro puedes abrir una base, escribir registros nuevos, traer tablas enteras o ejecutar una consulta SQL con parámetros. Al terminar este tutorial verás cómo hacer ese viaje de ida y vuelta en ambas direcciones: de Excel a Access y de Access a Excel, todo desde el editor de Visual Basic que ya trae tu Excel.
Funciona en Excel para Microsoft 365, 2024, 2021, 2019 y 2016 para Windows. Access solo existe para Windows, así que estas macros no corren en Mac ni en Excel para la web. Si no tienes Access instalado, el código de más adelante abre bases creadas con el motor Access Database Engine, que también es de Microsoft.
Qué puede hacer VBA entre Excel y Access
Imagina el inventario de un almacén: empieza en una hoja de Excel con productos y precios, pero al sumar pedidos, proveedores y ubicaciones las columnas se multiplican y empiezan a faltar relaciones. Access aguanta muchos más registros y, sobre todo, permite consultas SQL entre tablas. Cuando tocas datos guardados en Access desde Excel, copiar y pegar deja tres huellas que VBA evita: solo trae lo visible, pierde los formatos y se corta si la tabla pasa de unos miles de filas.
La macro abre la base de Access desde Excel, lee la tabla Productos y la pega con sus encabezados. Al revés, escribe los nuevos pedidos que entran en una hoja de Excel directamente sobre la tabla Pedidos de Access. Cuando se hace a mano, cada paso es un riesgo; cuando lo hace VBA, se repite igual cada vez.
=SI(A1>10,"Alto","Bajo"). Aquí usamos punto y coma por la configuración española.El modelo de objetos de Excel y Access en VBA
Excel expone sus piezas como una escalera que va de lo más grande a lo más pequeño: Application es el propio Excel, Workbooks la colección de libros abiertos, Worksheets las hojas de un libro y Worksheet una hoja en concreto. Sobre ella, un Range o una Cells(fila, columna) apunta a una celda o a un bloque. Access tiene una escalera parecida: Application abre Access, DBEngine es el motor de datos, CurrentData.Project.DB es la base abierta y TableDefs la colección de tablas.
Acceso a la base de Access
DoCmd ejecuta acciones (abrir formularios, informes, compactar). Recordset recorre filas reales de una tabla o del resultado de una consulta SQL. Se crea con CurrentDb.OpenRecordset("Clientes"), se avanza con .MoveNext y se cierra con .Close. DBEngine.OpenDatabase("C:\Datos\Tienda.accdb") abre la base desde fuera, sin lanzar Access.
| Objeto | Dónde está | Para qué sirve |
|---|---|---|
Range("A1") |
Excel | Lee o escribe el valor de una celda |
Worksheets("Hoja1") |
Excel | Apunta a una hoja por su nombre |
DBEngine.OpenDatabase |
Access | Abre un archivo .accdb o .mdb |
CurrentDb.OpenRecordset |
Access | Devuelve filas de una tabla o consulta |
DoCmd.OpenReport |
Access | Abre un informe con nombre |
QueryDef |
Access | Ejecuta una consulta SQL guardada o en texto |
Propiedades y métodos: los adjetivos y verbos del modelo
Una propiedad describe cómo es el objeto y un método ejecuta una acción. Range("A1").Value = "Hola" es una propiedad: cambia el contenido de la celda. DoCmd.OpenReport "Ventas" es un método: le pide a Access que abra el informe. La regla práctica: lo que lleva paréntesis es método, lo que no lleva paréntesis es propiedad.
Sub PropiedadesYMetodos()
' Propiedad: cambiar el valor de A1
Range("A1").Value = "Hola"
' Método: dar formato en negrita
Range("A1").Font.Bold = True
' Método: lanzar una macro de Access
DoCmd.OpenReport "VentasMensuales", acViewPreview
End Sub
Activar la pestaña Programador y abrir el editor de VBA
La pestaña Programador viene oculta por defecto. La activas una vez y queda para siempre en este equipo.
- Abre Excel y ve a Archivo > Opciones.
- En la ventana de Opciones, elige Personalizar cinta de opciones.
- En la columna de la derecha (Pestañas principales), marca la casilla Programador.
- Pulsa Aceptar. La pestaña Programador aparece a la derecha de Vista.
- Pulsa Alt+F11 para abrir el editor de Visual Basic.
- En el editor, ve a Insertar > Módulo para crear un módulo en blanco donde escribirás el código.
Grabar la primera macro y leer lo que VBA escribe
La grabadora de macros es la mejor profesora: hace lo que tú haces y deja el código escrito en VBA.
- En la hoja Inventario, escribe en A1 Producto, en B1 Precio, en C1 Cantidad.
- Rellena A2 con Cuaderno, B2 con 3,20, C2 con 5; A3 con Bolígrafo, B3 con 0,90, C3 con 12; A4 con Carpeta, B4 con 2,50, C4 con 8; A5 con Grapa, B5 con 1,10, C5 con 20; A6 con Pegamento, B6 con 2,75, C6 con 4.
- Ve a Programador > Código > Grabar macro. Deja el nombre
TotalPorLineay almacénalo en Este libro. - Pulsa Aceptar.
- Selecciona D1 y escribe
Total. Pulsa Intro. - Selecciona D2 y escribe
=B2*C2en la barra de fórmulas. Pulsa Intro. - Copia D2, pega en D3:D6.
- Vuelve a Programador > Código > Detener grabación.
- Pulsa Alt+F11, abre el módulo
Módulo1y mira el código que escribió la grabadora.
Sub TotalPorLinea()
Range("D1").Select
ActiveCell.FormulaR1C1 = "Total"
Range("D2").Select
ActiveCell.FormulaR1C1 = "=RC[-2]*RC[-1]"
Range("D2").Select
Selection.Copy
Range("D3:D6").Select
ActiveSheet.Paste
End Sub
Como ves, la grabadora escribe FormulaR1C1 con la fórmula en inglés y referencias estilo R1C1: RC[-2] son dos columnas a la izquierda, RC[-1] una. Esa misma fórmula en estilo A1 sería =B2*C2.
Cómo se guarda un libro con macros
El libro donde guardas macros no puede guardarse como .xlsx: Excel las borra al guardar. Hay que usar el formato Libro de Excel habilitado para macros (.xlsm).
- Pulsa F12 (Guardar como).
- En Tipo, elige *Libro de Excel habilitado para macros (.xlsm)**.
- Pulsa Guardar.
.xlsx y vuelves a abrir, las macros han desaparecido sin aviso.Llevar datos de Excel a Access con VBA
Ahora la hoja Clientes del inventario va a alimentar la tabla Clientes de Access. El código abre la base y graba fila a fila.
| A | B | C | |
|---|---|---|---|
| 1 | Nombre | Ciudad | |
| 2 | Ana | ana@correo.com | Lima |
| 3 | Beto | beto@correo.com | Cusco |
| 4 | Carla | carla@correo.com | Arequipa |
| 5 | David | david@correo.com | Lima |
| 6 | Eva | eva@correo.com | Trujillo |
- Crea una base llamada
Tienda.accdbenC:\Datos\y, dentro, una tablaClientescon camposNombre(texto),Email(texto) yCiudad(texto). - En Excel, abre Alt+F11 y crea un módulo llamado
ModClientes. - Pega el código siguiente.
- Ejecuta con Alt+F8, elige
SubirClientesy pulsa Ejecutar.
Sub SubirClientes()
Dim db As DAO.Database
Dim rs As DAO.Recordset
Dim fila As Long
Set db = DBEngine.OpenDatabase("C:\Datos\Tienda.accdb")
Set rs = db.OpenRecordset("Clientes")
fila = 2
Do While Worksheets("Clientes").Cells(fila, 1).Value <> ""
rs.AddNew
rs!Nombre = Worksheets("Clientes").Cells(fila, 1).Value
rs!Email = Worksheets("Clientes").Cells(fila, 2).Value
rs!Ciudad = Worksheets("Clientes").Cells(fila, 3).Value
rs.Update
fila = fila + 1
Loop
rs.Close
db.Close
MsgBox "Subidos " & fila - 2 & " clientes."
End Sub
Tienda.accdb, la tabla Clientes tiene cinco registros con los mismos datos que la hoja.Las dos referencias que necesitas marcar
DAO no está marcado por defecto. Sin esas dos referencias, el código no compila.
- En el editor de VBA, abre Herramientas > Referencias.
- Marca Microsoft Office x.x Access database engine Object Library.
- Marca Microsoft Scripting Runtime.
- Pulsa Aceptar.
Cerrar el Recordset y compactar la base al terminar
.Close libera memoria y .Update guarda el registro. Olvidarse de cerrar deja el archivo bloqueado hasta que Access se cierra por completo.
Traer una tabla de Access a Excel con VBA
Ahora el camino inverso: la tabla Pedidos de Access cae en la hoja Pedidos de un Excel nuevo, ya con encabezados.
| A | B | C | D | |
|---|---|---|---|---|
| 1 | IdPedido | Fecha | IdCliente | Importe |
| 2 | 1 | 2026-01-15 | 1 | 150,00 |
| 3 | 2 | 2026-01-18 | 2 | 90,00 |
| 4 | 3 | 2026-01-22 | 3 | 230,00 |
| 5 | 4 | 2026-02-04 | 1 | 45,00 |
| 6 | 5 | 2026-02-10 | 4 | 320,00 |
Sub TraerPedidos()
Dim db As DAO.Database
Dim rs As DAO.Recordset
Dim ws As Worksheet
Dim i As Long
Set db = DBEngine.OpenDatabase("C:\Datos\Tienda.accdb")
Set rs = db.OpenRecordset("Pedidos")
Set ws = Worksheets.Add
ws.Name = "Pedidos"
ws.Range("A1").Value = "IdPedido"
ws.Range("B1").Value = "Fecha"
ws.Range("C1").Value = "IdCliente"
ws.Range("D1").Value = "Importe"
ws.Range("A1:D1").Font.Bold = True
i = 2
Do While Not rs.EOF
ws.Cells(i, 1).Value = rs!IdPedido
ws.Cells(i, 2).Value = rs!Fecha
ws.Cells(i, 3).Value = rs!IdCliente
ws.Cells(i, 4).Value = rs!Importe
rs.MoveNext
i = i + 1
Loop
rs.Close
db.Close
End Sub
Comparar con la ruta sin código
Cuando la tabla no necesita lógica ni transformación, la ruta sin código es más rápida.
- Ve a Datos > Obtener datos > Desde base de datos > Desde Microsoft Access.
- Elige
Tienda.accdby la tablaPedidos. - Pulsa Cargar.
Power Query trae los datos y permite refrescarlos al cambiar la base. VBA conviene cuando hay lógica (por ejemplo, aplicar tipos, saltarse filas o disparar cálculos fila a fila) o cuando la exportación debe quedar dentro de un proceso automático.
Ejecutar consultas de Access desde Excel
La tabla Clientes y Pedidos se pueden cruzar con SQL. La consulta siguiente devuelve cuánto ha facturado cada ciudad.
Sub TotalPorCiudad()
Dim db As DAO.Database
Dim rs As DAO.Recordset
Dim ws As Worksheet
Dim sql As String
Set db = DBEngine.OpenDatabase("C:\Datos\Tienda.accdb")
sql = "SELECT Clientes.Ciudad, Sum(Pedidos.Importe) AS Total " & _
"FROM Clientes INNER JOIN Pedidos " & _
"ON Clientes.IdCliente = Pedidos.IdCliente " & _
"GROUP BY Clientes.Ciudad"
Set rs = db.OpenRecordset(sql)
Set ws = Worksheets.Add
ws.Name = "Totales"
ws.Range("A1").Value = "Ciudad"
ws.Range("B1").Value = "Total"
ws.Range("A1:B1").Font.Bold = True
ws.Range("A2").CopyFromRecordset rs
rs.Close
db.Close
End Sub
Ciudad Total
Lima 195,00
Cusco 90,00
Arequipa 230,00
Trujillo 320,00
Pasar parámetros a la consulta
VBA puede cambiar una parte de la SQL justo antes de ejecutarla. El año se lee de la celda B1 del Excel y se mete con & dentro del texto SQL.
Sub TotalPorAnio()
Dim db As DAO.Database
Dim rs As DAO.Recordset
Dim sql As String
Dim anio As Long
Set db = DBEngine.OpenDatabase("C:\Datos\Tienda.accdb")
anio = Worksheets("Parametros").Range("B1").Value
sql = "SELECT Clientes.Ciudad, Sum(Pedidos.Importe) AS Total " & _
"FROM Clientes INNER JOIN Pedidos " & _
"ON Clientes.IdCliente = Pedidos.IdCliente " & _
"WHERE Year(Pedidos.Fecha) = " & anio & " " & _
"GROUP BY Clientes.Ciudad"
Set rs = db.OpenRecordset(sql)
Worksheets("TotalesAnio").Range("A2").CopyFromRecordset rs
rs.Close
db.Close
End Sub
2025 y vuelve a ejecutar: solo aparecen los pedidos de ese año.Los errores que aparecen al cruzar Excel y Access
Error 1004 al asignar una fórmula en español a .Formula
Si escribes Range("D2").Formula = "=SUMA(A2:A10)" en un Excel en español, VBA responde con error 1004. La solución es usar .FormulaLocal (acepta español y punto y coma) o pasar la fórmula a inglés: Range("D2").Formula = "=SUM(A2:A10)".
Error 3705 al no cerrar el Recordset
Cuando una macro termina y deja un Recordset abierto, la siguiente ejecución devuelve el error 3705: La operación no está permitida en este tipo de objeto. La solución es llamar siempre a rs.Close y db.Close antes de End Sub.
"No se encuentra el proveedor" al abrir la base
VBA no encuentra el motor de Access Database Engine cuando falta la referencia. Marca Microsoft Office x.x Access database engine Object Library en Herramientas > Referencias. Si usas Access 2016 o superior y Office de 32 bits, instala el motor de 32 bits; si es de 64 bits, el de 64 bits.
Por qué a veces VBA "no hace" a Excel
Si guardas el libro en .xlsx, las macros desaparecen la próxima vez que abras el archivo. Vuelve a guardarlo como .xlsm. Si la macro corre desde un archivo bajado de internet, Excel bloquea las macros por seguridad: desbloquea el archivo en el Explorador de Windows, en Propiedades > Desbloquear. Y recuerda: Access solo existe para Windows, así que ningún código con DBEngine corre en Mac ni en Excel para la web.
Lo que ya sabes hacer con Excel, Access y VBA
- Abrir una base de Access desde Excel con
DBEngine.OpenDatabase. - Recorrer una tabla con
Recordset, leer sus campos y volcarlos a una hoja. - Escribir registros nuevos con
.AddNewy.Updatefila a fila. - Ejecutar una consulta SQL con
OpenRecordsety volcar el resultado conCopyFromRecordset. - Pasar parámetros del Excel a la SQL concatenando con
&.
Siguiente paso: graba tu propio proceso (por ejemplo, el cierre mensual) con la grabadora de macros, mira el código que escribe y reemplaza las celdas concretas por variables VBA.
Dudas al conectar Excel y Access con VBA
1. ¿Dónde consultar la documentación oficial de VBA para Excel?
La referencia completa de VBA está en learn.microsoft.com, dentro de la sección Office VBA reference. Allí encontrarás el modelo de objetos de Excel (Workbook, Worksheet, Range), los métodos y propiedades de cada uno, y ejemplos copiables. La ayuda en español está en support.microsoft.com/es-es/office, aunque algunos temas técnicos solo se publican en inglés.
2. ¿Se puede descargar VBA para Excel por separado?
No, VBA viene integrado en las versiones de escritorio de Excel desde 1994 y no se descarga aparte. Lo que sí puedes instalar es el Editor de Visual Basic: se abre con Alt+F11 o desde Programador > Código > Visual Basic. Asegúrate de que la pestaña Programador esté visible activándola en Archivo > Opciones > Personalizar cinta de opciones.
3. ¿Hay alguna forma sencilla de empezar con VBA en Excel sin experiencia previa?
El camino más corto es grabar una macro: en Programador > Código > Grabar macro, haz las acciones sobre la hoja y detén la grabación. Después abre el editor con Alt+F11 y observa el código generado para entender la estructura. A partir de ahí, modificar y crear macros propias se vuelve mucho más intuitivo.
4. ¿Qué necesita un curso básico de VBA para ser útil?
Un buen curso introductorio cubre el editor (Alt+F11), las variables, los bucles For Each y For Next, y los condicionales If…Then. También debe enseñar a trabajar con rangos y a abrir otros libros con Workbooks.Open, que es justo lo necesario para lanzar un archivo de Access desde Excel.
5. ¿Existe un compilador de VBA para crear archivos .exe?
No existe un compilador oficial de VBA, y Microsoft no ofrece uno porque VBA se ejecuta dentro de la aplicación anfitrión. Lo que sí se hace es proteger el código con contraseña desde el editor o convertirlo a un complemento .xlam, que se distribuye como archivo normal de Excel, no como ejecutable.
6. ¿Qué son las macros en Excel y para qué sirven?
Una macro es una secuencia de acciones grabada o escrita en VBA que Excel ejecuta automáticamente al dispararla. Sirven para automatizar tareas repetitivas como dar formato, copiar datos entre hojas o, en este caso, abrir un archivo de Access. Se crean con Programador > Código > Grabar macro o directamente en el editor con Alt+F11.
7. ¿WPS Office tiene su propia biblioteca de soporte para VBA?
WPS Office incluye compatibilidad básica con macros en su versión para Windows, pero su motor es propio y no idéntico al de Excel. Muchas funciones VBA estándar funcionan, aunque algunas referencias y métodos del modelo de objetos de Excel pueden no estar disponibles. Para macros que abran Access, conviene probar antes el código en WPS o usar directamente Microsoft Excel.
8. ¿Cómo mostrar la pestaña Programador en Excel?
Haz clic derecho en cualquier parte de la cinta de opciones y elige Personalizar cinta de opciones. En la columna derecha, marca la casilla Desarrollador (aparece como Programador en algunas versiones) y pulsa Aceptar. La pestaña aparecerá a la derecha de Vista y desde ahí accedes al editor de VBA, las macros y los controles de formulario.
Fuentes
- MicrosoftLAMBDA — documentación oficialconsultado el 13/10/2026
- MicrosoftRange.Formula, FormulaLocal, FormulaR1C1 y FormulaR1C1Local — documentación oficialconsultado el 13/10/2026
- MicrosoftEl editor de VBA y la primera macro — documentación oficialconsultado el 13/10/2026
- MicrosoftExcel y Access — documentación oficialconsultado el 13/10/2026
- MicrosoftHIPERVINCULO — documentación oficialconsultado el 13/10/2026