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