Carregar e-mails do Outlook para o Excel com VBA

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") = 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

 

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") = 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

 

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

Carregar e-mails do outlook para o excel

Arquivo de dados do Microsoft Outlook.

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

Comentários

  • Joao Ferreira
    Responder

    Douglas boa noite. Excelente Macro me ajuda muito.
    Mas temos como filtrar por assunto do email de uma subpasta?

    • Douglas Godoy

      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

  • Rogério
    Responder

    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!

    • Douglas Godoy

      Muito obrigado Rogério!

      Sempre que precisar é só chamar!

      Abs

  • lucas
    Responder

    cara, nunca comentei mas essa não teve como deixar passar..
    Parabéns mesmo viu!!!

  • João Roberto Ribeiro
    Responder

    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!

    • Douglas Godoy

      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!

  • João Roberto
    Responder

    Muito bom, Consegui executar aqui, mas fica uma dúvida.
    É possível extrair dados específicos do corpo do e-mail?

    • Douglas Godoy

      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

  • Raigo
    Responder

    Como faço para tirar a quebra de pagina?

    • Douglas Godoy

      Olá Raigo,

      Quando fala em quebra de página, refere-se a que temos na impressão?

  • Max SIlva
    Responder

    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”)

  • Mersin Merkez Escort
    Responder

    Cara, parabéns! Ajudou muito aqui na empresa!

    • Douglas Godoy

      Olá Fernando,

      Muito obrigado pela visita e pelo comentário!

      Fico feliz que tenha lhe ajudado, este é o objetivo!

      Um abraço.

      Douglas

  • Fabricio
    Responder

    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?

  • Diego Silva
    Responder

    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

  • Diego Favaro
    Responder

    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”

    • Douglas Godoy

      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

  • Cristiano
    Responder

    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

    • Douglas Godoy

      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

  • Leandro
    Responder

    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?

  • Leandro Bley
    Responder

    MUITO BOM O MATERIAL, SIMPLES E EFICIENTE.

    • Douglas Godoy

      Leandro,

      Muito obrigado pelo comentário e visita ao site.

      Abraços.

  • Guilherme
    Responder

    Grande ajuda. Suas dicas são sempre muito boas e tenho aprendido muito e aplicado em meu trabalho!

  • Luiz
    Responder

    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.

  • ROGERIO FERNANDES CUNHA
    Responder

    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

  • Jefferson
    Responder

    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?

  • Carlos Pugliese
    Responder

    Cara, sensacional, me ajudou muito.

    Muito Obrigado

    • Douglas Godoy

      Carlos,

      Muito obrigado pelo comentário e pela visita.

      Sempre que precisar fico a disposição.

      Um abraço!

  • Luiz Elias
    Responder

    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.

  • Vitor Rodrigues
    Responder

    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?

    • Vitor Rodrigues

      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?

  • Marcio Yokoyama
    Responder

    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.

  • Mario
    Responder

    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

  • Marcelo
    Responder

    Boa tarde Douglas,

    Muito bom o post, existe alguma maneira de conseguir a mesma informações das subpastas?

    • Douglas Godoy

      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

  • Ederson Arruda
    Responder

    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

  • Luciano
    Responder

    Muto bom cara, me ajudou bastante.