Macro para Localizar arquivos no Computador e listar na planilha

E aí pessoal, blz?!!
Hoje, atendendo a alguns pedidos da galera aqui, vou mostrar como localizar arquivos no hd de seu computador, via código, ou seja, através de macro VBA. Dessa maneira, é possível manipular o resultado da pesquisa da forma que desejar, seja validando os itens encontrados, calculando seus tamanhos, verificando seus tipos, relacionando seus nomes, imprimindo a pesquisa, etc. As possibilidades são diversas e dependerá da finalidade que você definir para o projeto.
Para explicar uma maneira de conseguir estes resultados, vou criar um exemplo de uma planilha que listará todas as músicas, em formato .mp3, presentes em seu computador, ou em qualquer pasta que o usuário quiser procurar. A macro solicitará ao usuário em qual pasta deverá fazer a busca e listará o resultado na planilha.
Vejamos como fazer.

Inserindo o código

 
Primeiramente, vamos acessar o ambiente VBA. Para isso, tecle ALT+F11.
Insira dois Módulos no projeto e nomeie-os MóduloAPI e MóduloPesquisa, respectivamente. Veja abaixo os códigos que você deverá escrever em cada um deles.
MóduloPesquisa

Sub Listar_arquivos_mp3()
Dim i As Long
Dim sh As Worksheet
Dim iSomaMb As Double
Dim sPasta As Variant
Dim iLinha As Long
    Set sh = ThisWorkbook.ActiveSheet
    'Exibe a caixa para escolha da pasta onde será feita a pesquisa
    sPasta = GetPasta
    If sPasta = "" Then
        Exit Sub        'Cancela pesquisa
    End If
    'Apaga o conteúdo
    sh.Range("B:C").EntireColumn.ClearContents
    'Escreve o cabeçalho
    sh.Cells(4, 2).Value = "Música"
    sh.Cells(4, 3).Value = "Tamanho (Mb)"
    'Define a linha inicial da listagem
    iLinha = 5
    Application.StatusBar = "Aguarde... Pesquisando ... "
    'Usa o objeto de pesquisa
    With Application.FileSearch
        .LookIn = sPasta                        'Define a pasta onde será pesquisado
        .Filename = "*.mp3"                     'Define o termo da pesquisa
        .SearchSubFolders = True                'Informa se será feita a pesquisa nas subpastas
        .Execute                                'Executa a pesquisa  Ohhhhh!!!!
        'Percorre os itens encontrados e escreve na planilha
        For i = 1 To .FoundFiles.Count
            sh.Cells(iLinha, 2).Value = .FoundFiles(i)
            sh.Cells(iLinha, 3).Value = CDbl(Format((FileLen(.FoundFiles(i)) / 1048576), "0.00"))
            iSomaMb = iSomaMb + sh.Cells(iLinha, 3).Value
            iLinha = iLinha + 1
            Application.StatusBar = "Preenchendo lista ... " & Format(i / .FoundFiles.Count, "0%")
        Next i
        sh.Cells(1, 2).Value = "Músicas em " & sPasta
        sh.Cells(2, 2).Value = "Total de Músicas: " & .FoundFiles.Count
        sh.Cells(3, 2).Value = "Espaço Utilizado: " & Format(iSomaMb, "0.00") & " MB"
    End With
    sh.Range("A1").Select
    Application.StatusBar = False
End Sub

MóduloAPI

'Declarações API
Private 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
Private Declare Function SHBrowseForFolder Lib "shell32.dll" Alias "SHBrowseForFolderA" _
    (lpBrowseInfo As BROWSEINFO) As Long
Declare Function SHGetPathFromIDList Lib "shell32" (ByVal itemID As Long, ByVal path As String) As Long
Private Const BIF_RETURNONLYFSDIRS = &H1
Function GetPasta() As String
    Dim bnfo As BROWSEINFO
    Dim sCaminho As String
    Dim lIndice As Long
    Dim vJanela As Variant
    Dim iPosicao As Integer
    Dim sPasta As String
    sPasta = ""
    'A pasta raiz é o Desktop:
    bnfo.pidlRoot = 0&
    'Título
    bnfo.lpszTitle = "Selecione a pasta onde procurar"
    'Tipo de dado retornado:
    bnfo.ulFlags = &H1
    'Mostra a janela:
    vJanela = SHBrowseForFolder(bnfo)
    'Analisa e trata o resultado:
    sCaminho = Space(512)
    lIndice = SHGetPathFromIDList(ByVal vJanela, ByVal sCaminho)
    If lIndice Then
        iPosicao = InStr(sCaminho, Chr(0))
        sPasta = Left(sCaminho, iPosicao - 1)
    End If
    GetPasta = sPasta
End Function

Bom, não vou explicar agora o MóduloAPI, pois, não está no escopo deste artigo. Ele será usado apenas para permitir a exibição da tela para escolha da pasta para a busca dos arquivos. Usaremos a função GetPasta deste módulo. Numa próxima oportunidade, farei um artigo sobre as caixas de diálogo do Windows.
Já o MóduloPesquisa, apesar de seu código bem comentado, explicarei alguns detalhes a mais.
Na linha 8, defino a planilha ativa, para receber os resultados da pesquisa. Ou seja, nesta planilha é que deverá ser preparada e formatada para escrever os nomes das músicas encontradas na pesquisa. Nós poderíamos, também, colocar o resultado em uma caixa de listagem dentro de um formulário, isso depende da forma como eu quero trabalhar os dados. Nós vamos imprimí-los na planilha mesmo. Veja na figura como ficaria a formatação desta planilha para receber os dados encontrados na busca.

 
Na linha 32, .Filename = “*.mp3”, é onde definimos o que estamos buscando. Neste caso, tudo que termine com .mp3. Caso você deseje procurar por outro tipo de arquivo é nesta linha que você tem que alterar. Se quiser buscar apenas planilhas, pode ficar “*.xls” ou pesquisar fotos “*.jpg”. Ou ainda, pelos nomes dos arquivos “Currículo.doc” ou “Trabalho de Informática”. Você é quem define.
 

Executando a Macro

 
Antes de rodarmos a macro para efetuar a pesquisa, vamos definir um botão para acessar a rotina Listar_arquivos_mp3(). Faça algo semelhante ao da figura acima, clicque em Caixa de Texto, na barra de ferramentas Desenho, e escreva “Pesquisar Músicas em MP3“. Em seguida, clique com o botão direito do mouse sobre esta caixa e selecione a opção Atribuir macro… e escolha a macro Listar_arquivos_mp3.
Salve a planilha.
Agora, clique neste botão que acabamos de criar. Surgirá a tela para selecionarmos a pasta base para nossa busca de músicas em Mp3. Escolha uma pasta e clique em OK.

Dependendo da pasta que você escolher, se for uma pasta grande, ou seja, com muitos arquivos e pastas, a macro poderá demorar um pouco para finalizar, e, poderá apresentar a mensagem “(não respondendo)”. Não se assuste e nem aborte a função, pois, ela está executando sim, apenas está varrendo muitas pastas em busca dos arquivos mp3. Nos meus testes aqui, ficava em torno de 1 a 2 minutos, mas, eu tinha poucas músicas aqui.
Enfim, o resultado é bem legal e dá para adaptar às suas necessidades perfeitamente. No final do artigo deixei o link para vocês baixarem o arquivo de exemplo.
 
Bem. Então é isso. Não se esqueçam de nos seguir no twitter e assinar nossa newsletter. Assim, você nos ajuda e fica sabendo de todas as novidade aqui do site, ok.
Abração.

UPDATE:
Esta macro não roda nas versões superiores ao Excel 2003, por esta razão escrevi este outro artigo aqui: Update: Macro para Localizar arquivos no Computador – Busca mp3
Leiam esta atualização e baixem o arquivo que disponibilizei lá.

4 comentários em “Macro para Localizar arquivos no Computador e listar na planilha”

  1. Comentei esta linha:
    ‘Set fso = New FileSystemObject
    e acertei o espaçamento desta linha:
    Declare Function SHGetPathFromIDList Lib “shell32” (ByVal itemID As Long, ByVal path As String) As Long
    Funcionou muito bem.
    Obrigado

    Responder
  2. Bom dia,
    Sou novo por aqui e no vba. Preciso criar uma macro que leia vários arquivos do excel (não sei a quantidade nem o nome dos arquivos, apenas onde estão).
    Achei seu código e acho que ele pode me ajudar, porém a função Application.FileSearch não funciona mais no excel 2007. Como modifico? Qual função utilizo?
    Quero utilizar apenas a primeira parte do código, pois não quero utilizar o módulo API.
    Grato.

    Responder

Deixe um comentário