VBA Email


É possível enviar emails através do VBA. Um modo simples de se fazer isto é com o auxilio do Outlook.


Habilitando a Biblioteca Outlook

Como visto em VBA Bibliotecas, primeiramente se faz necessário habilitar a biblioteca de referência, realizando o procedimento no formato Early Binding.

Para isto:

  1. No VBE ( + ), na Barra de Menus, clique em Ferramentas
  2. Abra Referências (a caixa de diálogo Referências – VBAProject irá aparecer)
  3. Selecione a biblioteca Microsoft Outlook Object Library
  4. Clique OK
Habilitar Outlook

Lembre-se que é possível realizar este procedimento com formato Late Binding permitindo uma maior compatibilidade com versões anteriores do Excel.

Certifique-se de configurar uma conta no Outlook previamente antes de executar as macros.


Email Simples

Escolha entre a forma Early ou Late.

Código com Early Binding

Neste caso habilite a biblioteca do Outlook como explicado acima.

    Dim OutApp As Outlook.Application
    Dim OutMail As Outlook.MailItem

    Set OutApp = New Outlook.Application 'Objeto para Outlook
    Set OutMail = OutApp.CreateItem(olMailItem) 'Objeto para email dentro do Outlook

Código com Late Binding

    Dim OutApp As Object
    Dim OutMail As Object

    Set OutApp = CreateObject("Outlook.Application") 'Objeto para Outlook
    Set OutMail = OutApp.CreateItem(0) 'Objeto para email dentro do Outlook

Associamos valores a algumas propriedades do objeto OutMail para construção do email.

With OutMail
    .body = "Olá," & vbNewLine & "Este é um exemplo de email"
    .Subject = "Exemplo de assunto"
    .To = "EXEMPLO_DESTINATÁRIO@EMAIL.COM" 'Substitua o email desta linha
    .Display 'Método para mostrar o conteúdo
End With

O método .Display auxilia na construção do código, pois deixa visível o email para validação, apesar de não ser necessário para o funcionamento do processo.

Se tudo estiver conforme planejado basta apenas enviá-lo para o destinatário:

OutMail.Send 'Envia o email

Como bom costume, desassocie os objetos com a palavra-chave Nothing para limpá-los da memória.

  Set OutMail = Nothing
  Set OutApp = Nothing

Teremos então o seguinte processo:

Sub emailSimples()

    'Utilizando Late Binding
    Dim OutApp As Object
    Dim OutMail As Object

    Set OutApp = CreateObject("Outlook.Application") 'Objeto para Outlook
    Set OutMail = OutApp.CreateItem(0) 'Objeto para email dentro do Outlook

    With OutMail
        .body = "Olá," & vbNewLine & "Este é um exemplo de email"
        .Subject = "Exemplo de assunto"
        .To = "EXEMPLO_DESTINATÁRIO@EMAIL.COM" 'Substitua o email desta linha
        .Display 'Método para mostrar o conteúdo
    End With

    OutMail.Send 'Enviar email

    Set OutMail = Nothing
    Set OutApp = Nothing

End Sub

Email com Anexo e Imagem

Podemos construir uma macro para enviarmos um email com um relatório em anexo e a sua a prévia como imagem no corpo da mensagem.

Para este exercício teremos dois Workbooks: RelatorioVendas.xlsx (o relatório) e EnviandoEmail.xlsm (arquivo com a macro).

Prévia do RelatorioVendas.xlsx

Prévia de relatório Outlook

Dentro de um módulo em EnviandoEmail.xlsm podemos adicionar o seguinte código:

Sub enviarEmail()
    'Declaração de variáveis
    Dim i as integer
    Dim WBk As New Workbook
    Dim abaRelatorio As Worksheet
    Dim Rng As Range
    Dim Arquivo As String
    Dim OutApp As Object
    Dim OutMail As Object

    'Defina o caminho do relatório
    Arquivo = "C:\...\RelatorioVendas.xlsx" 'Substitua pelo caminho de onde está RelatorioVendas.xlsx

    Set WBk = Workbooks.Open(Filename:=Arquivo, ReadOnly:=False, Notify:=False)

    NomeRelatorio = Right(Arquivo, (Len(Arquivo) - InStrRev(Arquivo, "\")))
    Set WBk = Workbooks(NomeRelatorio)
    'O código acima equivale a: Set WBk = Workbooks("RelatorioVendas.xlsx")

    Set abaRelatorio = WBk.Worksheets(1) 'Aba do relatório de onde será gerada uma imagem

    'Range na qual se gerará a imagem
    Set Rng = abaRelatorio.Range("A1:E6")

    'Será criada uma aba chamada "Temp" para temporariamente estocar as mensagens no corpo do email
    Worksheets.Add After:=WBk.Sheets(WBk.Sheets.Count)
    ActiveSheet.Name = "Temp"

    'Texto do corpo do email
    Cells(1, 1) = "Prezados,"
    Cells(2, 1) = "Segue abaixo a prévia do relatório de resultados."

    'Utilizaremos a propriedade WordEditor para realizar colagens no corpo do email
    'É importante carregar o Outlook para que a propriedade WordEditor funcione adequadamente
    Shell ("C:\Program Files (x86)\Microsoft Office\root\Office16\OUTLOOK.EXE")
    Application.Wait (Now + TimeValue("0:00:05")) 'Aguardar Outlook abrir

    'Early Binding
    Set OutApp = CreateObject("Outlook.Application")
    Set OutMail = OutApp.CreateItem(olMailItem)

    With OutMail
        .to = "DESTINATARIO@EMAIL.COM" 'Insira o/os destinatários como String
        .CC = "COPIADO1@EMAIL.COM; COPIADO2@EMAIL.COM" 'Aqui ficam os copiados, também como String
        .Subject = "Relatório de resultados" 'Assunto do email
        .Display
    End With

    Set wEditor = OutApp.ActiveInspector.WordEditor
    'Utilização do WordEditor para colar elementos no corpo do email

    OutApp.ActiveWindow.Activate 'Ativar janela do email para colagem
    For i = 1 To 2
        Cells(i, 1).Select
        Cells(i, 1).Copy

        wEditor.Application.Selection.PasteSpecial xlPasteValues
    Next i

    abaRelatorio.Activate
    abaRelatorio.Range(Rng.Address).Select

    Selection.CopyPicture xlScreen, xlPicture 'Copiar como imagem
    wEditor.Application.Selection.Paste

    'Anexando o arquivo RelatorioVendas.xlsx no email
    With OutMail
        .Attachments.Add (Arquivo)
    End With

    Application.DisplayAlerts = False 'Desabilite o alerta de mensagens para macro não parar
    Worksheets("Temp").Delete 'Remoção da aba criada apenas para conter o texto que será enviado
    Application.DisplayAlerts = True

    'Execute até aqui, caso não queira enviar o email
    OutMail.Send 'Enviar o email

    'Desassociar as variáveis
    Set WBk = Nothing
    Set abaRelatorio = Nothing
    Set OutApp = Nothing
    Set OutMail = Nothing
    Set wEditor = Nothing

End Sub
Email VBA Outlook

Veja que neste exemplo foi utilizado a propriedade WordEditor para realizar tarefas relacionadas com colagens no corpo do email, diferentemente do exemplo simples anteriormente demonstrado.

WordEditor é uma forma de se colar imagens junto com texto.



Fixando o Aprendizado

Exercícios Sugeridos

Email Simples Email HTML


SuperExcelVBA.com é um site voltado ao aprendizado de VBA. Exemplos e explicações podem ter sido simplificados para maior e mais veloz compreensão. Estamos constantemente nos atualizando e corrigindo erros, porém não existe garantia sobre o conteúdo disponível no site. Todos os direitos reservados.

Excel ® é uma marca registrada da Microsoft Corporation.

© 2024 SuperExcelVBA | SOBRE

Protected by Copyscape