Страницы: 1
RSS
Поиск во всех книгах (в одной папке) нужной информации VBA
 
Всем привет.  
Помогите пожалуйста с кодом макроса для поиска строк по критериям и записи в текущую книгу.    
Есть макрос который собирает все данные из всех книг в текущей папке - как основа.  
Например, нужно чтобы в эту книгу собирались строки из всех книг в папке, где значние в ячейке d (Статус) = "нет данных", а в ячейке I (Длительность) = 24:00:00.  
Такой код очень нужен. Т.к. потом его можно использовать для поиска других данных.
 
Буквально вчера писал на другом форуме:  
 
написано 29.08.2012 12:59  
Цикл перебора и открытия файлов поищите, а в нём например такой код:  
 
 
код    
--------------------------------------------------------------------------------  
kod = 322332  
   
For Each sh In Worksheets  
Set f = sh.UsedRange.Find(kod, , xlValues, xlWhole)  
If Not f Is Nothing Then MsgBox sh.Parent.Name & vbNewLine & sh.Name & vbNewLine & f.Address, vbInformation: Exit For  
Next  
If f Is Nothing Then MsgBox "Nothing :(", vbExclamation  
 
======================  
 
Как я понимаю - код по перебору файлов у Вас уже есть.
 
Код есть.  
 
Sub CollectInfo()  
Dim BazaWb As Workbook 'текущая книга (общий файл)  
Dim BazaSht As Worksheet 'лист Price-group в общем файле  
Dim iTempFileName As String 'имя поочерёдно открываемого файла  
Dim iPath As String 'путь к папке, где лежат все файлы  
Dim iLastRowBaza As Long 'последняя заполненная строка в общем файле в столбце C  
Dim iLastRowTempWb As Long 'последняя заполненная строка в по-очерёдно открываемом файле в столбце C  
Dim iNumFiles As Long 'количество открываемых файлов  
 
   With Application  
       .ScreenUpdating = False  
       .DisplayAlerts = False  
       .Calculation = xlManual  
       Set BazaWb = ThisWorkbook  
       Set BazaSht = BazaWb.Sheets("Price-group")  
       iPath = BazaWb.Path & "\"  
       iTempFileName = Dir(iPath & "*.xls")  
       Do While iTempFileName <> ""  
           If iTempFileName <> BazaWb.Name Then  
               With .Workbooks.Open _  
                    (Filename:=iPath & iTempFileName, UpdateLinks:=False, ReadOnly:=True)  
                    iNumFiles = iNumFiles + 1  
                    'Рабочая книга не должна быть защищена паролем  
                    With .Worksheets(1)  
                         iLastRowTempWb = .Cells(Rows.Count, 3).End(xlUp).Row  
                         iLastRowBaza = BazaSht.Cells(Rows.Count, 3).End(xlUp).Row + 1  
                         .Range(.Cells(3, 1), .Cells(iLastRowTempWb, "P")).Copy Destination:=BazaSht.Cells(iLastRowBaza, 1)  
                    End With  
                    .Close saveChanges:=False  
               End With  
           End If  
           iTempFileName = Dir  
       Loop  
       .Calculation = xlAutomatic  
       .DisplayAlerts = True  
       .ScreenUpdating = True  
   End With  
   MsgBox "Информация собрана из " & iNumFiles & " файлов!", vbInformation, "Конец"  
End Sub  
 
А как проверка на совпадение по двум ячейкам?
 
Да, что-то я чуть тупанул - тут ведь не по всем листам вероятно искать нужно, и не по всему листу - а только по двум столбцам ведь...  
Ну как вариант - сделать тот же find по кругу по столбцу D - если нашли, то проверяем ячейку в I, если и тут совпадение - то копируем.  
Или техничнее - раз уж файлы открыли, то ставим автофильтр по этим двум столбцам (он там уже даже есть) и копируем видимые без шапки (сперва проверяем их количество). Это если все файлы совершенно одинаковы по структуре.  
Но сейчас уже некогда -почти убегаю...
 
Сделал на автофильтре - добавил пару переменных  
Dim lr&, rr As Range  
чуть подправил строку  
 iLastRowBaza = BazaSht.Cells(Rows.Count, 4).End(xlUp).Row + 1 'тут заменил 3 на 4!!! - не работало!  
 
Добавленный блок кода выделил   '=======================  
Больше ничего не трогал :)
 
Чёрт, как всегда - точка потерялась (хотя и без неё работает, т.к. файл активный, но всёж нужно):  
 
lr = .Cells(1, 1).SpecialCells(xlLastCell).Row  
 
вот тут перед cells точку поставьте, как в примере :)
 
Hugo, спасибо, это действительно работает!  
Заменил на  .AutoFilter Field:=26, Criteria1:="<>"  
И теперь нахожу все не пустые ячейки за каждый день. Моей радости нет предела.
Страницы: 1
Наверх