Вопрос

Кто-нибудь знает, как я могу заставить пользовательскую функцию переоценить себя (на основе измененных данных в электронной таблице)?я пробовал F9 и Сдвиг+F9, но они не работают.Единственное, что работает, — это редактирование ячейки с помощью вызова функции и последующее нажатие Enter.Есть идеи?Кажется, я помню, что мог это сделать...

Это было полезно?

Решение

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

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

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

Другие советы

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

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

Хорошо, нашел это сам.Вы можете использовать Ctrl+Альтернативный вариант+F9 чтобы добиться этого.

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

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

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

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

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

Application.Calculation = xlCalculationAutomatic    

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

Application.Calculation = xlCalculationManual    

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

Это обновляет расчет лучше, чем 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
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
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top