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. 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.

  2. 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ç!!

  3. 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

  4. 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

  5. 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

  6. 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”?

  7. 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

  8. 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)

  9. 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

  10. 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

  11. 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

  12. 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!!

  13. 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

  14. 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 *