Как заставить определяемую пользователем функцию переоценивать себя на основе измененных данных в электронной таблице?
Я пробовал F9 и Shift+F9.
Единственное, что, похоже, работает, это редактирование ячейки с вызовом функции и последующее нажатие Enter.
Вы должны использовать Application.Volatile
в верхней части вашей функции:
Function doubleMe(d)
Application.Volatile
doubleMe = d * 2
End Function
Тогда она будет переоцениваться каждый раз, когда рабочая книга изменяется (если ваш расчет установлен на автоматический).
Дополнительная информация о сочетаниях клавиш F9 для вычислений в Excel
Хорошо, нашел это сам. Для этого можно использовать Ctrl+Alt+F9.
Если Вы будете включать ВСЕ ссылки на данные об электронной таблице в списке параметров UDF, Excel повторно вычислит Вашу функцию каждый раз, когда справочные данные изменяются:
Public Function doubleMe(d As Variant)
doubleMe = d * 2
End Function
Вы можете также использовать 'Применение. Изменчивый', но у этого есть недостаток того, чтобы заставлять Ваш UDF всегда повторно вычислить - даже когда этому не нужно к тому, потому что справочные данные не изменились.
Public Function doubleMe()
Application.Volatile
doubleMe = Worksheets("Fred").Range("A1") * 2
End Function
Я нашел, что он лучше всего только обновил вычисление, когда определенная клетка изменена. Вот является пример кодексом VBA, чтобы поместить в " Worksheet" " Change" событие:
Private Sub Worksheet_Change(ByVal Target As Range)
If Not Intersect(Target, Range("F3")) Is Nothing Then
Application.CalculateFull
End If
End Sub
Это освежает вычисление лучше, чем 'Диапазон (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
'Применение. Изменчивый' doesn' t работают на перевычисление формулы с моей собственной функцией внутри. Я использую следующую функцию: 'Применение. CalculateFull'
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