Planilha de importar NFEs – Excel VBA

Como criar um Gráfico de Box-Plot Excel
Como criar um Gráfico de Box-Plot Excel
6 de novembro de 2012
Como preencher células vazias em uma lista Excel
Como preencher células vazias em uma lista Excel
10 de dezembro de 2012

Objetivo: Disponibilizar planilha Excel exemplo para importar notas fiscais eletrônicas a partir dos arquivos XML.

A planilha funciona de uma forma muito simples, você seleciona a pasta aonde estão os arquivos XML disponibilizados pelos fornecedores ou os seus, clicando no botão ao lado da lista do “Local para leitura das NFEs:”.

Nota: Este botão funciona no Excel 2010, para o Excel 2007, identifique no código fonte a palavra PtrSafe e apague ela, esta palavra faz com que a função funcione também em Windows 64 bits, que é o caso do Windows 7.

Após ter selecionado a pasta, basta clicar no botão Importar, os arquivos serão automaticamente colocados na planilha “Lista de notas fiscais” do arquivo.

O mesmo trabalho também poderia ser feito abrindo arquivo a arquivo XML e depois colando um embaixo do outro dentro de uma planilha, este trabalho é realizado pelo código Excel VBA que segue abaixo:

'Colocar esta parte do código no início do módulo
Public Declare PtrSafe Function SHBrowseForFolder Lib "shell32.dll" Alias _
    "SHBrowseForFolderA" (lpBrowseInfo As BROWSEINFO) As Long
Public Declare PtrSafe Function SHGetPathFromIDList Lib "shell32.dll" Alias _
    "SHGetPathFromIDListA" (ByVal pidl As Long, ByVal pszPath As String) _
    As Long
Public Type BROWSEINFO
    hOwner As Long
    pidlRoot As Long
    pszDisplayName As String
    lpszTitle As String
    ulFlags As Long
    lpfn As Long
    lParam As Long
    iImage As Long
End Type

Dim fPasta As String

Sub lsImportarNotas()
    Workbooks.OpenXML Filename:= _
        "C:\Rieper\Blog\Ler nfes\35121013585367000166550010000006191045355778-nfe.xml" _
        , LoadOption:=xlXmlLoadImportToList
End Sub

Sub ListarArquivosExcel()
    Dim FName               As String

    'Cria um vetor de strings
    Dim arNames()           As String

    Dim myCount             As Integer
    Dim lsExtensao          As String
    Dim lUltimaLinhaAtiva   As Long
    Dim lNomePlanilha       As String

    Application.DisplayAlerts = False

    'Camihho do arquivo
    lsExtensao = "*.xml"

    'Determina o diretório e a extensão do arquivo
    FName = Dir(fPasta & lsExtensao)

    'Limpa a planilha
    Sheets("Lista de notas fiscais").Range("A:XFD").Clear

    'Enquanto FName for igual a vazio "", realiza a listagem dos arquivos
    Do Until FName = ""
        myCount = myCount + 1
        'Redimensiona o vetor, preservando os dados
        ReDim Preserve arNames(1 To myCount)
        arNames(myCount) = FName
        'Passa os dados para a planilha
        Worksheets("Lista de notas fiscais").Select
        Workbooks.OpenXML Filename:= _
            Worksheets("Configuração").Range("c6").Value & "\" & arNames(myCount) _
            , LoadOption:=xlXmlLoadImportToList

        lNomePlanilha = ActiveWorkbook.Name

        'Copiar e fechar a planilha ativa
        If myCount = 1 Then
            Rows("1:20000").Select
        Else
            Rows("2:20000").Select
        End If
        Selection.Copy
        Windows("Planilha de apresentação de NFes.xlsm").Activate

        lUltimaLinhaAtiva = Worksheets("Lista de notas fiscais").Cells(Worksheets("Lista de notas fiscais").Rows.Count, 1).End(xlUp).Row

        Range("A" & lUltimaLinhaAtiva).Select

        Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
            :=False, Transpose:=False
        Application.CutCopyMode = False

        'Atualiza a variável FName
        FName = Dir

        Windows(lNomePlanilha).Close
    Loop

    Cells.Select
    Cells.EntireColumn.AutoFit

    ActiveSheet.ListObjects.Add(xlSrcRange, Range("$A$1:$DJ$100000"), , xlYes).Name = _
        "Tabela1"
    Range("Tabela1[#All]").Select
    ActiveSheet.ListObjects("Tabela1").TableStyle = "TableStyleMedium9"
    Range("Tabela1[[#Headers],[versao]]").Select
    Sheets("Configuração").Select
    Range("C7").Select

    Application.DisplayAlerts = True
End Sub

Public Function gfSelecionarPasta(ByVal vFolder As String, Optional Title As String, Optional hWnd) As String

    Dim bi As BROWSEINFO
    Dim pidl As Long
    Dim folder As String

    folder = String$(255, Chr$(0))

    With bi
        If IsNumeric(hWnd) Then .hOwner = hWnd
        .pidlRoot = 0
        If Title <> "" Then
            .lpszTitle = Title & Chr$(0)
        Else
            .lpszTitle = "Select a Folder" & Chr$(0)
        End If
    End With

    pidl = SHBrowseForFolder(bi)

    If SHGetPathFromIDList(ByVal pidl, ByVal folder) Then
        folder = Left(folder, InStr(folder, Chr$(0)) - 1)
    Else
        folder = ""
    End If

    If Right(folder, 1) <> "\" And Len(folder) > 0 Then folder = folder & "\"

    gfSelecionarPasta = folder

End Function

Public Sub gfPasta()
    fPasta = gfSelecionarPasta("C:", "Selecione a pasta dos arquivos das NFes:")
    Range("C6").Value = fPasta
End Sub

Esta solução é gratuita, basta clicar no botão de download abaixo, mas temos também uma planilha de importação automática em Excel da NFe na versão 3.1, veja em nossa loja.

Planilha Importar NFe automaticamente Excel

Abraço

Marcos Rieper

31 Comments

  1. George disse:

    Funciona legal ate que uma nfe contenha campos diferentes (a mais ou a menos) e dai o programa nao identifica e nao alinha corretamente.

    Mesmo assim meus parabens, belo exemplo de programacao em VBA.

    Se um dia vc consertar me avise que eu tenho interesse em comprar.

    Agraco
    George
    11-40554211 r 205

  2. romulo disse:

    Amigo, baixei a planilha porém não funciona. Eu seleciono o local onde estão os arquivos XML, porém quando clico em importar da um erro no VBA.

    ERRO: “O método Clear da Classe Range falhou”
    clico em depurar e ele me leva para a seguinte linha de programação:

    Sheets(“Lista de notas fiscais”).Range(“A:XFD”).Clear

    ve se pode me ajudar!

    abraço!! e ótimo site!

  3. Denilson disse:

    basta remover este nome que pelo menos abre a nota
    “PtrSafe”
    só falta formatar

  4. Não precisaria remover PtrSafe se as funções fossem declaradas da seguinte forma:

    #If Vba7 Then

    Public Declare PtrSafe Function SHBrowseForFolder Lib “shell32.dll” Alias _
    “SHBrowseForFolderA” (lpBrowseInfo As BROWSEINFO) As Long
    Public Declare PtrSafe Function SHGetPathFromIDList Lib “shell32.dll” Alias _
    “SHGetPathFromIDListA” (ByVal pidl As Long, ByVal pszPath As String) _
    As Long

    #Else

    Public Declare Function SHBrowseForFolder Lib “shell32.dll” Alias _
    “SHBrowseForFolderA” (lpBrowseInfo As BROWSEINFO) As Long
    Public Declare Function SHGetPathFromIDList Lib “shell32.dll” Alias _
    “SHGetPathFromIDListA” (ByVal pidl As Long, ByVal pszPath As String) _
    As Long

    #EndIf

    Desta forma funcionaria da mesma maneira tanto no VBA6 (32 bits) quanto no VBA7 (32 e 64 bits)…

    • Marcos Rieper disse:

      Bom dia Fabrício,

      Perfeito, assim ele verificaria qual a versão e declararia as variáveis conforme cada uma, muito obrigado pela sua colaboração, muito pertinente o seu comentário.

      Abraço

      Marcos Rieper

  5. A linha de código abaixo funciona com o sinal da tralha # e apenas com o termo VBA7?

    #If VBA7 THEN

    Até onde eu sei, o código de finalização do loop IF END é:

    END IF (e não ENDIF).

  6. antonio disse:

    Bom dia Marcos,

    Conforme dito pelo George dependendo do XmL os dados importados ficam desalinhados. Se for possível tem como adaptar um código para selecionar determinados campos ??? Desde já agradeço a atenção!!!

  7. antonio disse:

    Tenho 3 arquivos xml de teste como enviá-los? Obrigado !

    No código abaixo busco a informação direto do código fonte, porém não faz a importação de um lote de arquivos xml (lê apenas 1) diferente do seu. Como adaptá-lo?

    Option Explicit

    ‘É necessário adicionar a biblioteca Microsoft XML, vX.0
    Dim xmlDOM As DOMDocument

    Private Sub teste()

    Dim strArquivo As String
    Dim ws As Worksheet
    Dim c As Long

    ‘Altere o valor abaixo para o arquivo que deseja abrir.
    strArquivo = “c:\Lernfes1\teste.xml”

    Set ws = ActiveSheet

    ‘O objeto DOMDocument deve ser usado para manipular dados XML:
    Set xmlDOM = CreateObject(“MSXML2.DOMDocument”)
    xmlDOM.async = False
    ‘Carrega o arquivo especificado par ao objeto DOMDocument:
    xmlDOM.Load strArquivo

    With ws
    ‘Apaga conteúdo da Planilha, cria e formata cabeçalho:
    .Cells.Delete
    .Range(“A1:E1”) = Array(“Nº NF”, “Nat.Operação”, “Dt. Emissão”, “Cliente (ms)”, “CNPJ”)
    .Rows(1).Font.Bold = True

    ‘Importa informações de arquivo XML:
    c = 1
    ObterNó “//nNF”, .Cells(2, c)
    c = c + 1
    ObterNó “//natOp”, .Cells(2, c)
    c = c + 1
    ObterNó “//dEmi”, .Cells(2, c)
    c = c + 1
    ObterNó “//dest/xNome”, .Cells(2, c)
    c = c + 1
    ObterNó “//dest/CNPJ”, .Cells(2, c)

    .Columns.AutoFit
    End With

    Set xmlDOM = Nothing
    End Sub

    Private Function ObterNó(strNó As String, rng As Range)
    Dim objNodes As IXMLDOMNodeList
    Dim objNode As IXMLDOMNode
    Dim FileName As String
    Dim r As Long
    Dim c As Long

    Set objNodes = xmlDOM.SelectNodes(strNó)

    For Each objNode In objNodes
    If objNodes.Length > 0 Then
    rng.Offset(r) = objNode.Text
    r = r + 1
    Else
    Exit For
    End If
    Next objNode
    End Function
    Sub DadosXML()
    End Sub

  8. James Byron disse:

    Realmente, importei 68 notas e a partir da linha 255 e coluna ns1:tpNF os dados começam a ser copiados fora de ordem.
    Como faço para todos os campos ficarem alinhados?

  9. James Byron disse:

    Bom dia Marcos,
    Envio para algum email, ou subo em algum servidor?

    Pretendo criar uma integração entre sua planilha de nfe e outra que estou criando.

  10. Rogério disse:

    Bom dia,

    Referente esse processo eu não estou conseguindo fazer a importação, podeia por favor me ajudar?Erro.
    Erro de compilação Era esperado sub o function

  11. Olá Marcos, tudo bem?
    Li sobre o curso de EXCEL VBA, e no pré-requisito vi que é interessante ter pelo menos conhecimento intermediário do EXCEL.
    Não consegui ver, neste site, se você ministra o curso de EXCEL INTERMEDIÁRIO, caso sim, qual o tempo de duração e o valor?

    Fico no aguardo.
    Um abraço
    Jorge

    • Marcos Rieper disse:

      Bom dia Jorge,

      Muito obrigado pelo interesse no curso de VBA.

      Ainda não temos o curso de Excel Intermediário, mas se você já trabalha com fórmulas básicas, formatação de dados e alguma coisa de gráficos, ou trabalha na empresa no dia-a-dia com Excel você já pode fazer este curso, ou ainda fazer primeiro o de Excel Avançado e depois o de VBA para um maior proveito.
      http://cursoexcelavancado.com.br/

      Abraço

      Marcos Rieper

  12. Marcelo disse:

    Boa Tarde. Estou com problema para identificar quando temos diversas duplicatas na nota fiscal. A planilha puxa somente a primeira.

    Aguardo.

    Abraço

    Marcelo Bega

  13. Pessoal, preciso de uma macro, que possa selecionar o arquivo XML para ser importado.

  14. Felipe Dasi disse:

    Marcos, boa tarde, acrescetei melhoras a sua macro, como faço para te enviar?

  15. Rodrigo disse:

    Alguem conseguiu resolver problema da coluna, tem como editar o que xml precisa puxar,

  16. Romero disse:

    Realmente, importei 68 notas e a partir da linha 255 e coluna ns1:tpNF os dados começam a ser copiados fora de ordem.
    Como faço para todos os campos ficarem alinhados?

    Isso já foi corrigido? aguardo retorno. Obrigado!

  17. Izaira disse:

    Bom dia! quando importo varias nfs, muitas por ter telefone, ou não, não vem na coluna,ja informa na coluna posterior que é ns1:indIEDest, em vez de existir a coluna “fone”

  18. sueli disse:

    Olá, pessoal. Alguém conseguiu resolver o problema da coluna, como faço para todos os campos ficarem alinhados ? Estou tentando importar mais de mil NFes. Se alguém resolveu pode me enviar o arquivo por e-mail ? shimamoto.sueli@hotmail. Obrigada,

  19. Rodrigues disse:

    A planilha é importada completamente, conforme cada Tag do XML. Tem como configurar para importar somente com informações desejada?
    Ir para tabela do Excel somente as informações: Nº NF, Valor da NF, Codigo do Produto, Valor do Produto, NCM, Aliquota de Icms, IPI.

    Fico grato pela ajuda

  20. MDM disse:

    BOA TARDE, baixei a planilha porem quando baixo vários XLM a quantidade de volumes ficam desalinhados, exemplo pula a coluna. poderia verificar por favor?

  21. ERIC disse:

    Não está rodando no office 2016.

Deixe uma resposta

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *

Esse site utiliza o Akismet para reduzir spam. Aprenda como seus dados de comentários são processados.

Inscreva-se no nosso canal do Youtube!


Junte-se ao nosso canal do Youtube. Começamos em abril de 2016, mas já temos mais de 06:00 h de treinamentos gratuitos e este número irá aumentar. Vídeos novos todos os sábados.