Para enviar e-mails pelo Outlook usando VBA no Excel, crie uma referência ao Outlook com Dim OutApp As Object: Set OutApp = CreateObject(“Outlook.Application”), gere um novo e-mail com OutApp.CreateItem(0), preencha as propriedades .To, .Subject e .Body, e finalize com .Send (ou .Display para revisar antes de enviar) — sem precisar copiar e colar endereços manualmente.
Você já teve uma planilha com uma lista de clientes ou fornecedores e precisou mandar um e-mail parecido, um por um, trocando só o nome e um valor específico em cada mensagem, um processo repetitivo e sujeito a erro de copiar o destinatário errado?
Sem automatizar esse envio, a alternativa é abrir o Outlook manualmente para cada linha da planilha, copiar o endereço, digitar o assunto e colar o texto do corpo, um trabalho que cresce proporcionalmente ao número de contatos e vira inviável a partir de algumas dezenas de e-mails.
Neste artigo iremos mostrar como referenciar o Outlook a partir do VBA do Excel, montar e enviar um e-mail simples, anexar um arquivo e disparar e-mails em lote para uma lista inteira de contatos com um loop.
Por que usar VBA para enviar e-mails direto do Excel
O Excel não envia e-mails sozinho, mas consegue controlar o Outlook por trás dos panos através do VBA, desde que o Outlook esteja instalado e configurado no computador. Isso permite montar e-mails automaticamente a partir de dados já existentes na planilha — nome, endereço, valores — sem precisar copiar nada manualmente para o corpo da mensagem.
Referenciando o Outlook: Late Binding versus Early Binding
Existem duas formas de o VBA “enxergar” o Outlook. A mais simples, chamada Late Binding, usa CreateObject(“Outlook.Application”) numa variável declarada como Object genérico, e funciona sem nenhuma configuração extra no editor VBA. A segunda forma, Early Binding, exige ativar manualmente, em Ferramentas > Referências dentro do editor VBA, a opção Microsoft Outlook XX.X Object Library, e declarar a variável como Outlook.Application — essa forma oferece sugestões automáticas de código (IntelliSense) enquanto você digita, mas depende da referência estar habilitada em cada computador onde a macro roda. Para a maioria dos casos, o Late Binding é a opção mais simples e portátil.
Código básico para enviar um e-mail simples
O núcleo do envio usa poucas linhas:
| Linha | Código |
|---|---|
| 1 | Dim OutApp As Object, OutMail As Object |
| 2 | Set OutApp = CreateObject(“Outlook.Application”) |
| 3 | Set OutMail = OutApp.CreateItem(0) |
| 4 | OutMail.To = “cliente@empresa.com.br” |
| 5 | OutMail.Subject = “Relatório mensal” |
| 6 | OutMail.Body = “Segue em anexo o relatório deste mês.” |
| 7 | OutMail.Send |
O número 0 dentro de CreateItem(0) representa o tipo de item “e-mail” (o valor correspondente à constante olMailItem do Outlook). As propriedades .To, .CC e .BCC aceitam múltiplos endereços separados por ponto e vírgula dentro do mesmo texto.
Preenchendo destinatário, assunto e corpo com dados da planilha
Em vez de digitar o e-mail e o texto fixos no código, substitua por referências às células da planilha: OutMail.To = Cells(linha;1).Value busca o endereço da coluna A daquela linha, e o corpo pode ser montado concatenando texto fixo com valores de células, como OutMail.Body = “Olá, ” & Cells(linha;2).Value & “. Seu saldo atual é R$ ” & Cells(linha;3).Value.
Anexando um arquivo ao e-mail
Para incluir um anexo, use o método .Attachments.Add, informando o caminho completo do arquivo: OutMail.Attachments.Add “C:\Relatorios\relatorio_mensal.pdf”. Esse comando pode ser repetido várias vezes na mesma macro para anexar mais de um arquivo ao mesmo e-mail.
Enviando e-mails em lote com um loop
Para percorrer uma lista de contatos e enviar um e-mail para cada linha, o código de montagem do e-mail entra dentro de um loop For, variando a linha lida a cada repetição:
| Nome | Valor pendente | |
|---|---|---|
| Marcos Silva | marcos@empresa.com.br | 1.240 |
| Juliana Reis | juliana@empresa.com.br | 860 |
| Renata Costa | renata@empresa.com.br | 2.100 |
Com essa tabela em A2:C4, a macro usa For linha = 2 To 4, e dentro do loop monta e envia um e-mail por linha, trocando Cells(linha;1), Cells(linha;2) e Cells(linha;3) para pegar o nome, o e-mail e o valor de cada contato antes de chamar .Send e passar para a próxima repetição do loop.
Send versus Display: revisar antes de enviar
Trocar .Send por .Display abre o e-mail já pronto na tela do Outlook, permitindo revisar (ou editar manualmente) antes de clicar em enviar, em vez de disparar automaticamente. Essa troca é recomendada enquanto você está testando a macro, evitando enviar e-mails de teste por engano para contatos reais.
Cuidados e erros comuns
O Outlook precisa estar instalado e com uma conta já configurada no computador onde a macro roda — o VBA não consegue configurar uma conta de e-mail do zero. Versões mais recentes do Outlook podem exibir um alerta de segurança perguntando se um programa externo pode enviar e-mails em seu nome, principalmente na primeira execução; esse aviso é uma proteção do próprio Outlook contra vírus e não é um erro da macro. Ao usar Early Binding, lembre-se de que a referência à biblioteca do Outlook precisa estar ativada em cada computador que for rodar a macro — o Late Binding evita esse problema.
Disponibilidade
O envio de e-mails via VBA depende do Outlook estar instalado no Windows — o recurso não funciona no Excel Online, no Excel para Mac (que não tem essa mesma integração de automação com o Outlook) nem no Google Sheets, que não tem suporte a VBA.
Perguntas frequentes
Preciso ter o Outlook aberto para a macro funcionar?
Não necessariamente aberto antes de rodar — o comando CreateObject(“Outlook.Application”) abre o Outlook automaticamente em segundo plano caso ele não esteja em execução, desde que esteja instalado no computador.
É possível enviar o e-mail sem que ele apareça na tela?
Sim, usando .Send em vez de .Display o e-mail é enviado diretamente, sem abrir nenhuma janela visível. Use .Display durante os testes para conferir o conteúdo antes de automatizar o envio final com .Send.
Essa técnica funciona com Gmail ou outro serviço de e-mail?
Não diretamente — o código deste artigo controla especificamente o aplicativo Outlook instalado no Windows. Para enviar e-mails por outros serviços a partir do VBA, seria necessário usar bibliotecas ou protocolos diferentes, como CDO ou SMTP direto.
Veja também: Como Usar Loops no VBA do Excel: For, For Each e Do While e Power Automate com Excel: Como Automatizar Tarefas Sem Saber VBA.
Compartilhe ou Comente
Se você curtiu esse artigo aonde mostramos como enviar e-mails pelo Outlook usando VBA no Excel, desde um e-mail simples até o envio em lote para uma lista de contatos com anexo, compartilhe com as suas redes sociais e não se esqueça de deixar um comentário aqui embaixo caso você tenha ficado com alguma dúvida.
Você já perdeu tempo mandando o mesmo e-mail, um por um, para uma lista de contatos? Pretende automatizar esse envio a partir da sua planilha atual? Conta para nós nos comentários!