Notifications
Clear all

[Resolvido] Procurar arquivo exato via VBA

15 Posts
5 Usuários
2 Reactions
2,820 Visualizações
(@ericksant)
Posts: 109
Estimable Member
Topic starter
 

Pessoal, boa tarde.

Estou tentando desenvolver um vba para realizar a procura de PDFs, copiar esse arquivo e colar em outra pasta.

 

Eu já consegui fazer isso, porém não estou conseguindo resolver o seguinte problema:

- Pegar apenas o PDF que CONTER aquele número de nota fiscal apenas.

 

Exemplo, no meu código eu preciso pegar a NF com numeração 341, mas a macro acaba trazendo 10 NFs, exemplo:

341

3412

3414

3412

 

Ou seja, ele encontra tudo que tiver o "341" e trás. O mais engraçado é que se você forçar o "341" entre aspas na parte de "pesquisa" do próprio Windows, ele pega apenas a primeira NF (341). Já tentei forçar o próprio VBA colocar as Aspas, mas não funciona...

 

Alguém consegue me ajudar? Segue abaixo o código até o momento.

Const SUBPASTA_2021 As String = "C:\Users\erick.l.santiago\Downloads"

Sub ListaPastas(Pasta As Object, Celula As Range)
    Dim Arquivo     As Object
    Dim SubPasta    As Object
  
    For Each Arquivo In Pasta.Files
        If InStr(Arquivo.Name, Celula.Offset(0, 1)) <> 0 Then
        
            'MsgBox InStr(Arquivo.Name, Celula.Offset(0, 1))
            
            If InStr(Arquivo.Name, Celula) <> 0 Then
            
             'MsgBox Arquivo.Name
             
             'If Arquivo.Name Like Celula Then
            
                Call Arquivo.Copy(ThisWorkbook.Path & _
                    "\teste\")
                Celula.Offset(0, 3) = "Encontrado"
                  
            End If
            'End If
            
           ' Else
                
                'Celula.Offset(0, 3) = "Não encontrado"
            
        End If
        Next Arquivo
    
    For Each SubPasta In Pasta.SubFolders
        Call ListaPastas(SubPasta, Celula)
    Next SubPasta
End Sub

Sub Macro()
    Dim Fso     As Object
    Dim Celula  As Range
    Dim conteudo As String
    Dim teste As String
    Dim Tempo As Double
    
    Tempo = Now()
    
    Set Fso = CreateObject("Scripting.FileSystemObject")
    Set Celula = [A2]
    
    While Celula <> ""

       'conteudo = Celula
    
       'teste = """" & conteudo & """"
        
        'teste = conteudo & ".txt"
    
       'Celula.Value = teste
        
        
        Call ListaPastas( _
            Fso.GetFolder(SUBPASTA_2021), Celula)
        Set Celula = Celula.Offset(1)
    Wend
    
    MsgBox "A macro foi executada com sucesso!", vbOKOnly
    MsgBox "O tempo de execução foi " & Now() - Tempo
    
End Sub
 
Postado : 01/02/2022 12:42 pm
(@anderson)
Posts: 203
Reputable Member
 
If Arquivo.Name = Celula.value Then

Em 90% dos casos em que não se anexa o arquivo, ocorrem mal-entendidos, gerando perda de tempo de ambos os lados.

 
Postado : 01/02/2022 2:48 pm
(@ericksant)
Posts: 109
Estimable Member
Topic starter
 

@anderson eu tentei fazer isso, mas não me ajuda, exemplo:

o nome do arquivo é assim 'teste - nf 321 - NomeFornecedor', dai a macro ta trazendo todos caras que contem o "321" no nome... Eu queria de alguma forma fazer a mesma lógica que o próprio Windows faz quando você coloca o valor entre aspas, e trás apenas o cara que contém AQUELE CONTEÚDO!

exemplo em anexo.

 
Postado : 02/02/2022 2:11 am
(@ericksant)
Posts: 109
Estimable Member
Topic starter
 

exemplo dois

 
Postado : 02/02/2022 2:12 am
EdsonBR
(@edsonbr)
Posts: 1057
Noble Member
 

Bom dia, @Ericksant!

Se os nomes dos arquivos são sempre dessa forma, ou seja, algo antes, o número que vc quer e algo depois, vc poderia usar o operador Like, algo como:

If Arquivo.Name Like ("*[!#]" & Celula.Offset(0, 1).Value & "[!#]*") Then

Interpretando:

  • o coringa "*" representa quaisquer caracteres e em qualquer quantidade
  • o padrão [!#] representa qualquer caractere (quantidade 1 apenas) exceto um número naquela posição (lista negada)

Portanto, a expressão completa retornará True caso a análise de Arquivo.Name da esquerda pra direita corresponda a: qualquer texto até chegar a um caractere antes do valor alvo da Celula, depois analisa se esse caractere é não numérico então Ok, aí sim o valor da Celula, proíbe então  que o primeiro caractere após Celula seja um algarismo e depois pode ter qualquer coisa até o final do texto.

Se precisar de mais poder no parsing de sua string, por exemplo permitir zeros à esquerda, separadores de milhar e/ou espaços internos, texto começando ou terminando já com o alvo, etc., aí aconselharia o uso do poder do Regex criando um objeto VBScript.RegExp.

Se sua intenção é apenas gerar uma listagem (por exemplo em um txt ou csv) de arquivos que atendem a certos critérios como é o seu caso, sem outros tratamentos posteriores no Excel, recomendaria fortemente o poderoso, rápido e leve aplicativo Everything da VoidTools (free).

 

 
Postado : 02/02/2022 8:17 am
(@ericksant)
Posts: 109
Estimable Member
Topic starter
 

@edsonbr Bom dia! Muito obrigado pelo retorno.

anteriormente eu já tinha testado utilizar o like, porém sem esses critérios, mas ambos testes não funcionaram do jeito que eu precisava. Até utilizando os seus critérios, a macro trás todos arquivos (exemplo das duas prints que postei aqui), onde o certo seria trazer apenas um PDF.

o que eu não consigo entender, é que se eu travar o valor procurado entre aspas na lupa do Windows, ele trás exatamente só o pdf que preciso, porém via vba essa lógica não funciona...

 
Postado : 02/02/2022 11:19 am
EdsonBR
(@edsonbr)
Posts: 1057
Noble Member
 
Postado por: @ericksant

...Até utilizando os seus critérios, a macro trás todos arquivos (exemplo das duas prints que postei aqui)...

Era pra ter segregado. Alguma coisa não está fechando nesse seu caso.

Mas não adianta tentarmos trabalhar sobre imagens .jpg  e só através das descrições dos problemas. Procure fazer o seguinte então: gere uma tabelinha com todos os nomes de arquivo de sua pasta e cole numa planilha. Numa outra planilha (ou na mesma), ao lado da célula que em seu código vc chama de "Celula", coloque uma pequena relação dos nomes que vc quer ver filtrados por palavra inteira. Deixe seu código VBA inteiro no arquivo também. Anexe seu arquivo aqui.

 
Postado : 02/02/2022 1:36 pm
(@ericksant)
Posts: 109
Estimable Member
Topic starter
 

Oi @edsonBR,

 

Segue em anexo meu exemplo, no cenário perfeito, deveria vir apenas um arquivo. Conforme a print que mandei.

 
Postado : 02/02/2022 4:33 pm
(@ericksant)
Posts: 109
Estimable Member
Topic starter
 

@edsonbr Bom dia, conseguiu baixar meu anexo e simular ai? Está na página 2 desse tópico.

 
Postado : 03/02/2022 10:51 am
EdsonBR
(@edsonbr)
Posts: 1057
Noble Member
 

Estou no trabalho agora, à noite posso ver.

 
Postado : 03/02/2022 2:21 pm
ericksant reacted
EdsonBR
(@edsonbr)
Posts: 1057
Noble Member
 

Colega @ericksant, sei que está ansioso e que prometi pra ti ver o problema. Vai desculpando mas ontem levei trabalho p/ terminar em casa, só consegui concluir já era mais de 02:00.

Na primeira folga que der vou ver essa situação.

 
Postado : 04/02/2022 12:19 pm
ericksant reacted
(@televisaos)
Posts: 49
Eminent Member
 

Já que na pesquisa do Windows funciona como vc precisa não seria possível inserir a API do Windows que contenha essa função de busca?

Não sei como fazer isso. É só uma sugestão de caminho.

Att.

 
Postado : 05/02/2022 6:22 am
(@osvaldomp)
Posts: 858
Prominent Member
 

@ericksant, se os nomes dos arquivos seguem o padrão dos seus exemplos ~~~> "espaçoNºNFespaço", então o comando abaixo poderia ajudar.

If InStr(Arquivo.Name, " " & Celula & " ") Then

 

dica - no seu caso o comparativo "<> 0" é desnecessário, pois If Instr retorna True ou False

Osvaldo

 
Postado : 05/02/2022 10:45 am
EdsonBR
(@edsonbr)
Posts: 1057
Noble Member
 

Boa noite, @Ericksant.

Teste com as modificações implementadas no anexo. Caso deseje permitir que números de NF's possam conter zeros à esquerda (o que é muito comum na prática), por exemplo, validar 023361 ou 00023361 mas não 2336100, altere a linha:

rgx.Pattern = "\b" & Celula & "\b"

Para:

rgx.Pattern = "\b0*" & Celula & "\b"

Obs.: não alterei em nada seu código presente no módulo.

 

 
Postado : 05/02/2022 9:54 pm
(@ericksant)
Posts: 109
Estimable Member
Topic starter
 

@edsonbr Boa tarde! Era isso mesmo que eu precisava!!! Muito obrigado!!!

 
Postado : 10/02/2022 11:36 am