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á.
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
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.
Olá Flávio,
Leia este artigo aqui:
https://www.exceldoseujeito.com.br/2012/05/18/update-macro-para-localizar-arquivos-no-computador-busca-mp3/
Abç