Задача проста. На одном листе отыскать строки с первой ячейкой, равной "Док", на другом листе отыскать строку с ячейкой 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
....