Outlook

VBA en Outlook desde Excel: cómo leer y enviar correos

octubre 10, 2026 Tuto Excel 14 min read
VBA en Outlook desde Excel: cómo leer y enviar correos

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 MailItem y cada línea con Outlook. 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.
Nota: Excel para la web y Excel para Mac (en sus últimas versiones) pueden ejecutar macros VBA, pero el Outlook.Application solo funciona en escritorio con Outlook clásico de Windows.

Activar la referencia a Outlook desde el editor de VBA

  1. Abre el libro y pulsa Alt+F11 para entrar al editor de VBA.
  2. En el menú del editor ve a Herramientas > Referencias....
  3. 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).
  4. Pulsa Aceptar.
HerramientasReferencias
Comprueba: al volver al editor, si escribes 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

A1fx**Correo**
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
Clientes
  1. Crea una hoja llamada Clientes con los datos anteriores.
  2. Abre el editor con Alt+F11, inserta un módulo (Insertar > Módulo) y pega la macro siguiente.
  3. 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
Comprueba: Outlook se abre y aparece una ventana por cada fila, con el saludo y el importe de esa persona.

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.

Nota: Outlook puede mostrar el aviso "Un programa intenta enviar un correo en tu nombre". Pulsa "Permitir" durante unos minutos si lo ves la primera vez.

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>"
Comprueba: el cuerpo del mensaje muestra el nombre de la fila, el importe con dos decimales y los saltos de línea donde corresponde.

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:

  1. Abre Outlook a mano y comprueba que recibe correos.
  2. En el editor de VBA, abre Inmediato con Ctrl+G y escribe ?CreateObject("Outlook.Application") y Entrar. Si da error, el problema es de instalación, no de la macro.
  3. Confirma la referencia en Herramientas > Referencias.
  4. 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.

Nota: la solución desde VBA es volver a Outlook clásico: en el nuevo Outlook, abre el menú de tres puntos junto a la barra de título y elige "Outlook clásico". Si quieres quedarte en el nuevo Outlook, automatiza el envío con Power Automate (que ya tiene un conector de Outlook) o con la API de Microsoft Graph, que permite mandar correo desde cualquier aplicación mediante HTTP.

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.Add la 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, .bat o .js. Adjuntar el propio .xlsm funciona; adjuntar un .exe requerirá 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.Application o CreateObject.
  • Crear un MailItem, fijar destinatarios, asunto, cuerpo en texto o en HTML y adjuntar archivos.
  • Recorrer la hoja Clientes con un bucle For y mandar un mensaje personalizado por fila.
  • Revisar con .Display o enviar de verdad con .Send, y adjuntar el propio libro con ThisWorkbook.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

  1. MicrosoftHow do I create a macro that runs a VBA script in Outlook?consultado el 05/10/2026
  2. MicrosoftLAMBDA — documentación oficialconsultado el 05/10/2026
  3. MicrosoftRange.Formula, FormulaLocal, FormulaR1C1 y FormulaR1C1Local — documentación oficialconsultado el 05/10/2026
  4. MicrosoftEl editor de VBA y la primera macro — documentación oficialconsultado el 05/10/2026
  5. MicrosoftAtajos que funcionan igual en cualquier idioma — documentación oficialconsultado el 05/10/2026