Поскольку предоставленные ответы не полностью удовлетворяют меня, это мое собственное, заимствование из их благодарной помощи. Возможно, я пропустил какой-то нюанс от ответа Тейлина. Я с удовольствием отредактирую, если это будет актуально.
Невозможно обработать события изменений на уровне APPLICATION.
Таким образом, все изменения должны обрабатываться на уровне ЛИСТ.
Это может быть сделано путем копирования и вставки этот фрагмент кода в каждом листе объекта книги (и не забудьте скопировать и вставить его это всякий раз, когда вы добавляете новый лист):
Private Sub worksheet_change(ByVal Target As Range)
Me.Calculate
End Sub
Однако из-за нам нужно было сделать утомительную копию, которую мы должны были сделать, мы можем легко отключить эту функцию, не возвращаясь к каждому объекту листа.
Мы также можем не вводить петлю ада, если мы делаем массовое изменение на одном листе (скажем, через макрос, перетащить & drop или ctrl + H).
Для этого мы добавим новый лист под названием WS_refresh, где мы устанавливаем 3 значения:
- в A2: Да/Нет, чтобы включить/не отключить нашу новую функцию
- в A4: время последнего обновления
- в A6: мин интервала, чтобы обновления, в секундах (я поставил его в 1)
Теперь, когда мы изменяем значение в нескольких ячейках в коротком промежутке по времени, автообновление будет работать только на первом изменить, избегая предыдущих которые назывались петлями ада. Если вы хотите жить опасно устанавливать A6 0.
Это то, что должно быть скопировано и вставлено в каждом объекте листа:
Private Sub worksheet_change(ByVal Target As Range)
auto_refresh = ThisWorkbook.Worksheets("WS_refresh").Range("A2")
If auto_refresh = "Yes" Then
last_refresh = ThisWorkbook.Worksheets("WS_refresh").Range("A4")
refresh_interval_sec = ThisWorkbook.Worksheets("WS_refresh").Range("A6")
refresh_interval_tv = TimeValue("0:00:" & refresh_interval_sec)
If Application.Calculation = xlCalculationManual And Now() > last_refresh + refresh_interval_tv Then
ThisWorkbook.Worksheets("WS_refresh").Range("A4") = Now()
Me.Calculate
End If
End If
End Sub
Если вы не предоставите много, гораздо больше информации, мы можем только догадываться! Слишком много разных факторов, которые могут оказать влияние (автоматические ссылки, UDF, события на листах или изменениях, количество данных/листов/формул, неработающие ссылки в именованных диапазонах и т. Д.). Итак, если вы не обновите свой вопрос всеми возможными факторами, мы ничего не сможем сделать. Тем не менее, если вы обновляете свой вопрос со всеми возможными факторами воздействия, вы также можете проверить их и найти ошибку самостоятельно. – Ralph
@ Ralph, может быть, я не был достаточно ясен, я отредактировал свой вопрос. Я работаю над медленностью моего файла, но это не проблема. Хорошим быстрым решением было бы иметь этот набор авторесурсов, но только на уровне листа, вот что я спрашиваю здесь. –
Если вы хотите, чтобы Excel обновлял и вычислял все каждый раз, когда ячейка была изменена, вам просто нужно установить 'Application.Calculation = xlCalculationAutomatic', что эквивалентно входу в меню:' Формулы' -> 'Параметры расчета' - -> 'Автоматический'. Тем не менее, это значение по умолчанию для листов Excel в любом случае. В качестве альтернативы вы можете использовать событие «Worksheet_Change» и просто отбросить одну строку в этот подраздел 'ActiveSheet.Calculate'. – Ralph