Imagina que tienes una hoja con decenas de clientes y necesitas mandar a cada uno un correo personalizado con su nombre y su importe. Hacerlo a mano es lento y se presta a errores. La solución es una macro de VBA que abra Outlook desde Excel, arme el mensaje con los datos de cada fila y lo envíe. Al terminar este tutorial sabrás preparar el editor, escribir la macro mínima, recorrer una hoja para mandar un mensaje por fila, adjuntar el propio libro y arreglar los errores más habituales. Funciona en Excel 2010, 2013, 2016, 2019, 2021, 2024 y Microsoft 365, siempre con Outlook clásico de escritorio instalado y un libro guardado como .xlsm.
Qué es la automatización entre Excel y Outlook y para qué te sirve
VBA es el lenguaje de macros que lleva Excel dentro. Con él puedes abrir otros programas de Office, y Outlook es el más útil para automatizar correos. La idea es sencilla: una hoja llamada Clientes guarda el correo, el nombre y el importe de cada persona; una macro lee cada fila, abre Outlook, escribe un mensaje personalizado y lo manda. Tú pulsas un botón y, en lugar de teclear cincuenta correos, los cincuenta salen solos con el saludo y la cifra correcta en cada uno.
Lo que de verdad aporta VBA aquí no es pulsar un botón: es que el mensaje cambia fila a fila leyendo la hoja. Eso convierte una lista en una comunicación real sin copiar y pegar, y deja un registro en el libro de qué se envió, a quién y cuándo. Cuando los datos ya están en Excel (facturas, nóminas, avisos, recordatorios), mandar el correo desde la misma hoja ahorra pasos y reduce errores de transcripción.
Lo que necesitas para que VBA hable con Outlook
- Outlook clásico de escritorio, instalado y configurado con tu cuenta. No vale la versión "Outlook (nuevo)" basada en web: está en Windows 11 y no expone los objetos que usa VBA.
- La referencia a Outlook activada en el editor de VBA. Sin ella, Excel no sabe qué es un
MailItemy cada línea conOutlook.marca error de compilación. - Un libro guardado como
.xlsm, el formato de libro con macros. Si guardas como.xlsx, las macros se borran al cerrar y tendrás que empezar de cero. - Permisos para enviar: si Outlook te pide confirmación la primera vez, acéptala y marca "Permitir" para que la macro pueda mandar sola más adelante.
- Carpeta de Confianza o archivo desbloqueado: Excel bloquea las macros de archivos descargados de internet hasta que las desbloquees en
Archivo > Información > Propiedades > Desbloquear.
Outlook.Application solo funciona en escritorio con Outlook clásico de Windows.Activar la referencia a Outlook desde el editor de VBA
- Abre el libro y pulsa Alt+F11 para entrar al editor de VBA.
- En el menú del editor ve a
Herramientas > Referencias.... - Marca la casilla Microsoft Outlook XX.0 Object Library (XX es la versión, por ejemplo 16.0 para Outlook 2016/2019/2021/2024/365).
- Pulsa Aceptar.
Dim app As Outlook. y te aparece Application en la lista desplegable, la referencia está bien.La macro mínima: crear un correo desde Excel
Sub CrearCorreoMinimo()
Dim OutlookApp As Outlook.Application
Dim OutlookMail As Outlook.MailItem
Set OutlookApp = New Outlook.Application
Set OutlookMail = OutlookApp.CreateItem(olMailItem)
With OutlookMail
.To = "cliente@ejemplo.com"
.Subject = "Resumen de tu pedido"
.Body = "Hola, este es un mensaje de prueba desde Excel."
.Display
End With
Set OutlookMail = Nothing
Set OutlookApp = Nothing
End Sub
Se abre una ventana de Outlook con un mensaje nuevo dirigido a cliente@ejemplo.com, asunto "Resumen de tu pedido" y el cuerpo indicado.
El objeto Application y la función CreateObject
Hay dos formas de abrir Outlook desde VBA. La primera, la que usa la macro anterior, es crear el objeto con New Outlook.Application después de activar la referencia. La segunda no necesita referencia: usa CreateObject, una función de VBA que crea un objeto a partir de su nombre de programa.
Sub ConCreateObject()
Dim OutlookApp As Object
Dim OutlookMail As Object
Set OutlookApp = CreateObject("Outlook.Application")
Set OutlookMail = OutlookApp.CreateItem(0)
OutlookMail.To = "cliente@ejemplo.com"
OutlookMail.Subject = "Sin referencia"
OutlookMail.Body = "Funciona aunque la referencia no esté activada."
OutlookMail.Display
End Sub
CreateObject declara todo como Object, así que pierdes el autocompletado y el IntelliSense. A cambio, el libro sirve en cualquier equipo con Outlook sin tocar referencias. Úsalo cuando compartas el archivo; usa la referencia cuando trabajes tú solo y quieras ver las propiedades mientras escribes.
Las propiedades de un MailItem que tocas siempre
| Propiedad | Para qué sirve | Ejemplo |
|---|---|---|
.To |
Destinatario principal. Varios separados por ; |
.To = "a@x.com; b@x.com" |
.CC |
Destinatarios en copia | .CC = "jefe@x.com" |
.BCC |
Copia oculta (cco) | .BCC = "archivo@x.com" |
.Subject |
Asunto del mensaje | .Subject = "Factura 2026" |
.Body |
Cuerpo en texto plano | .Body = "Hola..." |
.HTMLBody |
Cuerpo en HTML, permite formato | .HTMLBody = "<b>Hola</b>" |
.Attachments.Add |
Adjunta un archivo al mensaje | .Attachments.Add "C:\\ruta\\archivo.pdf" |
.Display |
Abre el mensaje en una ventana sin enviarlo | — |
.Send |
Envía el mensaje de inmediato | — |
El orden lógico: primero los destinatarios (.To, .CC, .BCC), después .Subject, después el cuerpo (.Body o .HTMLBody), luego los adjuntos y por último .Display para revisar o .Send para mandar.
Enviar un correo por cada fila de la hoja con un bucle
| A | B | C | |
|---|---|---|---|
| 1 | Correo | Nombre | Importe |
| 2 | ana@ejemplo.com | Ana Pérez | 125,00 |
| 3 | luis@ejemplo.com | Luis Gómez | 89,50 |
| 4 | maria@ejemplo.com | María Ruiz | 240,00 |
| 5 | jose@ejemplo.com | José Soto | 56,75 |
| 6 | rosa@ejemplo.com | Rosa Vidal | 312,40 |
- Crea una hoja llamada Clientes con los datos anteriores.
- Abre el editor con Alt+F11, inserta un módulo (
Insertar > Módulo) y pega la macro siguiente. - Ejecuta la macro con Alt+F8 o desde
Desarrollador > Macros > Ejecutar.
Sub EnviarPorFila()
Dim OutlookApp As Outlook.Application
Dim OutlookMail As Outlook.MailItem
Dim i As Long
Dim UltimaFila As Long
UltimaFila = ThisWorkbook.Worksheets("Clientes").Cells(Rows.Count, 1).End(xlUp).Row
Set OutlookApp = New Outlook.Application
For i = 2 To UltimaFila
Set OutlookMail = OutlookApp.CreateItem(olMailItem)
With OutlookMail
.To = Worksheets("Clientes").Cells(i, 1).Value
.Subject = "Resumen para " & Worksheets("Clientes").Cells(i, 2).Value
.Body = "Hola " & Worksheets("Clientes").Cells(i, 2).Value & "," & vbCrLf & _
"Tu importe de este mes es " & Format(Worksheets("Clientes").Cells(i, 3).Value, "#,##0.00") & " EUR."
.Display
End With
Set OutlookMail = Nothing
Next i
Set OutlookApp = Nothing
End Sub
La versión con .Display para revisar antes de enviar
.Display
Deja .Display como en la macro anterior. Cada correo se queda abierto en una ventana de Outlook y tú decides uno a uno si lo envías, lo borras o lo editas. Es la versión segura para la primera prueba: si los datos están mal, no has mandado nada todavía.
La versión con .Send para enviar de verdad
.Send
Cambia .Display por .Send en la macro anterior y vuelve a ejecutarla. El mensaje sale de la bandeja en cuanto se ejecuta la línea, sin pedirte confirmación y sin abrir la ventana del correo.
Adjuntar el propio libro al correo
.Attachments.Add ThisWorkbook.FullName
Añade esa línea dentro del bloque With OutlookMail, antes de .Display o .Send. ThisWorkbook.FullName devuelve la ruta completa del libro actual, así que el destinatario recibe el .xlsm con la macro. Si prefieres una copia con otro nombre, usa ThisWorkbook.Path & "\\Resumen.xlsx" y guárdala antes con ThisWorkbook.SaveCopyAs.
Escribir el cuerpo del correo con saltos de línea y datos de la fila
vbCrLf es el código que VBA usa para insertar un salto de línea, igual que Alt+Entrar dentro de una celda. Concatenando con & construyes mensajes largos a partir de varias piezas y de los datos que lees de la hoja.
.Body = "Hola " & Worksheets("Clientes").Cells(i, 2).Value & vbCrLf & _
"Tu importe es " & Format(Worksheets("Clientes").Cells(i, 3).Value, "#,##0.00") & " EUR." & vbCrLf & _
"Gracias por tu confianza."
="Hola " & B2 & vbCrLf & "Tu importe es " & TEXTO(C2;"#,##0.00") & " EUR."
Si necesitas negrita, colores o un enlace, cambia .Body por .HTMLBody y usa etiquetas HTML. La etiqueta <br> hace lo mismo que vbCrLf pero en HTML.
.HTMLBody = "<p>Hola <b>" & Worksheets("Clientes").Cells(i, 2).Value & "</b>,</p>" & _
"<p>Tu importe es <span style='color:#0066cc;'>" & _
Format(Worksheets("Clientes").Cells(i, 3).Value, "#,##0.00") & " EUR.</span></p>" & _
"<p>Gracias por tu confianza.</p>"
Por qué la macro no encuentra Outlook o da error 429
El error 429 ("El componente ActiveX no puede crear el objeto") significa que VBA ha intentado abrir Outlook y no ha podido. Las causas más habituales son cuatro. Primero, que Outlook no esté abierto: aunque la macro lo crea, algún antivirus o perfil bloquea el inicio automático; ábrelo una vez a mano y vuelve a probar. Segundo, que la referencia a Outlook no esté activada: entra en Herramientas > Referencias y comprueba que Microsoft Outlook XX.0 Object Library sigue marcada. Tercero, que el antivirus esté bloqueando el envío: revisa el registro del antivirus y crea una excepción para OUTLOOK.EXE y para EXCEL.EXE. Cuarto, que uses el nuevo Outlook en Windows 11: ese Outlook no expone Outlook.Application por COM, así que VBA no puede controlarlo; vuelve al Outlook clásico desde el menú de tres puntos de Outlook.
Pasos para diagnosticarlo:
- Abre Outlook a mano y comprueba que recibe correos.
- En el editor de VBA, abre
Inmediatocon Ctrl+G y escribe?CreateObject("Outlook.Application")y Entrar. Si da error, el problema es de instalación, no de la macro. - Confirma la referencia en
Herramientas > Referencias. - Desactiva el antivirus unos minutos y repite la prueba.
El error 1004 al asignar una fórmula o el 91 con variables de objeto
El error 1004 aparece al asignar .Formula en VBA con texto en español o con punto y coma: las propiedades Range.Formula y Range.FormulaR1C1 exigen la fórmula en inglés y con comas. La solución es cambiar a FormulaLocal y separar con punto y coma, o reescribir la fórmula en inglés.
El error 91 ("Variable de objeto o bloque With no establecido") aparece cuando declaras una variable de objeto sin Set o cuando usas un objeto que ya quedó en Nothing. Revisa que cada CreateObject y cada CreateItem vayan con su Set delante y que al final del procedimiento liberas todas las variables con Set ... = Nothing, como en los ejemplos de este tutorial. Si la macro falla a mitad del bucle, el siguiente Set OutlookMail = OutlookApp.CreateItem(olMailItem) parte de cero, así que un error en una fila no impide mandar las siguientes.
El nuevo Outlook: por qué la macro deja de funcionar
El nuevo Outlook que Microsoft está activando por defecto en Windows 11 está construido sobre tecnología web y no expone la interfaz COM que VBA necesita para crear objetos Outlook.Application. Por eso cualquier macro que uses con New Outlook.Application o CreateObject("Outlook.Application") devuelve error 429 en cuanto lo abres.
Los límites que debes respetar al mandar correos desde VBA
- Tamaño total del mensaje: Outlook 2010 y posteriores admiten mensajes de hasta 25 MB por la interfaz MAPI; los servidores suelen tener un límite menor (10-25 MB según el proveedor).
- Adjuntos: en
Attachments.Addla ruta debe existir en disco. Si el archivo está abierto en otro programa, Outlook puede añadir una copia temporal o fallar. - Velocidad de envío: si mandas cientos de correos seguidos, Outlook puede ralentizarse o bloquearlos como spam. Una pausa de uno o dos segundos entre envíos (
Application.Wait Now + TimeValue("00:00:02")) ayuda. - Aviso de programa externo: Outlook puede mostrar un cuadro pidiendo permiso cada vez que VBA envía. Acéptalo durante la sesión y, si tu versión lo permite, marca "Permitir siempre" para esa macro.
- Tipos de archivo bloqueados: Outlook bloquea adjuntos con extensiones como
.exe,.bato.js. Adjuntar el propio.xlsmfunciona; adjuntar un.exerequerirá cambiar la configuración del centro de confianza. - Caducidad de la sesión: si Outlook está cerrado mucho tiempo, puede pedir contraseña de nuevo. Ten las credenciales a mano o usa un perfil con autenticación moderna.
Lo que ya sabes hacer con VBA y Outlook y el siguiente paso
- Activar la referencia a Outlook y abrir la aplicación con
New Outlook.ApplicationoCreateObject. - Crear un
MailItem, fijar destinatarios, asunto, cuerpo en texto o en HTML y adjuntar archivos. - Recorrer la hoja Clientes con un bucle
Fory mandar un mensaje personalizado por fila. - Revisar con
.Displayo enviar de verdad con.Send, y adjuntar el propio libro conThisWorkbook.FullName. - Reconocer los errores 429, 91 y 1004, y entender por qué el nuevo Outlook no sirve con VBA.
El siguiente paso es la grabadora de macros: ve a Desarrollador > Grabar macro, haz clic a mano en cada botón de Outlook que te interese y mira el código que aparece en el módulo. El nombre de cada propiedad y cada método de Outlook está ahí, en inglés, y copiarlo de la grabadora es la forma más rápida de aprenderlo sin tener que buscarlo en la documentación.
Datos comprobados en octubre de 2026.
Dudas al enviar correos desde Excel con VBA y Outlook
1. ¿Hay alguna alternativa a VBA en el nuevo Outlook?
Microsoft ha ido retirando el acceso a VBA en el Nuevo Outlook, por eso muchos usuarios buscan alternativas. Las dos opciones mas estables hoy son Scripts de Office (que se programan en JavaScript y funcionan en Outlook para la web y en escritorio con cuenta compatible) y Power Automate, que permite crear flujos automaticos para leer y enviar correos sin escribir codigo.
2. ¿Donde se descarga el complemento de VBA para Outlook?
No existe un complemento aparte que se descargue: VBA viene integrado en las versiones de escritorio de Outlook, dentro del paquete de Office. Lo unico que tienes que hacer es mostrar la pestana Programador desde Archivo > Opciones > Personalizar cinta de opciones y, si vas a programar, asegurarte de que Outlook reconoce los objetos de la libreria que uses desde Excel.
3. ¿Cuando termina el soporte de Microsoft para VBA?
Microsoft ha anunciado que seguira dando soporte a VBA en las aplicaciones de escritorio de Office, pero el Nuevo Outlook ya no permite ejecutar macros VBA. En la practica, VBA sigue vivo en Excel, Word y Outlook clasico, y lo que esta cambiando es el cliente, no el lenguaje.
4. ¿Como se usa VBA dentro de Outlook?
En Outlook, abre el editor con Alt+F11 y crea un modulo nuevo en Proyecto1. Desde ahi escribes un Sub que use objetos del modelo de Outlook, por ejemplo Application.Session para acceder a la sesion, Namespace("MAPI").GetDefaultFolder(olFolderInbox) para abrir la bandeja de entrada y MailItem.Body para leer el contenido del correo. Al ejecutar la macro, veras el resultado en la ventana Inmediato (Ctrl+G).
5. ¿Se puede conectar Outlook desde Excel con VBA?
Si. En Excel, Alt+F11 abre el editor y en Herramientas > Referencias marcas Microsoft Outlook 2.x Object Library. Luego ya puedes escribir Sub que use CreateObject("Outlook.Application") para abrir Outlook desde codigo, Namespace("MAPI").GetDefaultFolder(olFolderInbox) para leer la bandeja, y .Send o .Display para enviar correos con los datos de tu hoja.
6. ¿Sigue mereciendo la pena aprender VBA en 2026?
Si trabajas con Excel y Outlook de escritorio, VBA sigue siendo la forma mas rapida de automatizar tareas como enviar correos, procesar bandejas de entrada o generar informes. Eso si, conviene combinarlo con Power Query para limpiar datos y, si tu empresa migra al Nuevo Outlook, ir probando Scripts de Office como complemento.
Fuentes
- MicrosoftHow do I create a macro that runs a VBA script in Outlook?consultado el 05/10/2026
- MicrosoftLAMBDA — documentación oficialconsultado el 05/10/2026
- MicrosoftRange.Formula, FormulaLocal, FormulaR1C1 y FormulaR1C1Local — documentación oficialconsultado el 05/10/2026
- MicrosoftEl editor de VBA y la primera macro — documentación oficialconsultado el 05/10/2026
- MicrosoftAtajos que funcionan igual en cualquier idioma — documentación oficialconsultado el 05/10/2026