Enviar Email diretamente do Excel (Macro)

Oi pessoal.
Vou mostrar uma macro para enviar suas planilhas por email diretamente pelo Excel. Então você poderia me dizer: “Ah!!! Mas o Excel já me permite fazer isso através do menu Arquivo > Enviar para…“. E eu lhe digo: “Com toda razão, meu caro!”. Mas diga-me, se por um acaso, você desejasse enviar apenas uma planilha da sua pasta de trabalho, o que você faria? Copiaria essa planilha em um novo arquivo, salvaria este novo arquivo, para só depois enviá-lo. Estou certo?! Então. Esse é só um dos casos que esta macro lhe ajudaria.
Essa rotina que irei descrever pode ser adaptada para diversas situações. Você, como programador, entenderá o seu funcionamento e saberá ajustá-la para a sua necessidade, de acordo com o seu projeto. Seja para enviar automaticamente ao concluir alguma etapa do seu programa, seja para enviar planilhas seletivamente, para enviar para destinatários já cadastrados em algum banco de dados, enfim, use sua criatividade e obtenha os mais fantásticos resultados.
Primeiro, crie um módulo global para escrever a rotina de envio de emails. Vamos chamá-la de EnviarEmail.

Sub EnviarEmail()
          ActiveWorkbook.SendMail "email_do_destinatário@email.com", "Título do Email"
End Sub

O código acima dispensa maiores explicações. Ele serve para enviar todo o arquivo (pasta de trabalho) por email.
A partir dele você pode começar a se divertir, adicionando modificações que atenderão ao seu projeto, em particular. Suponha que sua necessidade seja de enviar apenas uma planilha específica dentre as inúmeras planilhas que você possui no seu arquivo. Você pode fazer assim:

Sub EnviarEmailPlanilhaEspecifica()
Dim NovoArquivoXLS As Workbook
Dim sPlanAEnviar As String
Dim sExcluirAnexoTemporario As String
'Define a planilha que será enviada por email. Ex.: Plan1, Balancete, Lista De Nomes, etc
 sPlanAEnviar = "Plan2"
 'Cria um novo arquivo excel
 Set NovoArquivoXLS = Application.Workbooks.Add
 'Copia a planilha para o novo arquivo criado
 ThisWorkbook.Sheets(sPlanAEnviar).Copy Before:=NovoArquivoXLS.Sheets(1)
 'Salva o arquivo
 NovoArquivoXLS.SaveAs ThisWorkbook.Path & "\" & sPlanAEnviar & ".xls"
sExcluirAnexoTemporario = NovoArquivoXLS.FullName
 'Envia o email
 NovoArquivoXLS.SendMail "email_do_destinatário@email.com", "Título do Email"
 'Fecha o arquivo novo
 NovoArquivoXLS.Close
'Exclui o arquivo criado apenas para ser enviado.
Kill sExcluirAnexoTemporario
End Sub

Esta macro salvará em um novo arquivo excel somente a planilha informada e a enviará por email.
Espero que gostem.
Abraços.

153 comentários em “Enviar Email diretamente do Excel (Macro)”

  1. Show
    Como faço para criar uma fx que me busque os valores da seguite forma:
    Na Plan1 tenho vária colunas e em cada uma dela tem um código. e no final a descirção.
    Coluna A1 = 101 – C1 = 102 – F = 103 – H1 = Lápis
    Já na plan2 na coluna A1 vou digitar 102 e quero que venha a descrição.
    Sei que tem exixte o procv mas as formulas ficaria muito grante tem como fazer uma função
    que fizesse isso, eu tente mais não consegui.
    Obrigado

    Responder
    • Cara, pelo que entendi, você quer pesquisar tendo mais de uma coluna para pesquisar…
      PROCV é o mais indicado, existem outras maneiras também, cada uma depende da forma que deseja obter os resultados.
      Ou seja, cada caso é um caso.
      Não sei bem o que você quer. Mas acho que seria caso de PROCV mesmo. É uma solução mais geral.
      Abraço.

      Responder
    • Gladson, você pode fazer assim:
      Adicione uma variável do tipo string para armazenar o endereço do arquivo gerado dinamicamente:
      Dim sExcluirAnexoTemporario As String
      Em seguida, após a instrução para salvar este arquivo (NovoArquivoXLS.SaveAs …) atribua o path do arquivo à variável criada:
      sExcluirAnexoTemporario = NovoArquivoXLS.FullName
      Finalmente, após fechar o arquivo do anexo (NovoArquivoXLS.Close), escreva a instrução para excluí-lo:
      Kill sExcluirAnexoTemporario
      Vou atualizar o código do artigo com esta instrução, ok!
      Abraço.

      Responder
  2. Cara esse código ficou ótimo.
    Tenho duas dúvidas.
    A primeira e mais simples: Como faço para enviar a planilha para vários destinatários?
    Asegunda dúvida: tenho uma formatação condicional na planilha, seria possível a planilha ser enviada automaticamente sempre que essa condição fosse atendida. Por exemplo tenho uma planilha cujo uma célula possui uma formatação condicional que me mostra que uma data está vencida, assim eu queria que aparecendo a expressão vencida o email já fosse desparado. Tem como?

    Responder
    • Em termos de otimização não seria ideal.
      Mais vantajoso seria criar uma rotina que fosse acionada pelo usuário e fizesse uma varredura de todas as condições que fossem satisfatórias e então, disparasse o email.
      Abç

      Responder
  3. Deu tudo certo aqui, só falta uma coisa:
    Como faço para colocar um texto padrão no corpo de todos os emais que eu for enviar
    ex:
    Boa tarde,
    Seguem dados bla bla bla

    Responder
    • Gabriel,
      O método SendMail não fornece suporte a esta funcionalidade.
      Você conseguirá isto usando chamadas as dll’s do MAPI ou CDO. Assim que eu tiver uma oportunidade, escreverei algo bem interessante sobre este assunto, ok.
      Abrç

      Responder
    • Tereza, esta função é específica para enviar arquivos, ou seja, planilhas.
      Se você quiser enviar apenas um linha da planilha, deverá enviá-la através de uma planilha contendo apenas a linha que deseja.
      Veja. No exemplo do artigo, é criado um novo arquivo apenas com a planilha que deseja enviar. Numa adaptação para o seu caso, a clonagem desta planilha seria substituída apenas pela clonagem da linha desejada, entendeu?
      Exemplo: Altera a linha 13 do código por estas abaixo.
      Selection.Copy
      NovoArquivoXLS.Sheets(1).Range(“A1”).Paste
      Application.CutCopyMode = False

      Pronto. Sempre que você chamar a função para Enviar, ANTES disso, SELECIONE o intervalo de células que deseja clonar e enviar por email.
      Será feita uma cópia deste intervalo em um novo arquivo e enviado por email.
      Espero que ajude.
      Abraço.

      Responder
      • Olá amigo, demorei mas achei alguem competente para me salvar com essas macros !! ( rsss ) mas o problema que encontrei foi o seguinte: por motimo que deconheço, não está colando !!!! está dando erro !!! quando eu chamo para enviar o e-mail, aparece “erro de tempo na execução ‘438’ O objeto não aceita esta propriedade ou método.” ae eu vou em depurar, no depurador aparece a linha ” NovoArquivoXLS.Sheets(1).Range(“A1″).Paste ” em destaque, suponho que o erro esteja ae !!! favor me ajudar, sei q o post é antigo… mas se puder… Obrigado >>> segue o código inteiro que estou fazendo o teste >>>
        Sub Retângulo6_Clique()
        Dim NovoArquivoXLS As Workbook
        Dim sPlanAEnviar As String
        Dim sExcluirAnexoTemporario As String
        sPlanAEnviar = “Plan1”
        Set NovoArquivoXLS = Application.Workbooks.Add
        Selection.Copy
        NovoArquivoXLS.Sheets(1).Range(“A1”).Paste
        Application.CutCopyMode = False
        NovoArquivoXLS.SaveAs ThisWorkbook.Path & “” & sPlanAEnviar & “.xls”
        sExcluirAnexoTemporario = NovoArquivoXLS.FullName
        NovoArquivoXLS.SendMail “email_do_destinatário@email.com”, “Lançar OP”
        NovoArquivoXLS.Close
        Kill sExcluirAnexoTemporario
        End Sub

        Responder
        • Reescrevendo seu código:

          Dim NovoArquivoXLS As Workbook
          Dim sPlanAEnviar As String
          Dim sExcluirAnexoTemporario As String
          Dim wbVoltar As String
          sPlanAEnviar = “Plan1”
          wbVoltar = ThisWorkbook.Name
          Selection.Copy
          Set NovoArquivoXLS = Application.Workbooks.Add
          Windows(NovoArquivoXLS.Name).Activate
          ActiveSheet.Paste Destination:=Worksheets(1).Range(“A1”)
          Application.CutCopyMode = False
          Windows(wbVoltar).Activate
          NovoArquivoXLS.SaveAs ThisWorkbook.Path & “” & sPlanAEnviar & “.xls”
          sExcluirAnexoTemporario = NovoArquivoXLS.FullName
          NovoArquivoXLS.SendMail “email_do_destinatário@email.com”, “Lançar OP”
          NovoArquivoXLS.Close
          Kill sExcluirAnexoTemporario

          Abç

          Responder
  4. Ola tudo bom,
    Entao sou iniciante em programação, eu copie a macro e ok deu tudo certo. No entando gostaria de colacar um texto no escopo do e-mail do tipo: “boa tarde, segue a planilha em anexo”.
    Poderia me ajudar.

    Responder
  5. Olha só, eu tenho essa macro que copiei para envio de email, no entanto no escopo do email (message, aparece tambem um texto: “O documento anexado possui uma lista de circulação. Ao terminar de revisá-lo, escolha Próximo Destinatário da Lista de Circulação no menu Enviar para do menu Arquivo do Microsoft Office Excel para retornar o documento ao remetente”. Como faço para tirar essa mensagem
    Sub RouteActiveWorkbook()
    With ActiveWorkbook
    With .RoutingSlip
    .Delivery = xlAllAtOnce ‘codigo que permite enviar todos de uma só vez
    .Recipients = Array(“andref@xxxxx.com.br”, _
    “adailton@xxxxxx.com.br”, “joao@xxxxx.com.br”)
    .Subject = “teste”
    .Message = “TESTE DE E-MAIL AUTOMÁTICO”
    End With
    .Route
    End With
    End Sub

    Responder
  6. Olá Reinaldo, tudo bem?
    Gostei muito da primeira macro para envio de planilha excel anexa ao e-mail… no meu caso, gostaria que no campo (Assunto) do e-mail aparecesse a informação de duas celulas que consta na planilha o qual anexei, tem como?
    Obrigado

    Responder
  7. Olá,
    Primeiro de tudo,parabéns pelo site maravihoso..mais a macro não “rodou” no meu pc,eu baixei o anexo copiei as macros e editei o e-mail : [editado pelo moderador] e não dá certo

    Responder
  8. Tenho uma planilha que baixo do sistema que utilizo na empresa que trabalho, nela são geradas itens em pedido cujas ordens de compra estão em atraso e ainda não foram recebidas, toda semana preciso enviar perto de 50 emails para cada um dos fornecedores em atraso listando ordens de compra que precisam ser embarcadas, como deveria ser a macro para enviar a cada um deles as respectivas linhas em atraso com um text padrão tipo: “Ordens de compra em atraso”. Estou levando em consideração que para cada linha no excel estaria disponibilizando o email do meu contato.
    No aguardo.
    Obrigado!!!

    Responder
  9. Acresentando, seria algo como:
    CODIGO FORNECEDOR NOME FORNECEDOR ITEM DESCRIÇÃO UNIDADE DATA ENTREGA ORDEM DE COMPRA LINHA PEDIDO QUANTIDADE SOLICITADA QUANTIDADE RECEBIDA QUANTIDADE PENDENTE Email to
    111111 TESTING CORPORATION YXZ TESTE UN 01/10/2010 123456 1 100 60 40 myself@hotmail.com
    111111 TESTING CORPORATION YXZ TESTE UN 15/10/2010 123456 2 200 0 200 myself@hotmail.com
    222222 TRYOUT INCORPORATED TBD PROTOTYPE CT 20/10/2010 654321 1 1 0,1 0,9 me@hotmail.com
    222222 TRYOUT INCORPORATED TBD PROTOTYPE CT 22/10/2010 654321 2 2 0 2 me@hotmail.com
    222222 TRYOUT INCORPORATED TBD PROTOTYPE CT 24/10/2010 654321 3 3 0 3 me@hotmail.com

    Responder
  10. Ninja,
    Boa noite!
    Tua macro é show! Me diz se dá pra fazer o que quero?
    – Uma macro como essa tua que envia e-mail com planilha direto do Excel só que preciso de uma “macro mãe”, ou seja, nessa tua eu fixo uma planilha e pronto: Ela envia aquela planilha. Então se eu tiver uma macro que faça isso mas me permita definir antes do envio qual planilha quero enviar naquele momento seria a solução para meus problemas de envio de relatórios.
    Conto contigo!
    Franklin

    Responder
  11. Esta macro é exelente, e poderá me ajudar muito, o problema é seguinte: eu tenho uma planilha de despesas separada por gerencia e todo mes tenho que criar email para cada gerencia que não são poucas, e cada planilha talves possa me ajudar, tentei utiliza sua macro para fazer este trabalho por mim, porem se eu tento enviar para mais de dois emails diferente a macro não copia a terceira e da um erro de exucução ‘9’ na linha
    Sheets(sPlanAEnviar).Copy Before:=NovoArquivoXLS.Sheets(1) caso possa me ajuda eu agradecria muito.

    Responder
  12. Boa tarde
    eu fiz uma macro pra enviar uma pasta de trabalho, consegui fazer isso perfeitamente, mas essa pasta está indo como anexo, porém gostaria que fosse enviada no corpo do e-mail, tem como fazer??
    Desde já agradeço
    Segue a macro que fiz
    Sub Envio_Automático1()
    Dim strDate As String
    Dim MyArr As Variant
    MyArr = Sheets(“mail”).Range(“a1:a99”)
    Sheets(“Rel Cob+1-V”).Visible = True
    Sheets(“Rel Cob+1-V”).Select
    ActiveSheet.PivotTables(“Tabela dinâmica2”).PivotCache.Refresh
    Sheets(Array(“Rel Cob+1-V”)).Copy
    strDate = Format(Date, “dd-mm-yyyy”) & ” Hora ” & Format(Time, “hh-mm-ss”)
    ActiveWorkbook.SaveAs “Planilha de Cobrança ” _
    & ” Data ” & strDate & “.xls”
    ActiveWorkbook.SendMail MyArr, _
    “Planilha de Cobrança de ” & ” ” & strDate
    ActiveWorkbook.ChangeFileAccess xlReadOnly
    Kill ActiveWorkbook.FullName
    ActiveWorkbook.Close False
    Sheets(“Rel Cob+1-V”).Visible = False
    End Sub

    Responder
  13. Reinaldo,
    veja se pode me ajudar: Tenho uma planilha com as datas de vencimento de contratos de estagiários, e gostaria que o excel enviasse para o meu e-mail somente as linhas que trazem os nomes do estagiários e as datas de vencimento do mês subsequente ao atual, porém não como anexo e sim como texto e também sem que o excel fosse aberto.
    Tem como me ajudar?!
    Abs,

    Responder
  14. Olá!
    Sou portugues, e embora seja triste, mas é quase impossivel encontrar informacoes deste tipo em sites mesmo de portugal, o que torna complicado visto que voces ai usam termos ligeiramente diferentes dos nosso, como por exemplo: enquanto ai chamam de “planilha”, aqui chamamos de “folha”.
    Será que o facto de eu não conseguir que me seja possivel utilizar este método, se deva ao nome das folhas?
    Aparece-me este erro ‘runtime error ‘9’ – out of range,
    Nesta linha:
    Sheets(sSheetToSend).Copy Before:=NovoArquivoXLS.Sheets(1).
    já tentei alterar o nome desta forma
    Sheets(sSheetToSend).Copy Before:=NovoArquivoXLS.Sheets(“NotaEncomenda.XLSX”).Range(“A4:N111”)
    mas continua a dar o mesmo erro.
    É possivel saber o meu erro?

    Responder
    • Olá Nuno,
      Não há diferenças quanto ao termo planilha/folha pois o código VBA é escrito com os termos da própria linguagem. Os termos que estão digamos “Traduzidos” são apenas referências, não influencia a estrutura das funções internas, apenas ajuda o nosso entendimento na leitura.
      O acerto que você tentou fazer não ajudou muito.
      Como você postou somente a linha que deu erro não tem como dizer o que pode estar errado, pois percebi que fez alterações no código.
      Mas acredito que pode estar no termo “sSheetToSend”. Você deve definir o nome da folha previamente, assim:
      Exemplo
      sSheetToSend = “Folha1”
      Não sei se fez isso.
      De qualquer forma, se quiser postar todo o código, fique a vontade.

      Responder
  15. Olá Reinaldo tudo bem, muito bom o seu site sobre VBA.
    Tenho uma duvida referente a esse codigo de enviar e-mail tem como anexar um arquivo txt, onde tem outra macro que pega dados do excel e salva em txt e mandaria automaticamente o e-mail com o arquivo anexado.
    Obrigado

    Responder
  16. OLA…TENHO UM BANCO DE DADOS DE CLIENTES E TENHO QUE PASSAR EMAIL TODO DIA PARA ELES CADA CLIENTE TEM UM CODIGO ONDE EU DIGITO O MESMO E OS TODOS OS DADOS APARESEM, GOSTARIA DE SABER COMO FAÇO OU SE JA TEM UM PROGRAMA OU UM MACRO QUE FUNCIONE DA SEGUINTE MANEIRA: QUE QUANDO EU CLICAR NO LINQUE DE EMAIL (DE UM BANCO DE DADOS DE EMAIL) ELE ABRA O OUTLOOK COM O ARQUIVO OU PLANILHA JA ANEXADA E O EMAIL DO DESTINATARIO JA PREENCHIDO SEM QUE EU PRECISE FICAR DIGITANDO O EMAIL TODA HORA.

    Responder
  17. Bom dia !
    Amigo, estou precisando de uma ajuda! existe comando para o meu caso abaixo ?
    Tenho um arquivo com o nome (exe:) 123456.xls, preciso de uma macro que vai ler em uma determinada celula de outro arquivo este nome 123456.xls e terá que abrir este arquivo, depois salva-lo com outro nome, desde já obrigado.
    Ludwig

    Responder
  18. Amigo, eu tenho um problema que pode ser resolvido com o codigo acima, mas não sei direito se me serve.
    Eu tenho uma planilha que é basicamente toda feita em vba, tenho uma caixa de combinação onde se escolherá o email do destinatário e um botão ao lado de enviar. Eu consigo abrir uma nova mensagem no outlook do windows, com o destinatáio escolhido na caixa de opção, mas preciso mandar esta mesma planilha por anexo. È preciso salvar a planilha e fechar(em codigo vba) ou pode ser feito com a planilha aberta, como solucionar meu problema???
    grato
    Junior

    Responder
  19. Olá Reinaldo
    Como ficaria minha macro usando uma caixa de combinações para escolher o email a quem deseja enviar e anexando a propria planilha?
    Eu consegui até agora somente abrir uma nova msg no outlook com o endereço do destinatário selecionado na caixa de combinação.

    Responder
  20. Boa tarde,
    Estando o EXCELL e OUTLOOK abertos, tem alguma forma de definir uma data futura no EXCELL e quando da chegada da mesma seja enviado ao OUTLOOK uma mensagem pré-definida e disparada a alguns emails cadastrados?
    Se sim, como posso fazer isso?
    Atenção, desejo somente que seja enviado uma mensagem e não a planilha.
    Obrigado

    Responder
  21. 1 – Para enviar para vários destinatários, como devo separá-los na macro?
    2 – Ao invés de colocar o e-mail na macro, poderia formar um banco de dados, e, no lugar do e-mail, colocar a referência da célula onde se encontra este e-mail? Explicando: Tenho a necessidade de enviar a planilha para vários destinatários, que se alteram dependendo das informações. Desta forma, eu colocaria informações e elaboraria uma forma de me indicar para qual destinatário a planilha será enviada. A macro reconhece o local onde o e-mail está inserido ou apenas o e-mail escrito?

    Responder
  22. Amigo estava querendo uma ajuda, onde vejo que vc consegue desenvolver atributos entre outlook e excell, pois bem estava precisando de algo assim: Quando em uma determinada planilha TESTE.xls por exemplo, tenho varias linhas com conteudo e tive que incluir uma linha e fiz algumas alterações tenho como colocar em alguma celula o nome de uma determinada pessoa que está envolvida diretamente e enviar do excell clicando no nome da pessoa as alterações por email e para o email dela.
    Agradeço a ajuda…….

    Responder
  23. Bom dia trabalha em uma empresa e preciso utilizar a macro para encaminhar emails, ate ai tudo bem ja consegui fazer enviar os emails pela macro,
    a grande dificuldade minha é “preciso enviar junto no corpo do email a Logo ou Assinatura da empresa” como posso enviar essa logo sem ser como anexo, e sim no corpo do email.
    Att.:
    Grato desde ja

    Responder
  24. Boas.
    Tentei adaptar o código às minhas necessidades mas não consegui 🙁
    Eu tenho uma folha em excel com diversos dados.
    Esses dados têm que ser dividos em 2 para serem enviados..
    Exemplo: Coluna Encomenda e Mercado têm que ser enviados para teste@mail.com
    Coluna Cliente e Data enviado para teste2@mail.com.
    No código que retirei daqui, a folha que ele envia vai em branco apesar da folha original não estar.
    Se alguém me puder ajudar, agradecia.
    Cumprimentos.

    Responder
  25. Poderia por gentileza me ajudar ?
    Gostaria de saber se é possível, e em caso positivo, como fazer para receber um e-mail com todas as modificações realizadas em uma planilha bem como a data e hora das mesmas.
    Sou leigo em VBA, então precisaria do código completo =\
    Obrigado

    Responder
  26. Melhorando um pouco mais…
    Estando o EXCELL e OUTLOOK(fico na dúvida se é necessário mantê-lo aberto ou se somente o excell é suficiente) abertos, tem alguma forma de definir uma data futura no EXCELL e quando da chegada da mesma seja enviado pelo OUTLOOK uma mensagem pré-definida e disparada a alguns emails cadastrados?
    Na realidade, não desejo o envio da planilha e sim quando chegar uma determinada data definidada na planiha, seja enviado uma resposta automática aos emails já pré-definidos.
    Quanto ao macro, tem como definir horário de envio também.
    Como posso fazer isso. Se possível envie o macro, pois não entendo muito.
    Marotondo

    Responder
  27. Pessoal, boa tarde.
    Alguém pode me ajudar. Eu copiei este código para envio de e-mails através do excel.
    O Código funciona, e envia o e-mail. Entretanto, não anexa a planilha qual eu estou utilizando. Ou seja, manda o e-mail, sem nenhum anexo.
    Alguém sabe o que está falatando neste código?
    Sub Mail_Selection_Range_Outlook_Body()
    ‘ Don’t forget to copy the function RangetoHTML in the module.
    ‘ Working in Office 2000-2007
    Dim rng As Range
    Dim OutApp As Object
    Dim OutMail As Object
    Set rng = Nothing
    On Error Resume Next
    ‘Only the visible cells in the selection
    Set rng = Selection.SpecialCells(xlCellTypeVisible)
    ‘You can also use a range if you want
    ‘Set rng = Sheets(“YourSheet”).Range(“D4:D12”).SpecialCells(xlCellTypeVisible)
    On Error GoTo 0
    If rng Is Nothing Then
    MsgBox “The selection is not a range or the sheet is protected” & _
    vbNewLine & “please correct and try again.”, vbOKOnly
    Exit Sub
    End If
    With Application
    .EnableEvents = False
    .ScreenUpdating = False
    End With
    Set OutApp = CreateObject(“Outlook.Application”)
    OutApp.Session.Logon
    Set OutMail = OutApp.CreateItem(0)
    On Error Resume Next
    With OutMail
    .To = “xxxxxx.xxxx@xxxxx.com.br”
    .CC = “”
    .BCC = “”
    .Subject = “Relatório de Consumo”
    .Send ‘or use .Display
    End With
    On Error GoTo 0
    With Application
    .EnableEvents = True
    .ScreenUpdating = True
    End With
    Set OutMail = Nothing
    Set OutApp = Nothing
    End Sub

    Responder
  28. Muito Obrigada pelas dicas!!! Foram muito boas!Parabéns pela iniciativa !
    Fico no aguardo de mais novidades para colocar texto ao email.
    Estou ,somente, com uma dificuldade , alterar o ”titulo de texto ” para informação especifica da célula. Alguém, por gentileza, pode me ajudar?
    Obrigada!

    Responder
  29. Olá
    Gostaria de Códido em macro, somente pra enviar a planilha única, sendo que preciso que tenha mais de um endereço de e-mails, e se possivel o assunto ser igual ao nome do arquivo, pois existe um arquivo base e com uma macro que irá salvar conforme dados na celula por exemplo na A25.
    Obrigado

    Responder
  30. Sub EnviarEmailPlanilhaEspecifica()
    Dim NovoArquivoXLS As Workbook
    Dim sPlanAEnviar As String
    Dim sExcluirAnexoTemporario As String
    ‘Define a planilha que será enviada por email. Ex.: Plan1, Balancete, Lista De Nomes, etc
    sPlanAEnviar = “Imprimir”
    ‘Cria um novo arquivo excel
    Set NovoArquivoXLS = Application.Workbooks.Add
    ‘Copia a planilha para o novo arquivo criado
    Sheets(sPlanAEnviar).Copy Before:=NovoArquivoXLS.Sheets(1)
    Nessa Última Linha Apresenta o Erro:
    “Erro em Tempo de Execução 9 – Subiscrito Fora do intervalo”
    o Nome da Planilha que pretendo enviar é esse “Imprimir”.
    O que devo Fazer?
    Valeww

    Responder
  31. Ola…eu não consegui fazer a macro de enviar por e-mail diretamente do excel como o exemplo no começo da página. O que estou fazendo errado?: eu peguei os códigos exatamente como estão e criei a macro dentro da minha planilha que gera o erro na linha: Sheets(sPlanAEnviar).Copy Before:=boletimXLS.Sheets(1). Onde que devo alterar para que funcione na minha planilha.
    Grato

    Responder
    • Sidnie,
      Não sei o que você exatamente modificou no código.
      Onde você diz “boletimXLS” – no exemplo está NovoArquivoXLS – é um objeto que faz referência a um novo documento excel criado pela macro.
      Você não pode deixar de instanciá-lo conforme foi feito no exemplo:
      Set boletimXLS = Application.Workbooks.Add
      E outro caso pode ser a informação da planilha que você deseja enviar:
      No exemploestá na linha sPlanAEnviar = “Plan2”
      Substitua “Plan2” pelo nome da planilha que deseja enviar.
      Espero que ajude.
      —————————————-
      Não deixe de nos seguir no Twitter – twitter.com/exceldoseujeito

      Responder
  32. Olá amigo.
    Estou precisando de algo parecido.
    Preciso colocar um hiperlink em uma planilha para que a pessoa clicando nele, abra um email novo, com um texto padrao neste corpo de email.
    Como posso fazer isso?
    Abraços,

    Responder
  33. Tudo certo. Porém, os dados não estão sendo copiado para a planilha temporária. Quando vou abrir a planilha que chegou no e-mail, diz que está em formato diferente, e a planilha aparece em branco. O que pode ser?

    Responder
    • Se você está trabalhando com Excel 2007 ou 2010, você pode salvar assim:
      —— Para XLSX
      NovoArquivoXLS.SaveAs ThisWorkbook.Path & “\” & sPlanAEnviar, xlWorkbookDefault
      —— Para XLSM (Com Macro)
      NovoArquivoXLS.SaveAs ThisWorkbook.Path & “\” & sPlanAEnviar, xlOpenXMLWorkbookMacroEnabled
      Para versões 2003:
      NovoArquivoXLS.SaveAs ThisWorkbook.Path & “\” & sPlanAEnviar, xlWorkbookNormal
      Dessa maneira você não precisa definir a extensão e o Excel salva no formato correto.
      Não sei se isto, mas, boa sorte aí, espero que ajude.
      Abçs.
      Está seguindo o @exceldoseujeito ? Então, o que está esperando?!!!

      Responder
  34. Tentei utilizar essa macro para enviar um arquivo excel após o preenchimento pelo Lotus Notes… ela roda corretamente, mas o arquivo que anexa fica em branco…
    Será que estou fazendo alguma bobagem? vc tem como verificar para mim?
    ———————-
    Sub EnviarEmailPlanilhaEspecifica()
    Dim NovoArquivoXLS As Workbook
    Dim sPlanAEnviar As String
    Dim sExcluirAnexoTemporario As String
    ‘Define a planilha que será enviada por email. Ex.: Plan1, Balancete, Lista De Nomes, etc
    sPlanAEnviar = “Plan1”
    ‘Cria um novo arquivo excel
    Set NovoArquivoXLS = Application.Workbooks.Add
    ‘Copia a planilha para o novo arquivo criado
    Sheets(sPlanAEnviar).Copy Before:=NovoArquivoXLS.Sheets(1)
    ‘Salva o arquivo
    NovoArquivoXLS.SaveAs ThisWorkbook.Path & “” & sPlanAEnviar & “.xlsx”
    sExcluirAnexoTemporario = NovoArquivoXLS.FullName
    ‘Envia o email
    NovoArquivoXLS.SendMail “xxx@xxx.com”, “Pesquisa Satisfação xxx 1S2011”
    ‘Fecha o arquivo novo
    NovoArquivoXLS.Close
    ‘Exclui o arquivo criado apenas para ser enviado.
    Kill sExcluirAnexoTemporario
    End Sub

    Responder
    • Você está utilizando este código no projeto do Excel?
      Este código foi escrito para rodar a partir da pasta de trabalho que você está enviando. Não sei bem como funcionaria esta integração com o Lotus Notes.
      Mas acredito que se você referenciar a pasta de trabalho que está querendo enviar, funcione bem.
      Neste código a planilha enviada chama-se “Plan1”.
      Certifique-se que sua planilha tenha esso nome. Se não, altere no código pelo nome da planilha que você quer enviar.
      E, se não estiver escrevendo o código no Excel, faça a referência completa do arquivo também. Nome do arquivo Excel + Nome da Planilha.
      Não sei se fui claro. Passe mais informações.
      Abçs.
      Está seguindo o @exceldoseujeito ? Então, o que está esperando?!!!

      Responder
      • A planilha é Plan1 mesmo… criei um botão e associei a macro… era para salvar e automaticamente anexar esse arquivo salvo num correio… e funciona bem… o problema é que o arquivo que anexa fica totalmente em branco… cria uma nova Plan1(2) no arquivo novo…

        Responder
        • Realmente tem um bug no código.
          Como ele cria uma nova pasta de trabalho, ele se auto referencia na Plan1….
          Correção:
          Onde está:
          Sheets(sPlanAEnviar).Copy Before:=NovoArquivoXLS.Sheets(1)
          Mude para:
          ThisWorkbook.Sheets(sPlanAEnviar).Copy Before:=NovoArquivoXLS.Sheets(1)
          Vou atualizar no site também…
          Abç

          Responder
  35. Olá Reinaldo, tudo bem?
    Primeiramente muito obrigado pela aula.
    Tenho algumas dúvidas que surgiram e a necessidade de soluções.
    1° Quero escolher a pasta em que este arquivo será salvo e o nome do arquivo.
    Ex:
    Pasta C:\Orçamentos
    Proposta 001-11
    Proposta 002-11
    Neste caso, se possível abrir uma caixa de diálogo para digitar o nome do arquivo ou até mesmo abrir a caixa de “salvar como” antes de enviar por e-mail.
    3° Enviar para o e-mail o anexo em pdf do arquivo salvo. Apenas abrir a caixa de e-mail, para então eu escolher o destinatário e digitar o corpo do e-mail.
    Por enquanto são estas. Muito obrigado desde já.
    Arthur Leite

    Responder
  36. Boa tarde,
    Seria possível dispara o envio de email à partir do resultado de uma célula em específico? Por exemplo, quando a célula A2 fosse maior que 1000, um email é automaticamente enviado.

    Responder
    • Alex, é possível, contudo você precisa definir bem o que você quer e o que ficaria funcional para o seu projeto.
      Ou seja, o que eu quero dizer com automaticamente? Seria sempre que o valor fosse alterado? (péssima idéia)
      Seria quando a planilha fosse aberta e feita uma verificação no conteúdo da A2? (melhor)
      Ou seria quando eu clicasse num botão e fosse executada essa verificação? (ideal)
      Por quê? Dessa maneira, você teria controle de quando a macro seria executada e poderia recorrê-la a qualquer momento.
      Leia este artigo e adapte a sua necessidade. Algo do tipo:
      If Range(“A2”).value > 1000 then
      Call EnviarEmail()
      End if
      Abç

      Responder
  37. Reinaldo,
    gostei muito desta dica. mas minha duvida e a seguinte. é Possivel ter uma nova aba dentro desta planilha onde a propria macro possa puxar os emails necessarios que seja enviado dentro desta parte da macro.
    ‘Envia o email
    NovoArquivoXLS.SendMail “email_do_destinatário@email.com”, “Título do Email”

    Responder
  38. Engraçado
    Testei aqui mas não deu. essa macro serve pra enviar a planilha para um email do yahoo? No caso o meu mesmo. Fiz a titulo de teste e ñ consegui…
    e puder me ajudar

    Responder
  39. Bom dia!
    Tenho um arquivo XLSX com várias planilhas.
    Em cada planilha tem uma tabela que precisa ser enviada para um destinatário de email.
    Existe alguma macro que Imprima o arquivo em PDF (impressora virtual – DoPDF) e gere um email (anexando corpo de email modelo)?

    Responder
  40. Cara eu queria colocar uma macro que enviasse o e-mail automaticamente, porém, gostaria que ela gerasse uma InputBox para colocar os destinatários (mais de um), eu consegui fazer com 1 destinátario.
    E para ela copiar algumas células e colar no corpo do e-mail.

    Responder
  41. Prezado,
    Muito bom seu artigo.
    Ver se você consegue em ajudar.
    Eu precisava de uma macro que enviasse planilhas diferentes para e-mails diferentes.
    Como que eu faço?
    Fico no aguado.
    Atenciosamente,
    Tarcizio T.

    Responder
  42. Bem tenho algumas necessidades especívicas, minha planilha é um controle de disponibilização de arquivos em um FileServer, esses tem que ser armazenados por 30 dias e depois tenho que disparar um email com um aviso padrão.
    Na planilha existe uma coluna com data de disponibilização e outra com data de expiração, preciso análizar essa condição para ver se vai ou não enviar o email.
    Caso seja para enviar, existe uma coluna com a sigla do usuário que define seu email XXX@domínio.com.br e tb o link do arquivo \\servidor\dados$\XXX, logo preciso que a sigla, apontada como XXX, seja uma variável string.
    Estou apanhando por causa da análise condicional e por causa da variável que não consigo implementar com sucesso.
    Teria como me dar uma ajuda?

    Responder
  43. Reply,
    Boa tarde,
    Preciso de ajuda para enviar email através do excel, conforme exemplo abaixo:
    Na planilha em questão consta a relação de email que precisa receber tais informações a partir de uma data com vencimento, como devo proceder?
    Obrigado,
    Tony Vitoria

    Responder
    • Oi Tony,
      O Excel não agenda envio de emails. O que você pode fazer é configurar uma verificação dessa tua lista ao abrir o arquivo em questão.
      Se a data indicada correspondesse a data atual, o email seria disparado.
      Em breve estarei postando outro artigo sobre envio de emails diretamente do Excel abordando mais funcionalidades.
      Fique ligado pelo twitter ou pelo email.

      Responder
  44. Olá
    Gostaria de criar uma planilha que avaliace os vencimentos de determinados produtos e envia-se automaticamente um e-mail para avisar sobre tal vencimento.
    Gostaria de saber se isso é possivel.
    Se alguém puder ajudar ficare grato

    Responder
  45. bom dia,sei qe o topico é antigo mas me interessou, utilizei seu codigo de enviar email diretamente do excel postado em 8/05/10, e me serviu muito, porem eu gostaria de uma ajuda sua em alem de mandar o anexo, este codigo me salve uma copia renomeado com a data do dia, em uma pasta no desktop.
    obrigado

    Responder
    • Michel,
      Você pode obter este resultado alterando a linha 16 do código para:
      NovoArquivoXLS.SaveAs “C:\PASTA_ONDE_QUERO_SALVAR\” & sPlanAEnviar & Format(Date, “DD-MM-YYYY”) & “.xls”
      E excluindo a linha 26:
      Kill sExcluirAnexoTemporario
      Um abraço

      Responder
  46. Boa tarde.
    Genial o seu código. Porém eu preciso da sua ajuda para modifica-lo. No Excel 2010 há uma opção de SALVE E ENVIAR>Enviar com link, nessa opção o Excel envia o o caminho onde esta salvo o arquivo numa pasta compartilhada.
    Criei uma macro que executa vários processos e o ultimo queria que fosse esse de enviar como link, mas a macro não grava essa ação.
    Tem como ajudar.
    Desde já obrigado.

    Responder
  47. Boa tarde,
    obrigado pela dicas mencionadas acima.
    No excel 2010 existe uma função para salvar e enviar por e-mail como link, nesta função ele manda o caminho de uma pasta compartilhada onde esta salva a pasta de trabalho do excel. Basta clicar que abre o arquivo.
    Teria como modificar o código para que mande apenas o link como nessa função???
    Desde já obrigado.

    Responder
  48. Muito bom!
    Pena que não está funcionando aqui no meu Excel2010.
    Sempre dá erro quando vou rodar a macro.
    “Erro em tempo de execução ‘1004’.
    Erro de definição de aplicativo ou de definição de objeto.”
    Abs

    Responder
    • Rafael,
      Para enviar para mais de um email use uma matriz de emails. Veja:
      ThisWorkbook.SendMail Array(“email01@email.com.br”, “email02@email.com”), “Título do Email”
      Abraços,
      Reinaldo Coral
      Já assinou nosso feed? Ou nos segue no twitter? Dá uma forcinha pra nós!!! E, de quebra, fique sempre atualizado com as novidades do site.
      Assine nossa newsletter gratuitamente e receba todas as nossas novidades. Clique aqui.

      Responder
  49. Ei, eu tenho uma planilha com datas de vencimentos de projetos e gostaria que fosse enviado um e-mail automaticamente assim que chegasse à data do vencimento. É possível fazer isso? Sabe me dizer como?
    Grato desde já,
    Ueritom

    Responder
    • Você pode definir uma rotina para verificar as datas e compará-las a data atual no evento Ao Abrir O Arquivo do Excel: Workbook_Open. Ou seja, toda vez que o arquivo for aberto será executada uma verificação.
      Veja um exemplo hipotético. Supondo que a data esteja na coluna A e que na coluna B escrevamos se já foi enviado um email para aquela linha.
      Private Sub Workbook_Open()
      For i = iLinhaInicial To iLinhaFinal
      If Range("A" & i).Value >= Date And Range("B" & i).Value <> "Email Enviado" Then
      Range("B" & i).Value = "Email Enviado"
      Call EnviarEmail
      End If
      Next i
      End Sub

      Um abraço

      Responder
  50. Bom dia Reinaldo.
    Aprovei 100% a VBA para encaminhar por e-mail o arquivo e já testei aqui e ficou show de bola, mas mesmo assim vou te chatear.
    Tenho uma planilha que utilizamos para comunicação interna de nossa engenharia, e nem sempre é encaminhada para os mesmos destinatários. Minha pergunta é, na linha de comando, existe uma forma de fazer com que os nomes que eu selecionar na planilha tenham seus e-mails ativados na VBa?
    Gostaria de te encaminhar a planilha para que analisasse, será que isso é possível?
    Obrigado e logo que chegar em casa serei o mais novo seguir do seu blog.
    Abraços.

    Responder
  51. Estou fazendo a macro que envia uma das planilhas do arquivo por email porem esta dando erro na seguinte parte que assinalei com ***:
    Sub enviaemailplanilhaespecifica()
    Dim NovoArquivoXLS As Workbook
    Dim sPlanAEnviar As String
    Dim sExcluirAnexoTemporario As String
    Dim NOVO As Worksheet
    sPlanAEnviar = “ACC”
    ***ThisWorkbook.Sheets(sPlanAEnviar).Copy Before:=NovoArquivoXLS.Sheets(1)
    NovoArquivoXLS.SaveAs ThisWorkbook.Path & “\” & sPlanAEnviar & “.xls”
    sExcluirAnexoTemporario = NovoArquivoXLS.FullName
    NovoArquivoXLS.SendMail “alexandra.pires@itau-unibanco.com.br”, “Status Carga e Validação”
    NovoArquivoXLS.Close
    Kill sExcluirAnexoTemporario
    End Sub
    O que fazer para consertar???? Alguem me ajuda????? Meu office é o 2010…

    Responder
    • Oi Alexandra,
      A planilha “ACC” precisa existir na sua pasta de trabalho. Foi o único possível problema que encontrei no seu código.
      Ou seja, como no exemplo do artigo está a “Plan2” e ela existe na pasta, talvez você tenha esquecido de nomear sua planilha (aba) com o nome “ACC” igual ao descrito no seu código.
      Espero que resolva.
      Abç

      Responder
    • Paulo,
      Para definir a planilha (folha) que deseja enviar pela macro, você pode definí-la na linha do código:
      sPlanAEnviar = “Plan2” <--- Defina o nome da planilha aqui Se quiser enviar todo o arquivo excel, ou seja, a Pasta de Trabalho (livro), você pode usar o código: ActiveWorkbook.SendMail "email_do_destinatário@email.com", "Título do Email" Mas, pensando melhor, acho que você possa estar querendo enviar planilhas de outros arquivos externos, que não pertencam ao arquivo excel onde esteja a macro. Neste caso, você deverá mandar a macro abrir este arquivo externo. Faça assim: Declare uma variavel arqEnv: Dim arqEnv as WorkBook
      Antes da linha 10, mande abrir o arquivo que deseja enviar:
      Set arqEnv = Application.Workbooks.Open("C:\Pasta_Onde_Esta_O_Arquivo_Excel\Nome_Do_Arquivo.xls")
      No fim, após a linha 23, mande fechar o arquivo:
      arqEnv.Close
      Espero que tenha esclarecido sua dúvida.
      Abç

      Responder
  52. Prezados amigos do Excel do Seu Jeito:
    Sou um iniciante na área de programação, mas graças à internet e a pessoas solidárias como vocês do Excel do Seu Jeito o pouco que estou tentando fazer estou conseguindo.
    Todavia, no momento estou com um problema.
    Para realizar a automação de um documento do MSExcel 2007 de forma a enviá-lo imediatamente por e-mail inseri a macro:
    Sub EnviarEmail()
    ActiveWorkbook.SendMail “nome@gmail.com”, “Filmes para assistir na semana de / /2012 à / /2012”
    End Sub
    No MSExcel deu tudo certo, mas quando utilizo o Libre/OpenOffice Calc, na hora que clico para enviar o e-mail, o programa encaminha para o editor de macros do Calc e é exibida a seguinte mensagem VBA:
    _________________________________________
    LibreOffice 3.5
    …………………………………..
    (-) Erro em tempo de execução do BASIC.
    ‘423’
    SendMail
    [OK]
    __________________________________________
    Gostaria de saber se vocês poderiam me ajudar a solucionar este problema, pois não consegui encontrar a solução na internet.
    Obrigado!
    Manoel Marbrit
    P.S.: Tenho MS Excel no meu notebook, mas no meu trabalho, por uma questão de corte de gastos, eles usam apenas o Libre/OpenOffice.

    Responder
    • Bom dia Manoel.
      Primeiramente, obrigado pelo comentário.
      Infelizmente não possuo nenhum conhecimento do OpenOffice. Lamento.
      Mas, fique a vontade para encaminhar qualquer dúvida em relação ao Excel, ok.
      Abração.

      Responder
  53. Bom dia!!!
    Gostei muito do seu material, parabéns!!!
    Estou fazendo a macro para enviar por e-mail e funcionou perfeitamente, gostaria de saber como faço para ele perguntar o e-mail antes de enviar, ou seja, abrir uma tela para colocar o e-mail e depois enviar.
    Um grande abraço,

    Responder
    • Boa tarde, Cláudio.
      Lá no código onde você informa o email do destinatário:
      NovoArquivoXLS.SendMail “email_do_destinatário@email.com”, “Título do Email”
      Substitua por um InputBox, assim:
      NovoArquivoXLS.SendMail InputBox(“Informe o email:”, “Destinatário do Email”), “Título do Email”
      Teste e veja o que acontece!
      É claro que é apenas um exemplo, o ideal seria você colocar o resultado digitado numa variável, testar se é um email válido, e por aí vai…
      Mas, a idéia é esta. Boa sorte aí.
      Você já assinou nossa newsletter? É grátis! Assine aqui e não esqueça de confirmar a inscrição no email de confirmação que receberá em seguida ao se cadastrar, senão não ficará ativo para receber as novidades do site, ok.
      Se quiser seguir no twitter também, eu agradeço, pois, ajuda a divulgar o site.
      Abç

      Responder
      • Olá amigo,
        Em primeiro lugar meus parabéns, esse código me ajudou muito.
        Para ficar perfeito preciso de sua ajuda no seguinte, vamos ver se é possível:
        Tenho um arquivo de várias linhas onde cada uma delas é um contrato e cada linha verifica se esses contratos estão com o Status de “Vencido” ou “Atenção”. É possivel que a macro verifique as linhas que estão com esses dois status acima copiar somente essas linhas e enviar por e-mail?
        Se conseguir isso me ajduará muito.
        Grande abraço

        Responder
      • Olá amigo,
        Em primeiro lugar meus parabéns, esse código me ajudou muito.
        Para ficar perfeito preciso de sua ajuda no seguinte, vamos ver se é possível:
        Tenho um arquivo de várias linhas onde cada uma delas é um contrato e cada linha verifica se esses contratos estão com o Status de “Vencido” ou “Atenção”. É possivel que a macro verifique as linhas que estão com esses dois status acima copiar somente essas linhas e enviar por e-mail? També é possivel que a macro faça isso periodicamente de forma automática?
        Se conseguir isso me ajudará muito.
        Grande abraço

        Responder
  54. Achei o material excelente, ótimo, no office 2010 funciona muito bem, só que no office 2003 da erro, voc~e pode me ajudar?
    ‘Envia o email
    NovoArquivoXLS.SendMail “email_do_destinatário@email.com”, “Título do Email” dá esse erro de tempo de execução 1004, fala que woork book falhou.
    grato,
    e parabéns pelo site é ótimo.
    Marco Antonio

    Responder
    • Marco,
      A macro foi desenvolvida para funcionar perfeitamente no Excel 2003.
      Caso não tenha feito o download do arquivo de exemplo, faça e teste novamente.
      Lembrando que, é necessário ter o Outlook, Live Mail, etc, configurados, para que o email seja enviado.
      Em breve estarei postando outro artigo sobre envio de emails diretamente do Excel abordando mais funcionalidades.
      Fique ligado pelo twitter ou pelo email.
      Um abraço

      Responder
  55. Prezado Amigos, excelente trabalho!!!
    Estou montando uma planilha de envio para email de vendedores, no entanto gostaria de colocar uma condicional para filtrar o envio, exemplo vendedor cod 86… enviar para esse vendedor, caso for outro codigo 130 enviar para esse vendedor.o relatorio seria enviado em .PDF, estou usando o excel 2010. existe essa possibilidade?
    Se poder me ajudar ficaria bastante grato.

    Responder
  56. Olá Reinaldo, primeiro, parabéns pelo site, show de bola.
    Ainda estou meio noob em macros.
    Gostaria de enviar minha aba ativa por email, porém esta aba em PDF, e esse arquivo com um nome que está em um célula específica. Dá?
    abs!

    Responder
    • Olá Thiago.
      Tem uma maneira de fazer sim… Só que não utilizando este procedimento de envio Sendmail.
      Em breve vou escrever um artigo ensinando outra maneira, mais completa, de trabalhar com emails no Excel.
      Acompanhe-nos pelo twitter e por email para ficar atualizados das novas publicações aqui do site, ok.
      Abraço

      Responder
  57. ola, bom dia, muito bom o material, sou totalmente novato no assunto, e esta me ajudando muito.
    qdo coloquei a macro pra rodar ela da o seguinte erro: “erro em tempo de execução ‘1004’: não é possivel salvar esta pasta de trabalho com o mesmo nome de outra pasta de trabalho ou suplemento abertos. escolha um nome diferente ou feche o documento aberto antes de salva-lo”
    Na macro fiz as modificações conforme abaixo…
    Sub EnviarEmail()
    Dim PEDIDOSXLS As Workbook
    Dim sPlanAEnviar As String
    Dim sExcluirAnexoTemporario As String
    ‘Define a planilha que será enviada por email. Ex.: Plan1, Balancete, Lista De Nomes, etc
    sPlanAEnviar = “PEDIDOS”
    ‘Cria um novo arquivo excel
    Set FRIALTOTEMP2XLS = Application.Workbooks.Add
    ‘Copia a planilha para o novo arquivo criado
    ThisWorkbook.Sheets(sPlanAEnviar).Copy Before:=FRIALTOTEMP2XLS.Sheets(1)
    ‘Salva o arquivo
    FRIALTOTEMP2XLS.SaveAs ThisWorkbook.Path & “\” & sPlanAEnviar & “.xls”
    sExcluirAnexoTemporario = FRIALTOTEMP2XLS.FullName
    ‘Envia o email
    FRIALTOTEMP2XLS.SendMail “nome@hotmail.com”, “PEDIDO”
    ‘Fecha o arquivo novo
    FRIALTOTEMP2XLS.Close
    ‘Exclui o arquivo criado apenas para ser enviado.
    Kill sExcluirAnexoTemporario
    End Sub
    Modifiquei o nome da planilha a ser criada, estou certo ? onde estou errando?
    se puderme ajudar fico grato. forte abraço.

    Responder
    • Cláudio,
      Esta macro utiliza as suas configurações do seu programa de email padrão, tipo Outlook, Live Mail…
      Se não tiver configurado, não vai enviar.
      Em breve, vou escrever um artigo ensinando a enviar email pelo Excel sem utilizar as configurações do Outlook.
      Abç

      Responder
  58. Olá,
    Bem, tenho uma planilha com um código que manda e-mail com anexo, etc. Está quase perfeito.
    A unica coisa que falta é colocar mensagem no corpo do e-mail.
    Será que podem me ajudar?
    Segue link para baixar a planilha [editado pelo moderador]

    Responder
  59. Reinaldo, Parabens pelo trabalho, estou começando a me arriscar mais nas macros e vejo que um knowhow como o seu é diferencial.
    Mestre, estou precisando enviar um email, a partir de uma planilha no excel que possui imagens, ou melhor, possui Gráficos, totas as informações precisam estar no corpo do email. Hoje eu tenho que copiar a planilha e colar como imagem e em seguida colar no email, tudo isso manualmente.Tentei de diversas formas automatizar, mas só consigo copiar as celulas, os gráficos não vão =/….Até agora não encontrei alguém que pudesse me ajudar, mas seu material me deu esperanças !!
    Obrigado e abraços !

    Responder
    • Valeu pelo feedback, Gustavo.
      Realmente só descobrimos novas coisas se buscarmos por elas. Muito bom que você se interesse pelo tema e queira aprender mais.
      Dá pra fazer muita coisa no Excel.
      Não sei se já leu este outro artigo aqui, mas vale a leitura, pois complementa este artigo aqui.
      Uma idéia para o seu relato é salvar suas planilhas em PDF e anexá-las ao email. Tudo automaticamente, claro. Se estiver usando o Excel 2010, melhor.
      Você pode incluir na macro de envio, o salvamento em .pdf. Assim:
      ThisWorkbook.Sheets(sPlanAEnviar).ExportAsFixedFormat Type:=xlTypePDF, Filename:= _
      NovoArquivoXLS.SaveAs ThisWorkbook.Path & “\” & sPlanAEnviar & “.pdf”, _
      Quality:=xlQualityStandard, IncludeDocProperties:=True, IgnorePrintAreas _
      :=False, OpenAfterPublish:=False
      Daí você vai organizando e produzindo sua macro de acordo com suas necessidades.
      Abç

      Responder
  60. Frquento muito seu site em busca de informações, meu parabéns pelo trabalho.
    Gostaria de sanber se é possivel mesclar Procv nessa macro, exemplo:
    Preciso mandar vários e-mail com anexos diferentes e cada um deles com texto e destinatários diferentes.
    O texto tem duas variações, ou seja gostaria de fazer um procv para o texto e um procv para o e-mail que quero enviar, e colocaria cada anexo no devido lugar.
    è possivel acresecntar Procv numa macro como essa?

    Responder
  61. Boa Tarde
    Curti muito sua explicação sobre enviar Email em lista em com anexo, conforme artigo publicado no endereço:
    https://www.exceldoseujeito.com.br/2012/07/24/automatizar-o-envio-de-emails-das-suas-listas-com-o-excel-parte-2/
    Porem tenho duas divida, não teria como colocar o caminho dos anexos, exemplo para o e mail a@teste.com.br o anexo a no e mail b@teste.com.br o anexo b no e mail apenas o anexo a e no b apenas o anexo b, so que ao invés de aparecer uma janela para selecionar o arquivo eu coloque o caminho do anexo na célula d6 por exemplo e ele busque automaticamente o arquivo e envie seguindo uma lista?
    um grande abç.

    Responder
    • Olá, tudo bem!
      As linhas de 39 a 43 da rotina EnviarEmailComAnexo() fazem referência a inclusão de anexos em nosso exemplo.
      Substitua essas linhas pela seguinte:
      .setEmailAnexo = sh.Range(“D6”)
      Desta forma, você passa o arquivo que foi definido na célula D6.
      Você só vai precisar definir a regra da associação dos anexos aos respectivos emails. Mas, daí é simples né?!!!
      Abçs

      Responder
      • Me desculpe a ignorância porem sou novo em macros vba estou estuando, como assim regra de associação dos anexos, o objetivo é enviar email diferentes para aproximadamente 350 pessoas diferentes com anexo em pdf diferente, ja consegui incluir a transformação do arquivo em xls em pdf so falta agora essa etapa de incluir uma macro de envio em lista com pdf diferentes, você pode me ajudar por favor.

        Responder
        • Olá!
          Não sei como está o projeto de sua planilha. Uma idéia que posso apresentar – e imagino que seja assim que esteja estruturada a sua planilha-base com os emails – é definir cada diferente anexo na listagem de contatos. Com isso, a anexo correspondente a cada contato seria anexado distintamente.
          Mas, como você ainda está iniciando na programação VBA, posso oferecer uma ajudinha na montagem da macro. Contudo, preciso que passe mais detalhes do que você já está fazendo, como faz o relacionamento dos anexos aos contatos, ou seja, as suas regras de negócio, para que possamos fazer algo mais acertado.
          Mande mais informações e a planilha (essencial para agilizar o processo) na seção Tire Sua Dúvida aqui do site. Assim que eu tiver um tempinho dou uma verificada.
          Abç

          Responder
  62. Rei,
    Já havia tentado algumas coisas na linha da sua macro, mas nada tão limpo e simplificado como voce fez, ficou sensacional!
    Estou com um problema em apenas 1 das minhas maquinas onde quando tento rodar a macro tenho a seguinte resposta: “Não é possivel carregar o sistema de email. Verifique a instalação do sistema de email.”
    Porem já tentei de tudo, reinstalar o office, alterar a raiz do oficce no regedit, mas nada funcionou. Acredito que talvez tenha passado por algo assim e pudesse me ajudar.

    Responder
  63. Boa tarde Pedro ! Seu site é “excel”ente, ja havia criado algumas rotinas para enviar e-mail, mas a sua esta bem mais claro. Porém precisava de uma ajuda, trabalho em uma empresa, e montei um controle de documentos que deve ser enviado para a pessoa especifica na lista, não para várias, usei sua macro, e funcionou blz,utilizamos o Outlook, mas agora recebo um e-mail de retorno do Adm da Intranet dizendo que o e-mail que informo(somente alguns) não existe, porém ele esta la,ja confrontei a lista com que esta no Outlook, e esta correto, Utilizo Userform’s, e desativo a exibição da tela do excel para trabalhar, como se fosse realmente um programa, sera que falta informar o meu servido. Segue o seu código abaixo que adaptei:
    ‘*************************************************************************
    Private Sub EnvlAtende_Click()
    On Error GoTo Err_Emaill
    Dim NovoArquivoXLS As Workbook
    Dim sPlanAEnviar As String
    Dim sExcluirAnexoTemporario As String
    Dim EndEnv As String <<<———–Inclui – Endereço de Envio
    sPlanAEnviar = "ATEND"
    EndEnv = TextEmail.Text <<<———–Inclui
    Set NovoArquivoXLS = Application.Workbooks.Add
    ThisWorkbook.Sheets(sPlanAEnviar).Copy Before:=NovoArquivoXLS.Sheets(1)
    NovoArquivoXLS.SaveAs ThisWorkbook.Path & "\" & sPlanAEnviar & ".xls"
    sExcluirAnexoTemporario = NovoArquivoXLS.FullName
    NovoArquivoXLS.SendMail EndEnv, "PENDÊNCIAS DE CANHOTOS"
    NovoArquivoXLS.Close
    Kill sExcluirAnexoTemporario
    Err_Exit:
    Exit Sub
    Err_Emaill:
    MsgBox "Não foi possível Enviar a Relação ao Destinatário por E-mail!", 16, "Erro"
    NovoArquivoXLS.Close
    Kill sExcluirAnexoTemporario
    Exit Sub
    '*************************************************************************
    End Sub

    Responder
    • Olá Marco, tudo bem?
      A princípio está tudo correto no código.
      Não sei o valor que está sendo passado na Textbox, mas, o ideal a ser passado seria um email válido, ou seja, dê preferência a passar o endereço de email e não o nome do catálogo, enfim, não tenho certeza se é isso, mas, vai como dica.
      Um abraço

      Responder
  64. Bom dia,
    fiz essa macro mas ela não roda, aparece mensagem dizendo que a macro pode não estar habilitada, mas eu já habilitei no excel e no outlook.. o que poderia ser???

    Responder
  65. boa tarde Rei!!!! gostaria de tirar uma duvida!!!
    tomando como base a linha de sua macro abaixo:
    gostaria de saber se posso fazer com que o “titulo do email” venha a ser o valor que contenha dentro de uma celula da planilha? será que fui claro?obrigado
    ‘Envia o email
    NovoArquivoXLS.SendMail “email_do_destinatário@email.com”, “Título do Email”

    Responder
    • Oi Rogério.
      Também com base no exemplo do artigo, faremos referência à planilha pelo nome alocado na variável sPlanAEnviar e definiremos a célula que tem o título que queremos utilizar. Neste exemplo, usei a célula A1.
      NovoArquivoXLS.SendMail “email_do_destinatário@email.com”, NovoArquivoXLS.Sheets(sPlanAEnviar).Range(“A1”)
      Um abraço

      Responder
      • PARA MIM VC ALÉM DE REI , É UM GENIO!!! POIS SÓ OS GENIOS ATENDEM AOS PEDIDOS COM PREFEIÇÃO!!!
        DEU CERTO , DEU CERTO!!! MUITO OBRIGADO REI!!!!

        Responder

Deixe uma resposta para Marco Moura Cancelar resposta