Страницы: 1
RSS
Отследить пересчет формул, добавить пять секунд и выполнить следующие строки кода, Vba
 
Здравствуйте!
Возможно ли отследить когда закончился пересчет формул?
Хотел бы заменить в коде паузу на отслеживание пересчета + 5сек(чтобы проц дух перевел) .
Код
Sub Макрос1()
    Range("A1:Z1000000").FormulaR1C1 = "=ROW()*2/2"
    Application.Wait (Now + TimeValue("0:00:20"))
    a = WorksheetFunction.Sum(Range("A:Z"))
    Columns("A:Z").Clear
    Range("A1") = a
End Sub
 
Может ТУТ
 
Msi2102, А как применить?
Просто добавить так?:
Код
    Range("A1:Z1000000").FormulaR1C1 = "=ROW()*2/2"
    DoEvents
    Application.Wait (Now + TimeValue("0:00:05"))
    
 
Цитата
Михаил Л написал:
Просто добавить так
По моему сработало.
Msi2102, Спасибо большое!
 
Михаил Л,
скорее так:
Код
Sub aaa()
Application.ScreenUpdating = False
Application.Calculation = xlCalculationManual
    Range("A1:Z1000000").FormulaR1C1 = "=ROW()*2/2"
    Calculate
    DoEvents
    a = WorksheetFunction.Sum(Range("A:Z"))
    Columns("A:Z").Clear
    Range("A1") = a
Application.Calculation = xlCalculationAutomatic
Application.ScreenUpdating = True
End Sub


но вообще конечно лучше не выводить весь этот большой расчет на лист, а сделать его прямо в макрос (времени займет точно меньше), но я предполагаю, что реальная задача чуть более сложная  :)
Изменено: evgeniygeo - 26.09.2022 09:40:19
 
Доброе утро!
а если отключить автоматический пересчет формул, вставить формулу, "Calculate", "Wait"...
Изменено: Настя_Nastya - 26.09.2022 09:35:35
 
если Application.CalculationState равно xlDone - все пересчитано
хотите чтобы процессор перевел дух - выключите компьютер
иначе он все время что-то считает (как минимум считает а не нужно-ли что-нибудь посчиать), процессор - это практически как кузнец - он не может не куя!
Изменено: Ігор Гончаренко - 26.09.2022 09:44:47
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете!
 
Цитата
evgeniygeo написал:
скорее так
Если так лучше, то так и буду делать. Ваш вариант, я так понимаю, не гоняет DoEvents впустую.

Настя_Nastya и Ігор Гончаренко, Спасибо!
Цитата
evgeniygeo написал:
предполагаю, что реальная задача чуть более сложная
Не так чтоб сложная. Там функцией ДРВ получаю данные из сторонней программы, а из-за скорости интернета делаю паузы по пол-минуты. Хочу не просиживать эти секунды)
 
Цитата
Ігор Гончаренко написал:
как минимум считает а не нужно-ли что-нибудь посчиать
В это время ядра проца не греются до критической температуры :)
 
Никак не въеду...
Пока формулы не вставятся, и не пересчитаются, макрос просто не перейдет к следующей строке кода. Перешел - значит пересчиталось.
 
Цитата
RAN написал:
Перешел - значит пересчиталось
Что? Серьезно? :)
Сейчас проверить не могу. Позже проверю
 
Цитата
Михаил Л написал:
Что? Серьезно?
и да и нет. Если и события не отключены и автопересчет стоит, то да. Если нет, то я б Application.Calculate поставил после заполнения формулами , это не повредит если летучести весомой нет и гарантирует что пересчет выполнится.
По вопросам из тем форума, личку не читаю.
 
Цитата
Михаил Л написал:
Что? Серьезно?
Легко проверить практически на Вашем примере из #1:
Код
Sub test()
   Columns("A:A").Clear
   Range("A2:A999999").Formula = "=A1+1"
   Debug.Print Range("A999999").Value
End Sub
Владимир
 
Цитата
Михаил Л написал:
Там функцией ДРВ получаю данные из сторонней программы
И эти данные меняются чуть ли не ежесекундно.
И скорее всего Excel намерено эти данные через DoEvents и др. не отлавливает.
Так что варианты не сработали
 
Михаил Л, попробуйте отключать многопоточность на время макросом. типо будут макросы и функции экселя в одном потоке, наверное, но не точно
Application.MultiThreadedCalculation.Enabled = False/True
Изменено: testuser - 27.09.2022 14:01:07
 
Михаил Л, В режиме обновления автоматическом отследить изменения ячейки с RTD можно попробовать сославшись на нее из другой ячейки с функцией.
ну а там уже от задачи все зависит. Проверить гипотезу не могу.
По вопросам из тем форума, личку не читаю.
 
Оставлю как есть.
Спасибо всем
 
Про функцию RTD написано здесь.
Владимир
Страницы: 1
Наверх