Configuração inicial
Eu construí um pequeno exemplo que deve te dar o que você está procurando. Primeiro eu configurei alguns arquivos do Excel em uma única pasta, onde alguns contêm a string "abc" e outros não. Eu coloquei alguns que têm mais do que apenas "abc" e em diferentes folhas dentro da mesma pasta de trabalho. Isso deve simular exatamente o que você tem.
Mostrando como funciona depois de concluído
VocêdevefornecerodiretórioinicialcomoeutenhonacélulaA2.
Acodificação
Inicialmente,configuramosumloopparapercorrertodososarquivosquesãoarquivosdoExcelcomestalinha:
fileName=Dir(directory&"*.xl??")
Conforme cada nome de arquivo é encontrado, nós o abrimos usando isto:
Dim wbk As Workbook
With wbk
Set wbk = Workbooks.Open(directory & fileName)
End With
Com cada pasta de trabalho aberta, usamos o comando cells.find para procurar nossa string e fazer isso em cada folha. Se houver uma correspondência, aumentamos nosso contador de variáveis em um:
For Each sh In wbk.Worksheets
Set found = sh.Cells.Find(what:="abc", LookIn:=xlFormulas)
If Not found Is Nothing Then
sh.Activate
found.Select
count = count + 1
Else
End If
Next sh
Por fim, feche cada pasta de trabalho antes de ir para a próxima, por isso não temos um problema de memória de ter muitas pastas de trabalho abertas:
wbk.Close
Aqui está todo o código criado:
Sub LoopThroughFiles()
Range("'Sheet1'!A6:A10000").ClearContents
Dim directory As String, fileName As String, sheet As Worksheet, i As Integer, j As Integer
directory = "C:\Users\wzcj9x\Desktop\New folder\"
fileName = Dir(directory & "*.xl??")
i = 5
Do While fileName <> ""
i = i + 1
If fileName <> "" Then
Dim wbk As Workbook
With wbk
Set wbk = Workbooks.Open(directory & fileName)
End With
Dim sh As Worksheet
Dim found As Range
Dim count As Integer
For Each sh In wbk.Worksheets
Set found = sh.Cells.Find(what:="abc", LookIn:=xlFormulas)
If Not found Is Nothing Then
sh.Activate
found.Select
count = count + sh.Range(found.Address).Offset(0, 3).Value
Else
End If
Next sh
wbk.Close
End If
fileName = Dir()
Loop
Range("'Sheet1'!C2").Value = count
End Sub
Você simplesmente precisa executar a macro e ela produzirá uma contagem para você. Se você deseja produzir apenas uma contagem de 1 por pasta de trabalho, independentemente de quantas vezes ela existe na pasta de trabalho, deve ser muito fácil modificar meu método de contagem.
Deixe-me saber se você tem alguma dúvida, mas espero que isso ajude a fazê-lo pelo menos o caminho certo.
Atualizar
Eu atualizei minha pergunta para retornar o valor que é de 3 células à direita da célula encontrada e adicioná-las todas juntas. Isso corresponde à nova atualização do questionador.
Outra atualização baseada em comentários
Eu modifiquei meu código para somar apenas o valor máximo que atende aos critérios por pasta de trabalho e, em seguida, incluo apenas esses valores:
Dim max As Integer
max = 0
For Each sh In wbk.Worksheets
Set found = sh.Cells.Find(what:="abc", LookIn:=xlFormulas)
If Not found Is Nothing Then
sh.Activate
found.Select
If sh.Range(found.Address).Offset(0, 3).Value > max Then
max = sh.Range(found.Address).Offset(0, 3).Value
End If
Else
End If
Next sh
count = count + max
wbk.Close