Страница 1 из 2
Как найти определенную строку.
Добавлено: 11 окт 2006, 11:19
namomelkor
Вот такая проблема:
Есть строка на определенном листе (строка в смысле экселевская (Row))
допустим row=1 т.е первая строка на листе.
как ее можно найти на другом листе.
количество столбцов в строке неизвестно.
Добавлено: 11 окт 2006, 12:00
Игорь Акопян
тупо искать поячеечно... нашёл первую, смотришь дальше, не совпадает, опять с первой
Добавлено: 11 окт 2006, 12:08
namomelkor
Тупо нельзя (или можно сказать не желательно). Данных много.
Как это сделать с помощью .UsedRange.Find если это возможно
Добавлено: 11 окт 2006, 13:20
Sokl
Есть несколько вариантов:
1. Использовать список (на "другом" листе сделать список, отфильтровать по критериям "определенного" листа и посмотреть, что осталось)
2. СЦЕПИТЬ все ячейки на одном и другом листах и поиск вести по ним
3. ...
Добавлено: 11 окт 2006, 16:39
Aent
А что если в момент формирования вашего листа считать в отдельной колонке некую хэш функцию. Например CRC32 по строке,
представляюшей собой сцепленное строковое представление всех ячеек вашей строки? То же делаем для каждого листа при
его изменении. Будут некоторые затраты времени на вычисление значения хэш функции, зато поиск будет очень быстрым.
Делал подобное с базой накладных около 50000. Поиск работал очень быстро ...
Добавлено: 11 окт 2006, 16:44
namomelkor
Aent,
Спасибо это уже кое что. Буду думать.
Есть у кого-то еще какие-нибудь идеи?
Добавлено: 12 окт 2006, 06:36
Sokl
Aent, а обычный поиск Экселя медленнее?
Добавлено: 12 окт 2006, 18:31
Aent
Sokl, а как обычным поиском искать сразу по 10 колонкам ? А если просто сцеплять все требуемые ячейки строки, то во первых
файл пухнен ощутимо сильнее, а во вторых поиск при большом количестве строк существенно медленее. И автофильтр по всем колонкам,
если ты его имел в виду, то же медленее. Cпециально правда не мерял - говорю об ощущениях "на глаз".
Добавлено: 12 окт 2006, 21:35
Genyaa
Попробуйте это (решение через автофильтр):
Код: Выделить всё
Sub FindRows()
'процедура выберет все строки в листе 2, совпадающие по значениям с текущей строкой в листе 1
'первая строка листа 2 - должны быть заголовки таблицы - не обрабатываются
'всегда проверяются все поля листа 2, даже если в строке листа 1 другое количество колонок.
Dim cc As Range
If Not Sheets(2).AutoFilterMode Then Sheets(2).UsedRange.Columns.EntireColumn.AutoFilter
For Each cc In Selection.Cells(1, 1).Resize(1, Sheets(2).AutoFilter.Range.Columns.Count)
Sheets(2).Cells(1, 1).AutoFilter Field:=cc.Column, Criteria1:=cc.Value
Next
i = WorksheetFunction.Subtotal(3, Sheets(2).UsedRange.Columns(1)) - 1
MsgBox "Найдено: " & i & " строк"
If i > 0 Then Sheets(2).Activate
End Sub
Добавлено: 12 окт 2006, 22:55
Aent
Genyaa, так автофильтр мы уже обсуждали ....