Поведение события Worksheet_Calculate в Excel - сохраненные события? - PullRequest
0 голосов
/ 11 мая 2011

и спасибо, что прочитали мой пост. Я столкнулся со странным (на мой взгляд) поведением события Worksheet_Calculate в Excel (Windows 7 Ultimate, Excel 2010), позвольте мне описать проблему, которую я имею, предоставив вам настройку.

Возьмите рабочую книгу с 2 листами. Ячейка листа 2 имеет формулу = Sheet1! A1, свойство EnableCalculation для Sheet2 установлено в TRUE, а в объекте Sheet2 есть Sub

Private Sub Worksheet_Calculate()
    i = MsgBox("Value " & Me.Range("A1").Value, vbOKOnly)
End Sub

В Module1 есть SUB

Public Sub mySub()
    Application.EnableEvents = False
    ThisWorkbook.Worksheets(2).EnableCalculation = True
    ThisWorkbook.Worksheets(2).EnableCalculation = False
    Application.EnableEvents = True
End Sub

Теперь введите 1 в ячейке Sheet1 A1 - появится окно с сообщением «Значение 1». Затем установите для свойства EnableCalculation Sheet2 значение FALSE и введите 2 в ячейку Sheet1 A1 - ничего не происходит. Теперь запустите mySub в модуле 1 - ячейка A1 на Sheet2 отображает 2, а свойство EnableCalculation для Sheet2 имеет значение FALSE. Все идет нормально. Теперь введите 3 в ячейке Sheet1 A1 - появится окно сообщения со значением «Value 2»

Может показаться, что во время выполнения mySub сработало событие Calculation (даже если для Application.EnableEvents было задано значение FALSE), а значение 2 было сохранено (где?), А затем это событие было сброшено при вводе 3 Ячейка A1 на Листе 1 (хотя для параметра EnableCalculation для Листа 2 установлено значение FALSE). Любая подсказка, что здесь происходит и как «исправить» это странное поведение?

Большое спасибо.

1 Ответ

0 голосов
/ 11 мая 2011

Цитата из http://www.decisionmodels.com

'Если для параметра enablecalculation установлено значение false, а затем значение true, все формулы на листе будут помечены как не рассчитанные.Если режим расчета - Автоматический, будет запущен пересчет.Все методы расчета, включая Sheet.Calculate, но исключая Range.Calculate, будут затем рассчитывать все формулы на листе.Вы можете использовать этот метод как способ моделирования Calculatefull на рабочем листе, а не на уровне рабочей книги.Обратите внимание, что Sheet.Calculate не будет сбрасывать флаги невычисленных формул, поэтому два переключателя Sheet.Calculate подряд после переключения свойства EnableCalculation выполнят полный расчет листа. '

Это, похоже, исправляет

Public Sub mySub()
    Application.EnableEvents = False
    Application.Calculation = xlCalculationManual
    ThisWorkbook.Worksheets(2).EnableCalculation = True
    ThisWorkbook.Worksheets(2).EnableCalculation = False
    Application.Calculation = xlCalculationAutomatic
    Application.EnableEvents = True
End Sub
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...