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

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

Пробовал F9и Shift+F9 .

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

Ответов (9)

Решение

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

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

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

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

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

Application.Calculation = xlCalculationAutomatic    

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

Application.Calculation = xlCalculationManual    
Public Sub UpdateMyFunctions()
    Dim myRange As Range
    Dim rng As Range

    'Considering The Functions are in Range A1:B10
    Set myRange = ActiveSheet.Range("A1:B10")

    For Each rng In myRange
        rng.Formula = rng.Formula
    Next
End Sub

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

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

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

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

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

Если вы включите ВСЕ ссылки на данные электронной таблицы в список параметров 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

Это обновляет расчет лучше, чем 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