Как найти определенную строку.

Весь MS Office, программирование на Visual Basic for Applications и MS VB

Модератор: Naeel Maqsudov

namomelkor
Сообщения: 230
Зарегистрирован: 31 авг 2006, 13:11

Вот такая проблема:
Есть строка на определенном листе (строка в смысле экселевская (Row))
допустим row=1 т.е первая строка на листе.
как ее можно найти на другом листе.
количество столбцов в строке неизвестно.
Аватара пользователя
Игорь Акопян
Сообщения: 1440
Зарегистрирован: 13 окт 2004, 17:11
Откуда: СПБ
Контактная информация:

тупо искать поячеечно... нашёл первую, смотришь дальше, не совпадает, опять с первой
Изображение
namomelkor
Сообщения: 230
Зарегистрирован: 31 авг 2006, 13:11

Тупо нельзя (или можно сказать не желательно). Данных много.
Как это сделать с помощью .UsedRange.Find если это возможно
Sokl
Сообщения: 451
Зарегистрирован: 12 сен 2005, 08:52
Откуда: ОМ

Есть несколько вариантов:
1. Использовать список (на "другом" листе сделать список, отфильтровать по критериям "определенного" листа и посмотреть, что осталось)
2. СЦЕПИТЬ все ячейки на одном и другом листах и поиск вести по ним
3. ...
Аватара пользователя
Aent
Сообщения: 1129
Зарегистрирован: 01 окт 2006, 14:52
Откуда: Saratov,Russia
Контактная информация:

А что если в момент формирования вашего листа считать в отдельной колонке некую хэш функцию. Например CRC32 по строке,
представляюшей собой сцепленное строковое представление всех ячеек вашей строки? То же делаем для каждого листа при
его изменении. Будут некоторые затраты времени на вычисление значения хэш функции, зато поиск будет очень быстрым.
Делал подобное с базой накладных около 50000. Поиск работал очень быстро ...
Андрей Энтелис,
aentelis.livejournal.com
namomelkor
Сообщения: 230
Зарегистрирован: 31 авг 2006, 13:11

Aent,
Спасибо это уже кое что. Буду думать.


Есть у кого-то еще какие-нибудь идеи?
Sokl
Сообщения: 451
Зарегистрирован: 12 сен 2005, 08:52
Откуда: ОМ

Aent, а обычный поиск Экселя медленнее?
Аватара пользователя
Aent
Сообщения: 1129
Зарегистрирован: 01 окт 2006, 14:52
Откуда: Saratov,Russia
Контактная информация:

Sokl, а как обычным поиском искать сразу по 10 колонкам ? А если просто сцеплять все требуемые ячейки строки, то во первых
файл пухнен ощутимо сильнее, а во вторых поиск при большом количестве строк существенно медленее. И автофильтр по всем колонкам,
если ты его имел в виду, то же медленее. Cпециально правда не мерял - говорю об ощущениях "на глаз".
Андрей Энтелис,
aentelis.livejournal.com
Genyaa
Сообщения: 310
Зарегистрирован: 11 окт 2006, 17:24
Откуда: Moscow
Контактная информация:

Попробуйте это (решение через автофильтр):

Код: Выделить всё

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
Всякое решение плодит новые проблемы.
Аватара пользователя
Aent
Сообщения: 1129
Зарегистрирован: 01 окт 2006, 14:52
Откуда: Saratov,Russia
Контактная информация:

Genyaa, так автофильтр мы уже обсуждали ....
Андрей Энтелис,
aentelis.livejournal.com
Ответить