Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: Метод Find внутри другого Find  (Прочитано 7729 раз)
0 Пользователей и 1 Гость смотрят эту тему.
cowboy
Гость
« : 11-11-2005 07:17 » 

Задача проста. На одном листе отыскать строки с первой ячейкой, равной "Док", на другом листе отыскать строку с ячейкой N равной ячейке N первого листа. Если есть разница, то в третьем (сначала чистом) листе записать инфу о ней (номера строк первого и второго листов, значения). Строк в листах около 30 тыс. и простой перебор по for i=1 to lastcell.row по обоим листам требует много времени. А будут пары листов и на 60 тыс. строк в каждом. Решил применить метод find, но ...
Запусив в цикле один find, с удивлением обнаружил, что findnext из внешнего цикла ищет то, что было последний раз задано find'ом внутреннего.   Так больше нельзя...
Если это особенность VBA, смирюсь Жаль и реализую с просмотром по for.  Ниже код, который пользовал (написан на основе из help по find методу) . Может в нем принципиальная ошибка?

dim l,b,x as worksheets  'назначены заранее
' lr(x as worksheet) as integer  функция, возращающая последнюю строку листа х (сам писал)
...
With l.Range("a1:a30000")                                'в диапазоне листа l
    Set e = .Find("Док=", , xlValues)                    'ищем первое вхождение "Док="
    If Not e Is Nothing Then                               ' нашли?
        firstAddress = e.Address                           '  да. получаем диапазон (ячейку)
        Do                                                        '   циклимся, чтобы найти все "Док="
            With b.Range("ax1:ax30000")                  '  в диапазоне листа b
                Set c = .Find(l.cells(e.row,50))              'ищем строку со значением равным                                   
                                                                            'ячейке 50 найденной в l строки
                If Not c Is Nothing Then                       'надено?
                        If l.Cells(e.Row, 3) <> b.Cells(c.Row, 3) Then  'да. проверяем суммы
                            br = lr(x) + 1                                           'не равны. определяем последнюю строку листа результатов х
                            x.Cells(br, 1) = "суммы не совпадают"             'выводим инфу
                            x.Cells(br, 2) = "Лок. док №" + l.Cells(e.Row, 3).Text
                            x.Cells(br, 3) = "Sum " + l.Cells(e.Row, 3).Text
                            x.Cells(br, 4) = "Office. док №" + b.Cells(e.Row, 3).Text
                            x.Cells(br, 5) = "Sum " + b.Cells(e.Row, 3).Text
                        End If
                     Else                                                                    'не надено
                        x.Cells(lr(x) + 1, 1) = "Док №"+l.Cells(e.Row, 2).Text+" не найден"
                End If
            End With                                                           '  второй лист просмотрен
            Set e = .FindNext(e)                                          ' продолжаем поиск на первом
                                                                  ' здесь то и затык, e=nothing
        Loop While Not e Is Nothing And e.Address <> firstAddress                    'весь лист l просмотрен?
    End If
End With
....
« Последнее редактирование: 15-12-2007 17:57 от Алексей1153++ » Записан
HandKot
Молодой специалист

ru
Offline Offline

« Ответ #1 : 16-11-2005 07:01 » 

Можно попробовать сделать с помощью запроса
вот на чем я отработал запрос и сам запрос (не забудь в нем только пути подправить)

Если что, задавай вопросы, попробую ответить

* Соответствие данных.dqy (0.3 Кб - загружено 1146 раз.)
* TestQuery1.xls (27 Кб - загружено 1220 раз.)
Записан

I Have Nine Lives You Have One Only
THINK!
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines