Страницы: 1
RSS
Обращение к ячейкам в цикле по листам
 
Уважаемые форумчане, прошу подсказать каким образом возможно оптимизировать следующий алгоритм
Код
ThisWorkbook.Worksheets("Заполнение реализации ХВС").Select
For Each i In ThisWorkbook.Worksheets("Заполнение реализации ХВС").Range(Cells(2, 1), Cells(a, 1))
    If Worksheets("Заполнение реализации ХВС").Range("O" & i) <> "Без ВО" Then
    ThisWorkbook.Worksheets("Заполнение реализации ГВС").Select
        For Each y In Worksheets("Заполнение реализации ГВС").Range(Cells(1, 1), Cells(b, 1))
If i = y Then

Вопрос заключается в следующем, дальше по коду идут еще несколько алгоритмов отсеивающих лишние позиции из реестра. Если запускать алгоритм в таком виде, выполнение будет длиться годами. Во всех статьях по ускорению работы кода первым пунктом всегда идет совет, что нужно срочно убрать все селекты и переключения между страницами. Однако я ну никаким образом не могу найти иного решения для цикла фор ич, чтобы он брал данные с нужного листа без переключения на этот лист. Любые комбинации переменных выдают для i значение носинг, при переключении листа это всегда нужное значение. Молю подскажите существует ли способ производить данную операцию в фоновом режиме.
 
Кирилл Дяденко,
https://www.excel-vba.ru/chto-umeet-excel/kak-uskorit-i-optimizirovat-kod-vba/  
https://habr.com/ru/post/158725/

можно объявить переменную например
Код
DIm Лист as worksheet
Set Лист = ThisWorkbook.Worksheets("Заполнение реализации ХВС") 
и дальше ссылаться на него а не каждый раз его активировать или прописывать полное название
или использовать
Код
with ThisWorkbook.Worksheets("Заполнение реализации ХВС") 
код
end with
но почему вы указываете постоянно ThisWorkbook у вас макрос работает с разными книгами?

так же для ускорения в начале когда и такие же строки в конце только со значением true
Код
Application.Calculation = xlCalculationManual 'Выключить расчет. Внимание, если макрос прервался посреди работы, то расчет так и останется в ручном режиме!
    Application.EnableEvents = False 'Не обрабатывать события.
    ActiveSheet.DisplayPageBreaks = False 'Отображение границ страниц, тоже почему-то помогает.
    Application.DisplayAlerts = False 'Это если нужно. Выключает сообщения Экселя. Например, мы делаем Workbook.Close, Эксель хочет спросить сохранить ли изменения. При выключении этого параметра все ответы будут даны автоматически (изменения не сохранятся).
Изменено: Mershik - 29.05.2020 10:36:26
Не бойтесь совершенства. Вам его не достичь.
 
В том и дело, объявлял переменную и для листа и для диапазона, все равно выдает пустое значение. Понять не могу в чем проблема, только убираю селект, i = пусто, ставлю селект i = 3. По сути алгоритм просто пробегает первый столбец по номерам договоров, потом пробегает первый столбец другого листа по номерам договоров и сравнивает их. Книгу прописывал потому что пробовал разные варианты чтобы заработало.
За советы спасибо, аппликатион тоже подобавлял для ускорения
 
Rocksy Rocksyevich, ну  у нас нет ни файла ни рабочего макроса
Не бойтесь совершенства. Вам его не достичь.
 
Цитата
чтобы он брал данные с нужного листа
Используйте конструкцию
Код
With Worksheets("имя_нужного листа")
......
End With
 
Кидаю укороченный файл, модуль называется V_blok, буду очень благодарен если найдется решение.
Виз не получается поставить, потому что внутри цикла снова открывается цикл, который берет позиции уже из другого листа, т.е. энд виз надо ставить внутри первого цикла, а он не дает так сделать
 
Вот сейчас модеры проснутся, глаза протрут, и все сразу оптимизируют.
 
Цитата
Кирилл Дяденко написал:
For Each y In Worksheets("Заполнение реализации ГВС").Range(Cells(1, 1), Cells(b, 1))
вот это фигня. Есть предположение, что и далее по коду есть обращение к просто Cells, а не к ячейкам конкретного листа. Советую ознакомиться внимательно со статьями:
Как обратиться к диапазону из VBA
Select и Activate - зачем нужны и нужны ли?
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
 
Огромное спасибо, помог правильный синтаксис обращения к диапазону.  
 
Протер глаза )
Кто название темы предложит?
 
Предлагаю так: Обращение к ячейкам в цикле по листам
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
Страницы: 1
Наверх