Пользовательские функции Excel VBA пересчитывают, что они не работают

У меня есть некоторые пользовательские функции в VBA, которые я хочу пересчитать с помощью стандартных кнопок Excel "Рассчитать сейчас" и "Рассчитать лист". Во всей книге для параметров расчета задано значение "вручную".

Когда я нажимаю кнопку «Рассчитать лист», все работает нормально. Я могу пересчитывать листы один за другим столько раз, сколько захочу.

Проблема возникает, если я нажимаю кнопку "Рассчитать сейчас". Вся книга пересчитывается, но дальнейший пересчет больше невозможен. Ни кнопкой "Рассчитать сейчас", ни "Рассчитать лист".

Я надеялся, что можно захватить событие "Рассчитать сейчас", перехватить его и вызвать для события "Рассчитать лист" отдельных листов. Или после функции Worksheet_Calculate() установить некоторые флаги для ячеек, чтобы зарегистрировать их для следующего пересчета.

Private Sub Worksheet_Calculate()
   ' Register all cells in sheet to next recalculation
End Sub 

Можно ли избавиться от этой проблемы? Я хочу использовать стандартные кнопки Excel для пересчета. но мне нужно, чтобы они работали каждый раз, когда я их нажимаю.


person Altair    schedule 19.11.2019    source источник
comment
вызывает ли он Worksheet_Calculate() во второй раз, когда вы нажимаете «Рассчитать сейчас»?   -  person Stanley    schedule 19.11.2019
comment
Нет. Только первый раз. Кажется, что второй пересчет сейчас или пересчет листа после пересчета сейчас не работает ни для одной ячейки. Мне нужно вычислить ячейку вручную, а затем кнопки пересчета снова работают, но только в одной текущей ячейке.   -  person Altair    schedule 19.11.2019
comment
Кажется, что кнопка «Рассчитать сейчас» как-то помечает ячейки, чтобы ячейки больше не вычислялись. Эта метка может быть сброшена путем ручного расчета ячеек, а затем, например, расширить ячейки. Эти ячейки могут быть вычислены снова. Но кнопка «Рассчитать сейчас» снова вызывает ошибку. :)   -  person Altair    schedule 19.11.2019
comment
что делает кнопка «Рассчитать сейчас»? Приложение.рассчитать?   -  person Stanley    schedule 19.11.2019
comment
Не решит ли изменчивость ваших пользовательских функций проблему, которую вы пытаетесь решить?   -  person CLR    schedule 19.11.2019
comment
@CLR Да!!! Летучий решил это. :) Спасибо большое.   -  person Altair    schedule 19.11.2019


Ответы (1)


Поведение «Вычислить сейчас» и «Вычислить лист» является преднамеренным. Потому что после «Рассчитать сейчас» все будет рассчитано. Без каких-либо изменений ничего не нужно вычислять заново. Но «Вычислить лист» вычисляет рабочий лист только на основе, возможно, некоторых устаревших данных. Так что в следующий раз он будет пересчитан.

Предлагаем вам использовать событие «Application.AfterCalculate». Он будет срабатывать после каждого «Рассчитать сейчас».

Надеюсь, что все это полезно.

person XuanZhouMSFT    schedule 22.11.2019
comment
Я использовал volatile UDF, это решило мою проблему, но спасибо. - person Altair; 22.11.2019