Начальная настройка
Я создал небольшой пример, который должен дать вам то, что вы ищете. Сначала я установил несколько файлов Excel в одну папку, где некоторые содержат строку "abc", а некоторые нет. Я положил некоторые, которые имеют больше, чем просто "abc" и в разных листах в одной книге. Это должно имитировать именно то, что у вас есть.
Показываю, как это работает после завершения
Вы должны предоставить начальный каталог, как у меня в ячейке A2.
Кодировка
Мы изначально настроили цикл для просмотра всех файлов, которые являются файлами Excel, с этой строкой:
fileName = Dir(directory & "*.xl??")
Поскольку каждое имя файла найдено, мы открываем его, используя это:
Dim wbk As Workbook
With wbk
Set wbk = Workbooks.Open(directory & fileName)
End With
С каждой открытой книгой мы используем команду cell.find для поиска нашей строки и делаем это на каждом листе. Если есть совпадение, то мы увеличиваем наш счетчик переменных на единицу:
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
Наконец, не забудьте закрыть каждую рабочую книгу, прежде чем переходить к следующей, чтобы у нас не возникало проблем с памятью из-за слишком большого количества открытых книг:
wbk.Close
Вот весь код вместе взятый:
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
Вам просто нужно запустить макрос, и он произведет подсчет для вас. Если вы хотите произвести подсчет только 1 для каждой книги, независимо от того, сколько раз он существует в книге, изменить метод подсчета будет очень легко.
Дайте мне знать, если у вас есть какие-либо вопросы, но, надеюсь, это поможет вам, по крайней мере, выбрать правильный путь.
Обновить
Я обновил свой вопрос, чтобы вернуть значение, которое составляет 3 ячейки справа от найденной ячейки, и добавить их все вместе. Это соответствует новому обновлению вопроса asker.
Еще одно обновление на основе комментариев
Я изменил свой код, чтобы суммировать только максимальное значение, которое соответствует критериям для рабочей книги, а затем добавить только эти значения вместе:
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