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.
5- EM CASO DE ERRO AO EXECUTAR O CÓDIGO:
Se você executar o código após isso será exibido o seguinte erro.
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.
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.
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
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
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.
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ç!!
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.
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
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?
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
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,
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
como faço para que no corpo do email apareça sempre a ultima linha preenchida da planilha( outra aba)
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
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”?
Neste caso tem de colocar a virgula, ficaria mais ou menos assim…
.To = “douglas@douglasgodoy.com.br, xyzw@gmail.com”
Abraços
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…
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
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)
Vitor, neste caso é possivel apenas a inregração entre aplicativos do Office.
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
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
Dener, obrigado pela postagem!
Não entendi sua dúvida, pode explicar melhor… Abraços
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?
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
ola muito bom seu codigo porem não estou conseguindo enviar o email ele ate anexa no outlook porem não dispara
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
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!!
Ótimo cara!!
Obrigado! Show!
Sensacional cara!!
Obrigado!
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
Pingback: Formulário de Cadastro com VBA - Aprenda Excel, VBA e DashboardsAprenda Excel, VBA e Dashboards