Olá Amigos,

Venho mais esta postagem que tenho certeza que lhe ajudará muito em suas rotinas diárias.

Aprendendo como enviar Email com VBA usando o Excel

Muitas vezes estamos preparando um relatório e necessitamos enviar este por email, é muito trabalhoso ter te ficar procurando nos itens enviados o último relatório para ter de replicar novamente aos destinatários.

Para evitar isso, temos a rotina abaixo que permite que você configure o envio diretamente do arquivo em que se está trabalhando.

É possível configurar os campos de destinatários, com cópia, com cópia oculta, qual será o título do Email, o texto que irá no corpo do e-mail.



DICA: Aprendendo VBA – Como deixar um formulário ficar com tela cheia!?

Também é possível configurar se o email por VBA será enviado diretamente ou se o email VBA será exibido na sua tela.
Por padrão neste código colocamos para o e-mail VBA ser exibido através do propriedade .Display.

Sub Envio()

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

'Criação e chamada do Objeto Outlook
Set OutApp = CreateObject("Outlook.Application")
Set OutMail = OutApp.CreateItem(olMailItem)

Application.DisplayAlerts = False

With OutMail

.To = "douglas@douglasgodoy.com.br "
.CC = ""
.BCC = ""
.Subject = "Este é um e-mail de teste"
.HTMLBody = "Caros, este é um email de teste!"

'O trecho abaixo anexa a planilha ao e-mail
.Attachments.Add ActiveWorkbook.FullName

.Send 'Ou .Display para mostrar o email

End With

Application.DisplayAlerts = True

'Resetando a sessão
Set OutMail = Nothing
Set OutApp = Nothing

End Sub

 

Implementação:

1 – Abra um novo documento no Microsoft Excel.
2 – Aperte Alt + F11 para acessar o console de Macros.
3 – Clique em inserir novo módulo.
4 – Após inserir o novo módulo copie e cole o código abaixo.

novo modulo vba

5- EM CASO DE ERRO AO EXECUTAR O CÓDIGO:
Se você executar o código após isso será exibido o seguinte erro.

Erro email

Este erro ocorre pois na rotina que estamos criando fazemos referencia ao Objeto Outlook.Application, para corrigir este erro temos de seguir os passos a seguir, e referenciar o objeto em nosso projeto.

6 – ATIVE AS REFERÊNCIAS: Clique em Ferramentas ou Tools.
Referencias VBA

7 – Após isso será exibida a janela abaixo, onde você deverá procurar por “Microsoft Outlook 14.0 Object Library”
Lembrando que pode variar conforme a versão do seu Excel, 14.0 ou 15.0 ou assim por diante.

Referencias-EMAIL

Importante:

Após realizar a criação do módulo, ativar a referência a biblioteca do Outlook você poderá utilizar o código para enviar emails diretamente do excel com VBA.

Aguardo seus comentários!

Douglas Godoy






.

Sobre o Autor

Comentários bacanas...

  1. Ilmar

    Olá Douglas, tudo bem?
    Tenho o código abaixo que funciona perfeitamente, entretanto, apenas com o Outlook já aberto, caso contrário, o e-mail fica na caixa de saída e é enviado somente quando se abre o Outlook. No entanto, gostaria que o código, enviasse o e-mail diretamente, abrindo, enviando e fechando o Outlook, seria possível? Se puderes me ajudar, te agradeço muito.
    Obrigado

    Sub Saveaspdfand_Teste()

    Dim xSht As Worksheet
    Dim xFileDlg As FileDialog
    Dim xFolder As String
    Dim xYesorNo As Integer
    Dim xOutlookObj As Object
    Dim xEmailObj As Object
    Dim xUsedRng As Range
    Dim NomeAnexo As String

    Set xSht = ActiveSheet
    Set xFileDlg = Application.FileDialog(msoFileDialogFolderPicker)

    NomeAnexo = xSht.Name & “_” & Replace(Date, “/”, “.”) & “_” & Replace(Time, “:”, “”) & “.pdf”
    xFolder = “C:\Users\” & Environ(“username”) & “\Downloads\”
    xFolder = xFolder & NomeAnexo

    Set xUsedRng = xSht.UsedRange
    ‘Save as PDF file
    xSht.ExportAsFixedFormat Type:=xlTypePDF, Filename:=xFolder, Quality:=xlQualityStandard

    ‘Create Outlook email
    Set xOutlookObj = CreateObject(“Outlook.Application”)
    Set xEmailObj = xOutlookObj.CreateItem(0)
    With xEmailObj
    .Display
    .To = “”
    .CC = “”
    .Subject = NomeAnexo
    .Attachments.Add xFolder
    .Send
    End With
    End Sub

  2. ANA LIGIA MARTINS

    Bom dia.

    Consigo enviar com cópias para várias pessoas? O mesmo e-mail com CC para mais de uma pessoa? Não posso usar o CCO.

    1. Douglas Godoy Resposta do Autor

      Sim, é possível enviar o mesmo e-mail para várias pessoas utilizando o campo “CC” (Com Cópia).
      No VBA, basta adicionar os destinatários no campo CC separados por ponto e vírgula.

      Veja um exemplo de código:

      Sub EnviarEmail()
      Dim OutlookApp As Object
      Dim OutlookMail As Object

      Set OutlookApp = CreateObject("Outlook.Application")
      Set OutlookMail = OutlookApp.CreateItem(0)

      With OutlookMail
      .To = "destinatario@exemplo.com"
      .CC = "pessoa1@exemplo.com; pessoa2@exemplo.com"
      .Subject = "Assunto do E-mail"
      .Body = "Corpo do e-mail"
      .Send
      End With

      Isso envia o mesmo e-mail para os destinatários do campo “Para” e “CC”.
      Caso precise de mais ajuda, estou por aqui! 😊

  3. Flávio

    Olá, boa tarde!
    Gostei bastante das explicações, e se possível gostaria de uma ajuda.
    No meu Outlook tenho mais de uma conta, como faço para informar a macro de qual conta é para enviar os emails?
    Obrigado

    1. Douglas Godoy Resposta do Autor

      Olá Flávio, boa tarde!
      Fico feliz que as explicações tenham sido úteis! 😊

      Para enviar e-mails de uma conta específica no Outlook usando VBA, você pode usar o objeto Session para acessar as contas configuradas no Outlook. Veja um exemplo de como definir qual conta deve ser usada para enviar o e-mail:


      Sub EnviarEmailComContaEspecifica()
      Dim OutlookApp As Object
      Dim OutlookMail As Object
      Dim OutlookNamespace As Object
      Dim Conta As Object

      ' Cria instância do Outlook
      Set OutlookApp = CreateObject("Outlook.Application")
      Set OutlookNamespace = OutlookApp.GetNamespace("MAPI")

      ' Acessa a conta específica (substitua "nome_da_conta" pelo nome da conta)
      Set Conta = OutlookNamespace.Folders("nome_da_conta")

      ' Cria o e-mail e define a conta como remetente
      Set OutlookMail = OutlookApp.CreateItem(0)
      With OutlookMail
      .SentOnBehalfOfName = Conta.Name ' Define a conta a ser usada
      .To = "destinatario@exemplo.com"
      .Subject = "Assunto do E-mail"
      .Body = "Corpo do e-mail"
      .Send
      End With

      Set OutlookMail = Nothing
      Set OutlookApp = Nothing
      Set OutlookNamespace = Nothing
      End Sub

      Basta substituir “nome_da_conta” pelo nome da conta que deseja utilizar.
      Isso vai garantir que o e-mail seja enviado a partir da conta especificada.

      Se precisar de mais alguma coisa, estou à disposição! 😊

  4. Mateus

    oi professor td bom?? eu queria saber se tem como modificar esse codigo para fazer algo parecido com o mala direta, fazer com que o vba modifique e envie uma carta de cobrança personalizada para um determinado email com uma mensagem modoficada para cada um

    1. Douglas Godoy Resposta do Autor

      Olá Mateus, tem sim você deverá usar dois recursos importantes junto com este código, um deles é o uso de variáveis e o outro o loop, podendo ser o “For”, com isso vc varerá sua base de envios e com as variáveis fará os envios personalizados.

  5. andre svezzia

    Olá Douglas, tudo bem?

    Acabei de conhecer o seu trabalho e vi que é um grande profissional!

    Preciso de ajuda com alguns projetos que tenho para desenvolver.

    Por qual canal podemos falar?

    Abraç!!

  6. Rafael Vitoriano

    Douglas, boa tarde.

    Muito legal, estou aprendendo ainda, mas estou muito perdido.

    Se, ao invés de anexar a planilha eu quisesse mandá-la no corpo do email, o que eu deveria fazer?

    Obrigado.

    1. Douglas Godoy Resposta do Autor

      Rafael,
      Neste caso eu recomendo gerar uma imagem do range que deseja colocar no corpo do e-mail antes de criar este e-mail.

      Ai você cria o e-mail e anexa a imagem gerada.

      Abraços
      Douglas

  7. Claisa

    Oi Douglas!
    Utilizo seu código há algum tempo e é muito útil, mas agora meu outlook está exigindo informar o rótulo de confidencialidade para cada mensagem enviada e isso atrasa demais o processo.
    Temos como colocar no VBA a rotulação das mensagens?

    1. Douglas Godoy Resposta do Autor

      Olá Clarissa, Isso acontece sempre que o antivirus está desatualizado ou o computador não possui antivirus.

      Faça a atualização do mesmo ou instale para eliminar o problema.

      Abraços
      Douglas

  8. Bruno de Souza e Silva

    Boa noite Douglas.
    Utilizo seu metodo de enviar email a uns 2 anos, funciona muito bem, gero um Dash de minuto em minuto que em determinado horario mando email com a imagem do dash para gestão.
    Unica coisa que tem adicionado a mais, é a imagem que mando no email
    utilizando o metodo abaixo.
    If Len(Imagem) > 0 Then
    arrImagens = Split(Imagem, “;”)
    Imagem = ” ”
    For i = LBound(arrImagens) To UBound(arrImagens)
    If Dir(arrImagens(i)) “” Then
    .Attachments.Add arrImagens(i)
    Imagem = Imagem & _
    “”
    End If
    Next i
    End If

    Depois no corpo do email adiciono a imagem
    .HTMLBody = “” & TEXTO1 & _
    “” & Imagem & “”

    Minha duvida, seria se tem como enviar um email, onde no corpo do email, eu Colo uma tabela.
    Verifiquei que existe outro metodo de envio de email que abre o email dentro do Excel.
    range(range_selecao).Select
    Selection.Copy
    ActiveWorkbook.EnvelopeVisible = True
    With ActiveSheet.MailEnvelope
    .Introduction = subject
    .Item.To = email
    .Item.CC = CC
    .Item.subject = subject
    .Item.Send
    End With
    Neste consigo enviar um determinado Range em forma de tabela no email. Porem esse formado ocorre muitas inconsistencias, varios erros aleatorios, por fim nao seria viavel para deixar de forma automatizada.

    Reforço que queria utilizar o seu metodo, porem enviando uma tabela em determinado range.

    Desde Ja agradeço,

    1. Douglas Godoy Resposta do Autor

      Bruno, ja pensou em montar uma tabela com HTML usando um loop? Esta tabela possui sempre o mesmo tamanho ou é variável? Me passe estas informações que te ajudo a montar, abraços! Douglas

    1. Douglas Godoy Resposta do Autor

      Marco,

      No seu caso você deve primeiramente encontrar qual é a ultima linha, depois disso você deve atribuir o valor da ultima linha a uma variável.

      No link abaixo você consegue ver como encontrar a ultima linha.
      http://douglasgodoy.com.br/ultima-linha-vba/

      Você deve colocar o código abaixo para encontrar a linha.
      Linha = Sheets(“Plan1″).Cells(Rows.Count,”A”).End(xlUp).Offset(1,0).Row

      Ai você atribui as variaveis a linha, exemplo:

      Nome = Sheets(“Plan1”).Range(“A” & Linha).value
      Email = Sheets(“Plan1”).Range(“B” & Linha).value
      Fone = Sheets(“Plan1”).Range(“C” & Linha).value

      Desta forma você terá os dados da ultima linha atribuído as variváveis, com estes dados basta colocar as variáveis no corpo do email.

      Caso tenha dúvidas me sinalize.

      Abraços

  9. Carolina

    Douglas, boa tarde.

    Se eu quiser adicionar mais 1 destinatário eu coloco &? o meu não está funcionando com a vírgula.

    Por exemplo:
    .To = “douglas@douglasgodoy.com.br ” & “xyzw@gmail.com”?

  10. Carlos Goulart

    você teria como criar variaveis para uma lista de destinatarios (cada email um destinatario diferente) onde ele apontaria para uma range com os nomes.
    e também informar uma lista de anexos, (cada email um anexo diferente ‘.pdf ‘) onde ele apontaria para uma range informando o caminho dos pdfs.
    Muito obrigado…

    1. Douglas Godoy Resposta do Autor

      Sim, e o mais recomendado inclusive, porém neste caso o exemplo se resume mesmo em mostrar como é o código para enviar o e-mail… Obrigado pela contribuição! Abraços

  11. Vitor Zucchini

    Douglas, adorei o tutorial, mas como altero Outlook para outro software de email que tenho baixado? Como sei qual é o nome dele? Por exemplo, uso o IBM Notes. Onde acho qual vai ser o nome? (Ex. na pasta x diz que seria IBM.Application)

  12. Leonardo Pablo Lima Neris

    Ola douglas,

    Estou com uma macro parecida com a sua, no entanto gostaria de saber como faço para que o email seja enviado ja com a minha assinatura.

    Segue macro,

    Sub EnviarEmail()

    Dim OutProg As Object
    Dim OutMail As Object

    ‘Criando objetos do Microsoft Office Outlook (chamando recursos do Outlook)
    Set OutProg = CreateObject(“Outlook.Application”)
    Set OutMail = OutProg.CreateItem(0)

    With OutMail
    .To = Planilha1.Range(“B5”).Text
    .cc = “”
    .BCC = “”
    .Subject = Planilha1.Range(“B6”).Text
    .HTMLBody = “HTML Content” ‘Padrão Formatação HTML
    .Body = Planilha1.Range(“B7”).Text
    ‘.Attachments.Add (“”)
    .Send
    End With

    ‘Esvaziar da memória os objetos criados
    Set OutMail = Nothing
    Set OutApp = Nothing

    End Sub

  13. Dener Reis

    Boa tarde, gostaria de ajuda para utilizar um banco de dados que possa ser configurado sem alterar a macro, através desse banco de dados seja alterado o conteúdo do e-mail ao invés do conteúdo automatizado no VBA.

    Utilizado até o momento

    Sub Packing()

    Dim OutApp As Outlook.Application
    Dim OutMail As Outlook.MailItem
    ‘Criação e chamada do Objeto Outlook
    Set OutApp = CreateObject(“Outlook.Application”)
    Set OutMail = OutApp.CreateItem(olMailItem)
    Application.DisplayAlerts = False
    With OutMail
    .To = “”
    .CC = “”
    .BCC = “”
    .Subject = “Este é um e-mail de teste”
    .HTMLBody = “Caros, este é um email de teste!”
    ‘O trecho abaixo anexa a planilha ao e-mail
    .Attachments.Add ActiveWorkbook.FullName
    .Display ‘Ou .Display para mostrar o email
    End With
    Application.DisplayAlerts = True
    ‘Resetando a sessão
    Set OutMail = Nothing
    Set OutApp = Nothing
    End Sub

  14. Thiago Roncada Guedes

    Na parte do titulo do e-mail queria colocar uma informação que fosse puxada da própria planilha de trabalho, teria como?

    EX: Cliente – Cód ( puxado da planilha) – Cidade ( puxado da planilha).

    Teria como?

    1. Douglas Godoy Resposta do Autor

      Tem como sim…

      Primeiro você deve declarar o seu texto como variável String…

      Depois deve setar o caminho da variável, ou seja onde ela vai pegar os dados…
      No exemplo abaixo vou criar uma variavel chamada meu_titulo, e depois colocar ela na propriedade subjectdo email..

      Dim meu_tituloas String

      meu_titulo = Sheets("Plan1").Range("A1").value
      'No caso o "Plan1" e a célula "A1" devem ser substituidas pela célula que contém seu titulo.

      .Subject = meu_titulo

      Abraços

    1. Douglas Godoy Resposta do Autor

      Olá Luciana,

      No código tem uma propriedade que é definida como .Display…
      Ela ao invés de mandar o e-mail ela mostra, mude ela para .Send…

      Após isso você conseguirá enviar o e-mail diretamente.

      Abs

  15. Ricardo Nilton Borges

    Seu código é tudo que eu estava procurando!!
    eu não achei mas só esqueceu de falar que tem que retirar os textos para ele funcionar, ao menos aqui foi assim!

    Valeu!!

  16. Luis Felipe

    Douglas, parabens pela iniciativa, muito bacana mesmo, ainda não encontrei uma aplicação para mim, mas esse tipo de aplicativo pode automatizar muita coisa, como relatórios diários que devem ser enviados por email. Parabens

  17. Pingback: Formulário de Cadastro com VBA - Aprenda Excel, VBA e DashboardsAprenda Excel, VBA e Dashboards

Deixe um comentário

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *