Страницы: 1
RSS
Ускорение расчета путем отказа от использования Select и расчет внутри макроса вместо расчета формулой
 
Добрый день!
Часто замечал комментарии опытных пользователей о том что Select лучше не использовать, а расчеты можно произвести внутри макроса и привычными формулами не пользоваться вообще. Решил прислушаться, изменить свой расчетный файл, столкнулся с проблемой значительного увеличения затрачиваемого на расчеты времени.
например,
в ячейке P4 прописана формула =ЕСЛИОШИБКА(ОКРУГЛ(СРЗНАЧЕСЛИ($C4:$O4;">0");1);0)
макросом данная формула растягивается на весь диапазон, делается расчет, формулы переводятся в значения (на 200 тысяч строк затрачивается 1 секунда)
Код
Sub aaa()
Range("P4").AutoFill Destination:=Range("P4").Resize(Range("A4").End(xlDown).Row - Range("P4").Row + 1) 'растянуть формулу
    Calculate 'пересчитать
      Range("P5").Select 'выбрать ячейку
        Range(Selection, Selection.End(xlDown)).Select 'выделить вниз
          Selection.Copy 'копировать
            Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
              :=False, Transpose:=False 'вставить только значения
End Sub

После замены макроса на
Код
Sub AA()
On Error Resume Next 'в случае ошибки продолжить
PosStr = Sheets("Доп").UsedRange.Rows.Count 'переменная - количество строк
For n = 5 To PosStr 'с какой по какую строку
  Sheets("Доп").Range("P" & n) = Round(Application.AverageIfs(Sheets("Доп").Range("C" & n & ":O" & n), Sheets("Доп").Range("C" & n & ":O" & n), ">0"), 1) 
Next
End Sub
время выполнения расчета точно тех же данных в том же объеме возросло до 43 секунд.

неудачно подобрано решение для выполнения расчета? его следует чем либо дополнить,  чтобы ускорить процесс?
Спасибо!
 
Здравствуйте От Select надо отказываться, но правильно. Вы переделали на цикл по всем ячейкам, поэтому плохо получилось. Попробуйте так
Код
Sub aaaвв()
Range("P4").AutoFill Destination:=Range("P4").Resize(Range("A4").End(xlDown).Row - Range("P4").Row + 1) 'растянуть формулу
    Calculate 'пересчитать
With Range(Range("P5"), Range("P5").End(xlDown))
.Copy        'выделить вниз
.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
              :=False, Transpose:=False 'вставить только значения
End With
End Sub
 
Евгений Смирнов, или даже так - для копирования значений (не портим буфер обмена):
Код
Sub aaaвв()

    Range("P4").AutoFill Destination:=Range("P4").Resize(Range("A4").End(xlDown).Row - Range("P4").Row + 1) 'растянуть формулу
    Calculate 'пересчитать

    Range(Range("P5"), Range("P5").End(xlDown)) = Range(Range("P5"), Range("P5").End(xlDown)).Value

End Sub
 
andypetr Зачем  вы сразу все секреты выкладываете. В одной теме по одному надо. :D  
 
Пардоньте! Я хотел как лучше, а получилось как всегда! :)
 
andypetr,
Цитата
написал:
Попробуйте так
время выполнения так же 1 секунда, спасибо
andypetr,
Цитата
написал:
или даже так
так же 1 секунда, но вариант выглядит привлекательнее, спасибо

вопрос отказа от Select решен, время выполнения сохранилось - 1 секунда. Но вот хотелось бы отказаться от использования формулы совсем, чтобы внутри макроса, если можно с той же скоростью
 
Файл-пример приложите
Согласие есть продукт при полном непротивлении сторон
 
Цитата
написал:
Но вот хотелось бы отказаться от использования формулы совсем, чтобы внутри макроса,
В  данном случае только замедлите все.
По вопросам из тем форума, личку не читаю.
 
Sanja,
Цитата
написал:
пример приложите

Прикладываю, в модуль добавил 2 предложенных выше варианта и 2 моих исходных
Размер файла превышен, только если урезанную версию...
Изменено: mitya528 - 08.05.2024 13:37:00
 
Цитата
БМВ: В  данном случае только замедлите все.
смотря, как. Если можно функцию заменить на вставку вычислений, когда нужно, то одни плюсы и, в том числе, выше скорость.
    Если же функцию листа хочется сохранить то нужно сильнее заморочиться — можно для каждого диапазона хранить вычисления в ОЗУ и обновлять только по необходимости, а на лист быстро тянуть только готовый результат. Как тут. Но будет тоже очень быстро и практически не будет грузить пересчёты других формул листа.
    В любом случае, это история про словарь и его аналоги.
Изменено: Jack Famous - 08.05.2024 15:05:53
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
Страницы: 1
Наверх