Обновить результаты функции Excel VBA

Как я могу заставить определяемую пользователем функцию переоценивать себя на основе измененных данных в электронной таблице?

Я попробовал F9 и Shift + F9.

Единственное, что кажется работающим, - это редактирование ячейки с помощью вызова функции и последующее нажатие Enter.


person Brian Sullivan    schedule 14.08.2008    source источник


Ответы (9)


Вы должны использовать Application.Volatile в верхней части своей функции:

Function doubleMe(d)
    Application.Volatile
    doubleMe = d * 2
End Function

Затем он будет переоценивать каждый раз, когда книга изменяется (если ваш расчет установлен на автоматический).

person vzczc    schedule 15.08.2008
comment
Спасибо, только что бился головой о стол из-за этого. Следует отметить, что в Excel 2010 вам необходимо передать True в Application.Volatile, то есть Application.Volatile True. - person mdm; 31.03.2010
comment
@mdm Спасибо за информацию по Истине !! Это необходимо также для функции настраиваемого рабочего листа в Excel 2013 !! - person timbram; 11.12.2015
comment
это работает, когда я меняю значение ячейки, но у меня есть функция, которая суммирует ячейки на основе цвета заливки, и это не обновляет функцию, когда я меняю цвет заливки ячейки, мне нужно повторно ввести значение. можно ли обновлять рабочий лист в реальном времени при изменении цвета заливки? - person Chris L; 28.06.2016
comment
@ChrisL Вы нашли решение для своего варианта использования с расчетом на основе цвета заливки? Оцените ваше решение. - person smartini; 30.05.2020
comment
@smartini Я никогда не продолжал искать решение. Я недостаточно часто использовал функцию цвета заливки, чтобы это имело значение. Я надеялся получить быстрый ответ на свой комментарий 4 года назад, но так и не получил. Может быть, лучше начать новый вопрос. Если да, напишите мне комментарий, чтобы я мог следить за ним. - person Chris L; 30.05.2020

Дополнительная информация о сочетаниях клавиш F9 для вычислений в Excel

  • F9 Пересчитывает все листы во всех открытых книгах.
  • Shift + F9 Пересчитывает активный рабочий лист.
  • Ctrl + Alt + F9 Пересчитывает все рабочие листы во всех открытых книгах (Полный пересчет)
  • Shift + Ctrl + Alt + F9 Перестраивает дерево зависимостей и выполняет полный пересчет
person Robert Mearns    schedule 07.09.2008

Ладно, нашел сам. Для этого вы можете использовать Ctrl + Alt + F9.

person Brian Sullivan    schedule 14.08.2008
comment
Это ваш единственный вариант, если у вас есть Excel 2007, поскольку метод Application.Volatile был добавлен в Office 2010. - person I say Reinstate Monica; 12.03.2015

Если вы включите ВСЕ ссылки на данные электронной таблицы в список параметров UDF, Excel будет пересчитывать вашу функцию при изменении данных, на которые ссылаются:

Public Function doubleMe(d As Variant)
    doubleMe = d * 2
End Function

Вы также можете использовать Application.Volatile, но это имеет недостаток, заключающийся в том, что ваш UDF всегда пересчитывается - даже если в этом нет необходимости, потому что данные, на которые имеются ссылки, не изменились.

Public Function doubleMe()
    Application.Volatile
    doubleMe = Worksheets("Fred").Range("A1") * 2
End Function
person Community    schedule 23.09.2008

Чтобы переключиться на автоматический:

Application.Calculation = xlCalculationAutomatic    

Чтобы переключиться на ручной режим:

Application.Calculation = xlCalculationManual    
person ayman    schedule 03.12.2014

Application.Volatile не работает для пересчета формулы с моей собственной функцией внутри. Я использую следующую функцию: Application.CalculateFull

person alex303411    schedule 21.11.2017

Это обновляет расчет лучше, чем Range(A:B).Calculate:

Public Sub UpdateMyFunctions()
    Dim myRange As Range
    Dim rng As Range

    ' Assume the functions are in this range A1:B10.
    Set myRange = ActiveSheet.Range("A1:B10")

    For Each rng In myRange
        rng.Formula = rng.Formula
    Next
End Sub
person MfJ    schedule 10.06.2015

Я считаю, что лучше обновлять расчет только при изменении конкретной ячейки. Вот пример кода VBA для размещения в событии «Изменение» рабочего листа:

Private Sub Worksheet_Change(ByVal Target As Range)
  If Not Intersect(Target, Range("F3")) Is Nothing Then
    Application.CalculateFull
  End If
End Sub
person Gene Sorg    schedule 13.09.2019

person    schedule
comment
Пожалуйста, объясните немного код. Это значительно увеличило бы полезность. - person Trilarion; 22.10.2014
comment
rng.Formula = rng.Formula - это то же самое, что ввести ячейку и снова нажать клавишу ВВОД. Это заставляет Excel снова вычислить ячейку, включая любые пользовательские функции. - person Sam V; 06.04.2016