🚀The world's best VBA AI has evolved. ExcelMaster is now an autonomous Agent.Read more →
Back to Blog

VBA Outlook en Excel — enviar correo desde una macro (y por qué New Outlook lo rompe)

|

VBA Outlook en Excel — enviar correo desde una macro (y por qué New Outlook lo rompe)

Probado en: Excel 365 v2509 · Excel 2021 · Excel 2019 (Outlook clásico) · última verificación 12/06/2026

En resumen — Enviar correo desde Excel significa manejar el modelo de objetos de otra aplicación. Importan dos decisiones: cómo te conectas a Outlook (el late binding con CreateObject es la opción portable) y cómo envías (.Display para revisar sin riesgo, .Send para disparar al instante y chocar con el aviso de seguridad). Una cosa por adelantado: «New Outlook» ha eliminado por completo el soporte de VBA — esto solo funciona con el Outlook clásico.

Sub EnviarDesdeExcel()
    Dim olApp As Object, mail As Object
    Set olApp = CreateObject("Outlook.Application")   ' late binding — no hace falta referencia
    Set mail = olApp.CreateItem(0)                    ' 0 = olMailItem

    With mail
        .To = "[email protected]"
        .Subject = "Informe diario"
        .Body = "Cifras adjuntas. — enviado desde Excel"
        .Attachments.Add ThisWorkbook.FullName
        .Display                                       ' revisar; .Send dispara al instante
    End With

    Set mail = Nothing
    Set olApp = Nothing
End Sub

El modelo mental: estás controlando otra app a distancia, no escribiendo código de Excel

Todo lo demás en tu macro habla con Excel. Esto no. CreateObject("Outlook.Application") alcanza un programa aparte y lo dirige. Eso reencuadra cada pregunta que sigue: conectarse a Outlook es un apretón de manos entre aplicaciones (así que las diferencias de versión importan), y enviar correo cruza una frontera de seguridad que Excel nunca impone a sus propias celdas (así que un muro de avisos de consentimiento es a propósito, no un bug).

Mantén esa imagen y las dos decisiones reales se vuelven obvias. Primero, cómo consigues un asa sobre Outlook — enlazar temprano con una referencia, o tarde con CreateObject. Segundo, cómo envías de verdad — sacar el borrador para que un humano lo revise, o disparar y encontrarte el aviso de seguridad. Acierta esas dos y el resto es solo rellenar .To, .Subject, .Body.

La única regla: el late binding (CreateObject) viaja; el early binding te ata a una máquina

Esta es la decisión que determina si tu macro sobrevive a un envío a un compañero:

El early binding necesita una referencia (Herramientas → Referencias → Microsoft Outlook XX.0 Object Library). Obtienes IntelliSense y constantes con nombre como olMailItem — pero el archivo queda atado a esa versión exacta de biblioteca y lanza «No se encuentra el proyecto o la biblioteca» en un PC con otro Outlook. El late binding (CreateObject("Outlook.Application"), variables como Object) no tiene referencia, funciona entre versiones, y es el valor por defecto correcto para código que compartes.

El coste del late binding es que las constantes con nombre no existen — usas sus valores numéricos: CreateItem(0) en vez de CreateItem(olMailItem). Un precio pequeño por la portabilidad:

' ✓ LATE BINDING — portable, sin referencia, sobrevive a las diferencias de versión
Dim olApp As Object
Set olApp = CreateObject("Outlook.Application")
Dim mail As Object
Set mail = olApp.CreateItem(0)        ' 0 = olMailItem (la constante no existe aquí)

' El EARLY BINDING (con la referencia) permitiría:
'   Dim olApp As Outlook.Application
'   Set mail = olApp.CreateItem(olMailItem)
' ...pero rompe con «No se encuentra el proyecto o la biblioteca» en otra versión de Outlook.

Usa early binding mientras escribes el código — IntelliSense ayuda de verdad — y cambia a late binding antes de compartir. (Para localizar una instancia existente en vez de arrancar una nueva, GetObject hace pareja con CreateObject.)

La trampa: .Send choca con un muro de seguridad — .Display suele ser lo que quieres

La segunda decisión es cómo sale el correo. .Send despacha al instante — y en la mayoría de las configuraciones eso dispara la guarda de acceso programático de Outlook, el aviso «Un programa intenta enviar un mensaje en su nombre», o un rechazo seco por directiva:

.Display     ' ✓ abre el borrador, un humano revisa y pulsa Enviar — sin aviso de seguridad
.Send        ' ⚠ dispara al instante; espera el aviso o un bloqueo por directiva

.Display esquiva todo el problema manteniendo a un humano en el bucle: el correo se abre, totalmente relleno, y la persona pulsa Enviar. Para un flujo «redáctame 50 correos personalizados para ojearlos y enviarlos», eso no es una limitación — es el diseño más seguro. Reserva .Send para automatización de confianza sin supervisión, y ten en cuenta que hacerlo funcionar en silencio significa tratar el modelo de seguridad (una ubicación de confianza, una directiva de Exchange, o una herramienta como Redemption), no un arreglo de una línea.

El muro que no puedes esquivar con código: New Outlook no tiene VBA

Esta es la parte que los tutoriales antiguos no mencionan, y en 2026 lo más importante de aquí:

«New Outlook» — el cliente web reconstruido que Microsoft despliega por defecto — no admite VBA, ni complementos COM, ni macros. No hay editor de VBA, ni ThisOutlookSession, ni Outlook.Application que automatizar. Todo este artículo exige el Outlook clásico.

No es especulación; es la dirección declarada de Microsoft, y el reemplazo oficial es Power Automate, no un VBA más nuevo. El Outlook clásico aún corre hoy, y CreateObject("Outlook.Application") sigue manejándolo — pero ahora automatizas un cliente que tu propio fabricante ha marcado para la jubilación. Si eliges dónde invertir, eso importa: una macro que envía por el Outlook clásico se apoya en un terreno que ya están despejando.

Cuándo usar cuál

Objetivo Usa
Código que compartirás entre PC Late binding — CreateObject("Outlook.Application")
Código que escribes activamente (quieres IntelliSense) Early binding por referencia, luego cambia antes de compartir
Que un humano revise antes de enviar .Display
Disparar sin supervisión (solo automatización de confianza) .Send (espera el modelo de seguridad)
Adjuntar el libro .Attachments.Add ThisWorkbook.FullName
Reaccionar al correo entrante ThisOutlookSession + WithEvents (solo Outlook clásico)

La opinión: no construyas nueva automatización sobre Outlook VBA en 2026

La línea con la que me comprometo: si empiezas de cero, no ancles tu automatización de correo a Outlook VBA. Funciona en el Outlook clásico hoy, y si ya tienes una macro corriendo, déjala correr. Pero Microsoft fue explícito: New Outlook — el predeterminado de las instalaciones nuevas — no tiene VBA, y «el predeterminado» es hacia donde van tus usuarios, lo eligieran o no. Escribir macros nuevas contra Outlook.Application es construir sobre cimientos que el casero ya ha marcado para demolición.

Trata, pues, el Outlook VBA existente como un legado que mantener, no un patrón que ampliar. Cuando necesites nueva automatización de «Excel alcanza el mundo exterior» — correo, calendarios, movimientos entre apps — elige algo que no dependa de un modelo de proceso que Microsoft está retirando. Los pocos minutos que pasarías cableando CreateObject y peleando con el aviso de seguridad se invierten mejor en un enfoque que seguirá existiendo tras el despliegue de New Outlook.

Errores comunes de VBA Outlook (y la solución)

Síntoma Causa Solución
«No se encuentra el proyecto o la biblioteca» en otro PC Early binding atado a una versión concreta de Outlook Cambiar a late binding (CreateObject, As Object)
Aviso de seguridad en cada .Send La guarda de acceso programático hace su trabajo Usar .Display, o tratar el modelo de seguridad para .Send
429 / «no se pudo crear el objeto» New Outlook (sin VBA) u Outlook no instalado Exige el Outlook clásico
olMailItem no está definido No hay referencia puesta (late binding) Usar el número: CreateItem(0)
Adjunto no encontrado Libro nunca guardado, FullName es solo un nombre Guardar primero; pasar una ruta completa a Attachments.Add
Outlook se queda abierto / fugas de memoria Objetos no liberados Set mail = Nothing y Set olApp = Nothing

Cuando la automatización de correo se acumula — describe la tarea en su lugar

No querías estudiar modos de enlace y avisos de seguridad. Querías «envía a cada responsable las cifras de su equipo cada lunes». Para cuando has elegido el late binding, esquivado el muro de .Send con .Display, y descubierto que la mitad de tus usuarios están en New Outlook donde nada corre, la fontanería se ha comido la mañana. ExcelMaster Agent te deja describir el resultado en español sencillo — «divide esta hoja por responsable y redacta a cada uno un correo con sus filas adjuntas» — y lo hace sin apoyarse en un modelo de proceso que Microsoft retira, haciendo antes una copia de seguridad de tu libro. Pruébalo gratis →

Guías relacionadas

FAQ

¿Cómo envío un correo desde Excel con VBA? Crea un objeto application de Outlook con CreateObject("Outlook.Application"), un elemento de correo con CreateItem(0), define .To, .Subject y .Body, y luego llama a .Display para revisar o .Send para disparar. Usa late binding (As Object) para que la macro corra en cualquier versión de Outlook, y recuerda: hace falta el Outlook clásico.

¿Cuál es la diferencia entre early y late binding para Outlook? El early binding exige una referencia a la Microsoft Outlook Object Library y da IntelliSense y constantes como olMailItem, pero ata el archivo a una versión de Outlook. El late binding usa CreateObject con variables As Object — sin referencia, totalmente portable — a cambio de números como 0 en vez de olMailItem. Comparte el código en late binding.

¿Por qué VBA .Send lanza una advertencia de seguridad? La guarda de acceso programático de Outlook muestra «Un programa intenta enviar un correo en su nombre» para impedir que software malicioso envíe en silencio. Usa .Display para que un humano pulse Enviar, lo que evita el aviso por completo. Para enviar sin supervisión debes satisfacer el modelo de seguridad — una ubicación de confianza, una directiva de Exchange, o una herramienta como Redemption.

¿Funciona VBA en New Outlook? No. New Outlook — el cliente web que Microsoft hace predeterminado — no tiene VBA, ni complementos COM, ni soporte de macros. CreateObject("Outlook.Application") solo maneja el Outlook clásico. El reemplazo que Microsoft recomienda para la automatización es Power Automate.

¿Cómo adjunto un archivo a un correo de Outlook en VBA? Usa .Attachments.Add con una ruta completa: .Attachments.Add ThisWorkbook.FullName adjunta el libro actual. Guarda el libro primero, o FullName devolverá solo el nombre de archivo sin ruta y el adjunto no se encontrará.