Este artigo pode te ajudar muito se você recebe muitos emails ou que possui muitos emails em sua caixa de entrada e deseja organizar os emails mas não sabe por onde começar, aprenda como carregar e-mails do outlook para o excel.
Esta postagem foi revisada onde foram incluídos os seguintes itens no código:
Cells(r, "G") = olItem.LastModificationTime 'Última modificação Cells(r, "H") = olItem.Categories 'Categoria Cells(r, "I") = olItem.SenderName 'Nome do remetente Cells(r, "J") = olItem.FlagRequest 'Acompanhamento
De tempos em tempos dou uma boa organizada em meu outlook revendo a estrutura de pastas, tarefas, agenda e emails e esta semana estava no escritório e achei que esta deveria ser a hora de fazer isso novamente, porém isso é uma tarefa que leva tempo e como sou um pouco chato com estas coisas de organização, não gosto de apenas jogar os emails em uma pasta de arquivo morto e pronto, acho que tudo tem de ter o seu lugar.
Como qualquer coisa na vida ou projeto que vamos fazer temos de ter dimensão do tamanho deste para que assim possamos ter um norte de por onde devemos partir e o que fazer, porém isso tudo é muito massante, desgastante e acaba sendo um pouco trabalhoso.
O código abaixo vai lhe ajudar a listar no Microsoft Excel os emails do seu arquivo PST linha após linha, email, data, remetente e anexos.
Este código tem um pedaço de uma rotina que encontrei no StackOverflow e em um fórum de Access…
Preciso verificar meu histórico do celular pois foi via mobile que encontrei, após isso colocarei o link com o crédito.
O código faz referencia ao Microsoft Outlook ‘GetObject(, “Outlook.Application”)’ onde ele define os objetos, faz a verificação se o objeto existe e se caso não existir cria o objeto ‘CreateObject(“Outlook.Application”)’
Após exportar os dados para o Excel, basta fazer uma Tabela Dinâmica e visualizar os dados como desejar.
Carregar e-mails do outlook para o excel:
Sub Emails_Outlook() 'Carregar e-mails do outlook para o excel Dim appOutlook As Object Dim olNS As Object Dim olFolder As Object Dim olItem As Object Dim r As Long On Error Resume Next Set appOutlook = GetObject(, "Outlook.Application") If appOutlook Is Nothing Then Set appOutlook = CreateObject("Outlook.Application") End If On Error GoTo 0 Set olNS = appOutlook.GetNamespace("MAPI") 'Abaixo preencha o nome do arquivo de dados PST e a pasta. 'Neste caso o arquivo é Douglas Godoy e a pasta Caixa de Entrada. Set olFolder = olNS.Folders("Douglas Godoy").Folders("Caixa de Entrada") Cells.Delete r = 3 'Cria um array montando o título das colunas no arquivo. Range("A3:K3") = Array("Título", "Quem enviou", "Para", "Data e Hora", "Anexos", "Tamanho","Última modificação","Categoria","Nome do Remetente","Tipo de acompanhamento","Conteúdo") For Each olItem In olFolder.Items If TypeName(olItem) = "MailItem" Then r = r + 1 Cells(r, "A") = olItem.Subject 'Assunto do e-mail Cells(r, "B") = olItem.SenderEmailAddress 'E-mail do remetente Cells(r, "C") = olItem.To 'E-mail do destinatário Cells(r, "D") = olItem.ReceivedTime 'Data/Hora de recebimento Cells(r, "E") = olItem.Attachments.Count 'Número de anexos Cells(r, "F") = olItem.Size 'Tamanho da mensagem em bytes Cells(r, "G") = olItem.LastModificationTime 'Última modificação Cells(r, "H") = olItem.Categories 'Categoria Cells(r, "I") = olItem.SenderName 'Nome do remetente Cells(r, "J") = olItem.FlagRequest 'Acompanhamento 'Cells(r, "K") = olItem.Body 'Tome cuidado ao utilizar pois carrega os dados do corpo do email Application.StatusBar = r End If Next olItem Columns.AutoFit End Sub
Observação: caso você não saiba qual o nome do seu arquivo de dados do Outlook, acesse:
Ferramenta Outlook – Menu Ferramentas – Configurações de Conta – Aba Arquivo de Dados.
O nome que consta na aba “Arquivo de dados que deve ser inserido em olNS.Folders(“Douglas Godoy”).
Espero desta forma ter lhe ajudado a buscar seus emails em sua caixa de entrada, desta forma fica muito mais fácil saber por onde começar a organizar seus emails e o qual a situação atual do seu arquivo de dados.
Caso você conheça alguma outra forma Carregar e-mails do outlook para o excel, compartilhe, sua opinião é muito importante.
DICA:
Caso você queira aprender como listar todas tabelas dinamicas do seu arquivo em excel, deixo o artigo abaixo como dica!
Agradeço pela leitura e fico no aguardo de seus comentários e sugestões.
Um abraço. DG
Olá,Parabéns,maravilhoso o seu conteúdo.
Obrigada por compartulhar conhecimento.
Gostaria de tirar uma duvida,te como rodar no Outlook Web ?
Pois essa é a unica licença que minha empresa concede
Não funciona no outlook web, teriamos de desenvolver um script para isso.
Se tiver interesse me mande uma mensagem.
Um abraço!
Ola Douglas
Muita bacana essa macro. Funcionou muito bem com a maioria dos e-mails.
Contudo não deu certo com os e-mails “Mail Delivery System”
Ao rodar a macro, não exibe nada.
Poderia me ajudar por favor
Douglas na verdade eu precisava de um codigo que importa o corpo do ultimo e-mail enviado em uma celula
Douglas bom dia perfeito este codigo
mas teria como ele importar apenas o corpo do ultimo email iria me ajudar muto
Boa noite Douglas,
Parabéns pela trabalho, ficou muito bom!
Muito obrigado por compartilhar este conhecimento.
at,
Obrigado pelo comentário e visita ai site. Abraços
Boa tarde Douglas,
A macro funcionou direitinho, porém gostaria de fazer alguns ajustes:
gostaria que a macro entra no email pré-definido por assunto e copie dados deste e-mail…
é possível fazer? tu tens algo parecido?
att,
Lucas, neste caso você deve verificar qual o titulo …
If olItem.Subject = “SEU TITULO” Then
Ai você traz os campos que precisa do email.
Abraços
Oi, boa tarde…
Tenho uma dúvida..
Fiz uma macro para extrair as informações do outlook, deu certo no meu notebook pessoal mais no da empresa da erro, sabe me informar o porque disso? Basicamente ele não encontra a pasta caixa de entrada no Outlook.
Office da empresa – 365 para grandes empresas
Office pessoal – Professional Plus 2021
Linha do erro.
Set olFolder = olNS.Folders(“Douglas Godoy”).Folders(“Caixa de Entrada”)
Olá Franciane, provavelmente no computador da empresa você não ajustou o nome das pastas, verifica isso, pois muda de um computador para outro.
Abs
Obrigada!! Me ajudou demais!! Adorei! Parabéns!!!
Olá Michelle, que bom que ajudou!!! Sempre que precisar fico a disposição. Abraços
Boa noite,
esta dando erro “Sub ou function não definida”.
consegue ajudar?
Pode me enviar sua planilha por email? Assim analiso o que pode ser o erro, preciso de mais detalhes para te ajudar. Abraços
Ola Douglas
Excelente ideia de organizar os emails listando no Excel para facilitar.
Rodei a macro mas quando encontra email sem remetente ele da erro (1004) pintando no VBE esta linha ” Cells(r, “B”) = olItem.SenderEmailAddress ‘E-mail do remetente”.
Sera que voce pode me ajudar?
Obrigado.
Jorge, você pode colocar um tratamento de erro antes desta linha que dá erro.
Coloca o comando: On error resume next.
Pois quando der erro na linha de rementente vazio ele irá para a próxima linha de comando.
Abraços
Jorge, muito boa a programação! É possível separar algumas informações específicas que estão dentro do corpo do e-mail e trazer em colunas. exemplo: nome, CPF, telefone, solicitação, prazo.
Desde já obrigada!
Olá Celi,
Obrigado pela colaboração no blog!
Sempre que quiser falar sobre excel e vba estou a disposição
Abraços
Muito prático! Parabéns!
Consigo adaptar esse código para extrair e-mails .ost?
Abraço!
Obrigado Ana!
Douglas primeiramente parabéns pelo trabalho.
Se você ainda ve o post me tira uma duvida esta dando erro em tempo de execução 91
No olmail
Ivan,
Neste caso você adicionou a biblioteca do outlook nas referencias?
Abraços
Douglas, bom dia
O excel consegue ler e-mails do outlook e abrir o arquivo anexado ao e-mail ?
E também consegue enviar e-mail e anexar arquivos?
Rubens,
O excel consegue sim ler os e-mails e abrir o arquivo anexo, além de fazer o inverso, enviando um email e anexando um arquivo.
Abs
Pingback: Atualizar importação salva no access através do excel com vba - Douglas GodoyDouglas Godoy
Douglas boa noite. Excelente Macro me ajuda muito.
Mas temos como filtrar por assunto do email de uma subpasta?
Tem sim João,
Neste caso você deve colocar uma condicional antes da estrutura que irá carregar os dados na planilha…
Exemplo…
If olItem.Subject =”Titulo do e-mail” then
Cells(r, “A”) = olItem.Subject ‘Assunto do e-mail
Cells(r, “B”) = olItem.SenderEmailAddress ‘E-mail do remetente
Cells(r, “C”) = olItem.To ‘E-mail do destinatário
Cells(r, “D”) = olItem.ReceivedTime ‘Data/Hora de recebimento
Cells(r, “E”) = olItem.Attachments.Count ‘Número de anexos
Cells(r, “F”) = olItem.Size ‘Tamanho da mensagem em bytes
Cells(r, “G”) = olMail.LastModificationTime ‘Última modificação
Cells(r, “H”) = olMail.Categories ‘Categoria
Cells(r, “I”) = olMail.SenderName ‘Nome do remetente
Cells(r, “J”) = olMail.FlagRequest ‘Acompanhamento
‘Cells(r, “K”) = olItem.Body ‘Tome cuidado ao utilizar pois carrega os dados do corpo do email
EndIf
Boa noite!
Estava justamente querendo fazer algo assim.. E voá-la, encontrei tudo pronto.. Muito obrigada por disponibilizar seu conteúdo aqui, me ajudou Muito. parabéns!
Muito obrigado Rogério!
Sempre que precisar é só chamar!
Abs
cara, nunca comentei mas essa não teve como deixar passar..
Parabéns mesmo viu!!!
Bom dia Douglas. Ressuscitando o post, pois está sendo muito útil pra mim. Mas surgiu uma dúvida, vê se pode me ajudar.
Quando executa a macro, ele dá erro de variável do objeto não definida e ao pedir pra depurar ele aponta a variável olMail
Quando tiro todas as linhas com essa variável do código (que são as linhas incluídas na sua revisão), daí o código roda normal.
Acredito que faltou declará-las, é isso?
Espero que ainda esteja visualizando os comentários rsrs
Parabéns pelo post!
Olá João, boa tarde!
Obrigado pelo seu comentário e visita ao site.
Fiz o teste e realmente você tinha razão, ao declarar o item o código passa rodar completo.
Este problema foi apresentado em alguns computadores com versões diferentes de office.
Sempre que quiser comente e participe das postagens, isso é muito importante!
Um abraço!
Muito bom, Consegui executar aqui, mas fica uma dúvida.
É possível extrair dados específicos do corpo do e-mail?
Se você definir que quer que apareça o .Body ele trás tudo o que estiver no corpo do e-mail…
‘Cells(r, “K”) = olItem.Body
Como faço para tirar a quebra de pagina?
Olá Raigo,
Quando fala em quebra de página, refere-se a que temos na impressão?
Douglas, Bom dia!
Parabéns e muito obrigado pelo post!
Estou tetando aplicar em meu outlook, porem apresenta um erro de compilação: ‘Sub’ ou ‘Function’ nao definida.:
‘Cria um array montando o título das colunas no arquivo.
Range(“A3:K3”)
Cara, parabéns! Ajudou muito aqui na empresa!
Olá Fernando,
Muito obrigado pela visita e pelo comentário!
Fico feliz que tenha lhe ajudado, este é o objetivo!
Um abraço.
Douglas
Douglas tive um problema ,esta dando erro de sintaxe na linha do Array;
Range(“A3:K3”)= Array(“Título”, “Quem enviou”, “Para”, “Data e Hora”, “Anexos”, “Tamanho”,”Última modificação”,”Categoria”,”Nome do Remetente”,”Tipo de acompanhamento”,”Conteúdo”)
pode me auxiliar nessa?
Douglas, bom dia.
Primeiramente obrigado por compartilhar o seu conhecimento e pela atenção a minha mensagem.
Fiz os passos conforme sua orientação, mas também obtive o erro:
(“Erro em tempo de execução ’91’:
A variável do objeto ou a variável do bloco ‘With’ não foi definida”)
Esse erro ocorre justamente na linha Set olNS = appOutlook.GetNamespace(“POP3”) , já troquei o valor de “POP3” para “MAPI”, porém sem sucesso.
O Meu pacote office é o 2010 e tenho 3 perfis de e-mails criados no Outlook, nesse caso preciso especificar também para qual perfil será executado o código?
Muito obrigado
Diego Silva
diegofersilva@gmail.com
Sub Emails_Outlook()
Dim appOutlook As Object
Dim olNS As Object
Dim olFolder As Object
Dim olItem As Object
Dim r As Long
On Error Resume Next
Set appOutlook = GetObject(, “Outlook.Application”)
If appOutlook Is Nothing Then
Set appOutlook = CreateObject(“Outlook.Application”)
End If
On Error GoTo 0
Set olNS = appOutlook.GetNamespace(“POP3”)
‘ Abaixo preencha o nome do arquivo de dados PST e a pasta.
‘ Neste caso o arquivo é Douglas Godoy e a pasta Caixa de Entrada.
Set olFolder = olNS.Folders(“SPAM”).Folders(“SPAM”)
Cells.Delete
r = 3
‘ Cria um array montando o título das colunas no arquivo.
‘ Range(“A3:K3”) = Array(“Título”, “Quem enviou”, “Para”, “Data e Hora”, “Anexos”, “Tamanho”,”Última modificação”,”Categoria”,”Nome do Remetente”,”Tipo de acompanhamento”,”Conteúdo”)
For Each olItem In olFolder.Items
If TypeName(olItem) = “MailItem” Then
r = r + 1
Cells(r, “A”) = olItem.Subject ‘Assunto do e-mail
Cells(r, “B”) = olItem.SenderEmailAddress ‘E-mail do remetente
Cells(r, “C”) = olItem.To ‘E-mail do destinatário
Cells(r, “D”) = olItem.ReceivedTime ‘Data/Hora de recebimento
Cells(r, “E”) = olItem.Attachments.Count ‘Número de anexos
Cells(r, “F”) = olItem.Size ‘Tamanho da mensagem em bytes
Cells(r, “G”) = olMail.LastModificationTime ‘Última modificação
Cells(r, “H”) = olMail.Categories ‘Categoria
Cells(r, “I”) = olMail.SenderName ‘Nome do remetente
Cells(r, “J”) = olMail.FlagRequest ‘Acompanhamento
‘ Cells(r, “K”) = olItem.Body ‘Tome cuidado ao utilizar pois carrega os dados do corpo do email
Application.StatusBar = r
End If
Next olItem
Columns.AutoFit
End Sub
Opa, bom dia!
Será que é possivel no .CC inserir um grupo de e-mail ja criado no outlook ? na primeira vez o e-mail vai, mas nas outras não envia., pode me ajudar?
With OutMail
.cc = ” *grupo do outlook”
Olá Diego,
É possivel sim, tente referenciar o nome do grupo em uma determinada célula e a partir daí fazer a leitura com uma variável.
Ex:
nome_grupo = Sheets(“Plan1”).Range(“A1”).value
.cc = nome_grupo
Espero que dê certo, e se conseguir nos avise!
Um abraço.
Douglas
Douglas fiz conforme sugerido porem aparece o erro “A variável do objeto ou a variável do bloco ‘With’ não foi definida”, no meu caso é email de empresa mas esta no outlook 2010, poderia me ajudar?
Abaixo esta como colei e alterei o codigo no VBA EXCEL
Sub Emails_Outlook()
Dim appOutlook As Object
Dim olNS As Object
Dim olFolder As Object
Dim olItem As Object
Dim r As Long
On Error Resume Next
Set appOutlook = GetObject(, “Outlook.Application”)
If appOutlook Is Nothing Then
Set appOutlook = CreateObject(“Outlook.Application”)
End If
On Error GoTo 0
Set olNS = appOutlook.GetNamespace(“POP3”)
Set olFolder = olNS.Folders(“cristiano.lorenzato@tgmservicos.com.br”).Folders(“Arquivos do Outlook”)
Cells.Delete
r = 3
Range(“A3:K3”) = Array(“Título”, “Quem_enviou”, “Para”, “Data”, “Anexos”, “Tamanho”, ”Modificação”, ”Categoria”, ”Remetente”, ”Acompanhamento”, ”Conteúdo”)
For Each olItem In olFolder.Items
If TypeName(olItem) = “MailItem” Then
r = r + 1
Cells(r, “A”) = olItem.Subject ‘Assunto do e-mail’
Cells(r, “B”) = olItem.SenderEmailAddress ‘E-mail do remetente’
Cells(r, “C”) = olItem.To ‘E-mail do destinatário’
Cells(r, “D”) = olItem.ReceivedTime ‘Data/Hora de recebimento’
Cells(r, “E”) = olItem.Attachments.Count ‘Número de anexos’
Cells(r, “F”) = olItem.Size ‘Tamanho da mensagem em bytes’
Cells(r, “G”) = olMail.LastModificationTime ‘Última modificação’
Cells(r, “H”) = olMail.Categories ‘Categoria’
Cells(r, “I”) = olMail.SenderName ‘Nome do remetente’
Cells(r, “J”) = olMail.FlagRequest ‘Acompanhamento’
Cells(r, “K”) = olItem.Body ‘Tome cuidado ao utilizar pois carrega os dados do corpo do email’
Application.StatusBar = r
End If
Next olItem
Columns.AutoFit
End Sub
Cristiano, Bom dia!
Tudo bom meu caro? Espero que sim…
Indo para sua dúvida…
Acredito que o problema esteja na linha
Set olNS = appOutlook.GetNamespace(“POP3”)
Tente trocar esta linha para:
Set olNS = appOutlook.GetNamespace(“MAPI”)
O MAPI (Messaging Application Programming Interface) é usado no Outlook com um servidor de email que executa o Exchange.
É um Acrônimo de Messaging Application Programming Language. É a Especificação de interface da Microsoft que permite que diversas aplicações de troca de mensagens e de grupo de trabalho (inclusive correio eletrônico, correio de voz e fax) operem através de um único cliente.
Ele é que faz a comunicação dos aplicativos Excel X Outlook, a porta de entrada.
Peço que verifique e faça o teste e depois me responda se deu certo!
Abraços.
Abs
Douglas Godoy
Oi Douglas, boa tarde. Preciso do código VBA de um contato associado a mensagem. Quando você abre e mensagem de outlook e vincula um contato a ela, na propriedade “marcas” do outlook. É o campo que aparece, ao escolher no seletor de campos, o campos contatos.
Tentei o código .FormDescription.ContactName. Porém o mesmo não funcionou, vem e mrbanco. Você tem alguma ideia para me ajudar? Conseguiu entender minha dúvida?
MUITO BOM O MATERIAL, SIMPLES E EFICIENTE.
Leandro,
Muito obrigado pelo comentário e visita ao site.
Abraços.
Grande ajuda. Suas dicas são sempre muito boas e tenho aprendido muito e aplicado em meu trabalho!
Boa tarde! Sou leigo no assunto e preciso saber como posso executar esse código? Trabalho com pousadas e recebo e-mails com formulários que contem dados como periodo, quantidade de pessoas, etc. Preciso desses dados em planilhas.
Bom dia Douglas,
Ótimo post, esta me ajudando muito.
Vocês sabe como podemos salvar um e-mail via VBA editando o Título incluindo a data e a hora recebida e salvando em [assunto].MSG
Grato
Boa tarde Douglas!
Ótimo conteúdo, muito me ajudou este tutorial.
Eu gerencio grande parte dos KPIs e indicadores onde trabalho.
Temos necessitado muito de automatiza-los, pois hoje gastamos bastante tempo na elaboração.
Usamos em paralelo o Minitab para criar uma gráfico de dispersão um pouco rico, porém preciso gera-lo mais rápido e gostaria de temos como uma especie de Dashboard alterando apenas a data. Pode me ajudar? Quando crio Dashbords normalmente uso Tabela Dinâmica, mas ela não permite a geração de gráficos de dispersão. Eu ainda sou iniciante em VBA com isso não consegui gerar outra alternativa, mas tenho bastante urgência em automatiza-lo. Pode me ajudar?
Douglas, Sensacional!
Cara, sensacional, me ajudou muito.
Muito Obrigado
Carlos,
Muito obrigado pelo comentário e pela visita.
Sempre que precisar fico a disposição.
Um abraço!
Douglas, muito bom o código!
Tem como filtrar um determinado intervalo de data? por exemplo, eu quero que traga os emails de determinada pasta com data de recebimento >= 01/07/2015 e <= 30/07/2015 ?
Agradeço desde já a sua ajuda.
Olá, boa tarde. Gostei muito do código, mas… Preciso criar uma rotina que puxe os emails de uma conta do Outlook. A conta é uma só que há subpastas separando os tipos de arquivos. Pretendo criar uma planilha para cada subpasta do Outlook, e colocá-las cada uma conforme a seu arquivo. Como faço isso a partir de seu código?
Já resolvi o problema abaixo, mas preciso contar a quantidade de emails de cada subpasta. Tento fazer por fórmulas, mas quando executo o código, ele quebra as fórmulas. Alguma luz?
Estava procurando algo do tipo.
Acho que tem um equívoco de digitação em seu código. Nas linhas Cells(r,”G”)… e Cells(r, “J), precisa trocar olMail por olItem.
Caro Douglas,
Obrigado ela informação.
Percebi que o programa tem um limitação.
Não consegue baixar mais que 100 email.
Há alguma solução? e porque?
Obrigado novamente
Boa tarde Douglas,
Muito bom o post, existe alguma maneira de conseguir a mesma informações das subpastas?
Marcelo, Boa noite!
Obrigado pela visita e pelo comentário no site.
Para buscar a informação de Subpastas pasta adicionar novamente o .Folders(“NOME DA PASTA”) como no exemplo abaixo:
Set olFolder = olNS.Folders(“Douglas Godoy”).Folders(“Projetos”).Folders(“2015”)
Espero ter ajudado e se precisar de algo mais comente.
Um abraço
Douglas
Olá Douglas
Primeiramente devo parabenizá-lo pela ótima dica, foi muito útil e aproveitando o seu conhecimento, gostaria de saber se existe uma forma de ordenar a pasta por data?
Por exemplo:
Ordenar a pasta por data decrescente
Set olFolder = olNS.Folders(“Douglas Godoy”).Folders(“Caixa de Entrada”)
Tenho uma aplicação em um cliente e seria importante conseguir esta informação.
Obrigado.
Ederson Arruda
http://www.excelessencial.com
Muto bom cara, me ajudou bastante.