Gerar Árvore de Arquivos e Diretórios no Excel

Você pode usar o Excel para varrer um caminho local ou de rede e mostrar os arquivos e/ou diretórios (que chamarei neste artigo de itens) numa tabela, criando uma árvore de itens. Na pasta de trabalho que preparei, você pode configurar como quer exibir os resultados:

O resultado da execução do programa pode ser visto abaixo:

Muitas vezes, mesmo com permissão de administrador, não é possível varrer todos os itens de um diretório. Isso pode ocorrer em função de atributos de um item ou até mesmo na incapacidade do VBA em ter as mesmas permissões que um usuário tem. Para esses casos e de outros erros, há uma planilha chamada Erros na pasta de trabalho que lista os casos em que não foi possível ler informações de um item.

Se for de seu interesse, há como tornar a rotina mais rápida: elimine todas as referências a intervalos nomeados como [ListFolders], substituindo por variáveis de nível de módulo, ou então simplesmente elimine do código testes condicionais e tratamentos de erros que você julgar desnecessários.

Existem dois métodos de busca disponíveis: Dir e FileSystemObject. Ambos tem vantagens e desvantagens. Fiz um teste varrendo todos os itens do meu computador e notei resultados curiosos:

  • FileSystemObject: demorou 190s, encontrou 340.000 itens e obteve erro no acesso a 375 itens.
  • Dir: demorou 62s, encontrou 270.000 itens e obteve erro no acesso a 55 itens.

O método Dir é mais rápido que o FileSystemObject, no entanto, sua implementação com recursão é um pouco complicada, como pode ser visto no código. Além disso, Dir encontra menos arquivos que FileSystemObject. Essa grande diferença se dá pelo fato de eu não ter utilizado argumentos vbReadOnly, vbHidden e vbSystem na função Dir. Não sei se é possível afirmar que mesmo usando esses argumentos, eu alcançaria a mesma quantidade de itens varridos pelo FileSystemObject. Decidi deixar esses argumentos de fora porque a cada novo teste aparecia erros diferentes que precisaria eu mudar bastante a rotina.

Num ambiente de rede bastante lento, eu certamente utilizo Dir. No entanto, se eu quiser fazer uma análise minuciosa que inclui arquivos de sistema e ocultos, escolheria FileSystemObject.

Para fazer download do arquivo de exemplo deste artigo, clique aqui.

Sobre Felipe Gualberto

Microsoft Most Valuable Professional (MVP) de Excel.
Esta entrada foi publicada em Ferramentas e marcada com a tag , , , , , . Adicione o link permanente aos seus favoritos.
  • Roberto

    Boa tarde
    não tem como sair o tamanho do diretorio? na opção listar diretorio.
    Grato
    Roberto

    • Sim, não sei por que não fiz isso.

      1 – Escolha o método FileSystemObject

      2 – No código, vá até o procedimento RecurFolderFSO

      3 – Altere a linha abaixo:

      vItems(eItems.Tamanho, itemCounter) = DIRECTORY_TEXT

      para:

      vItems(eItems.Tamanho, itemCounter) = targetFolder.Size

      • Roberto

        muito obrigado, deu certo

  • Andre Furlanetto Dos Reis

    Felipe, parabéns. Usava um arquivo .bat executado na pasta para importar os nomes dos arquivos em outro arquivo .txt, mais sua solução é muito mais limpa e profissional.

    Seria possível, dento de um mesmo diretório com várias planilhas com colunas idênticas, consolidar as informações das linhas dessas planilhas em uma só planilha?

    Não tenho muito conhecimento em vba, mas como você consegue trazer os nomes de todos as arquivos de um diretório específico, trazer as informações das planilhas padronizadas desses diretórios via vba também é possível?

    • Andre Furlanetto Dos Reis

      Felipe, boa noite.
      Pesquisei bastante e encontrei uma solução muito boa em umas de suas recomendações no forum da Microsoft. O RDBMerge do Ron de Bruin.
      Deixo aqui o mesmo link caso alguém também precise:
      http://www.rondebruin.nl/win/addins/rdbmerge.htm

      De qualquer forma, seu site tem sido de muita ajuda.
      Parabéns mais uma vez pelo trabalho.

  • Jefferson Cargnielo Morais

    Parabéns era o que eu buscava..

    Uma dúvida
    Como eu faria para adicionar mais colunas?

    Por exemplo eu quero listar minhas músicas e queria que aparecesse os campos das tags do titulo, cantor, ano, etc, há alguma forma que eu possa adiciona-las?

  • Mauricio

    Oi Felipe,
    Era exatamente o que eu queria, mas estou recebendo um erro nr. 13 – Tipos Incompatíveis !!! Pode me ajudar?

  • David Almeida

    Mt obg me ajudou muito

  • Umar Zakaria

    Hi, thanks for sharing
    Can you please advice more variables to add in the VBA script to get attributes like author name, description etc. of excel file in same directory?

  • Angelo Matos

    Você é o cara!

  • Caroline

    Oi Felipe! Estou tendo o mesmo problema que o Mauricio, aparece Tipos incompatíveis e nenhum arquivo ou diretório aparece na lista.. Estou tentando listar arquivos de uma pasta de rede do lugar que trabalho..