Обновить результаты функции Excel VBA - PullRequest
65 голосов
/ 14 августа 2008

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

Ответы [ 8 ]

112 голосов
/ 15 августа 2008

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

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

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

35 голосов
/ 07 сентября 2008

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

  • F9 Пересчитывает все рабочие таблицы во всех открытых рабочих книгах
  • Сдвиг + F9 Пересчитывает активную рабочую таблицу
  • Ctrl + Alt + F9 Пересчитывает все рабочие таблицы во всех открытых рабочих книгах (полный пересчет)
  • Shift + Ctrl + Alt + F9 Перестройка дерева зависимостей и полный пересчет
14 голосов
/ 14 августа 2008

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

11 голосов
/ 23 сентября 2008

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

Для переключения на автоматический:

Application.Calculation = xlCalculationAutomatic    

Для переключения на ручной режим:

Application.Calculation = xlCalculationManual    
1 голос
/ 21 ноября 2017

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

1 голос
/ 10 июня 2015

Это обновляет расчет лучше, чем 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
0 голосов
/ 22 октября 2014
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
...