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

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

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

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

14.08.2008 13:54:43
9 ОТВЕТОВ
РЕШЕНИЕ

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

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

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

118
28.08.2015 16:33:28
Спасибо, только что ударился головой об стол. Следует отметить, однако , что в Excel 2010, вам необходимо пройти Верная Application.Volatile, то есть Application.Volatile True.
mdm 31.03.2010 13:00:36
@MDM Спасибо за информацию о True! Это необходимо также для пользовательской функции листа в Excel 2013 !!
timbram 11.12.2015 18:28:40
это работает, когда я изменяю значение ячейки, но у меня есть функция, которая суммирует ячейки на основе цвета заливки, и это не обновляет функцию, когда я изменяю цвет заливки ячейки, я должен повторно ввести значение. можно ли обновлять лист в реальном времени при изменении цвета заливки?
Chris M 28.06.2016 00:25:00

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

16
21.04.2015 15:33:04
Это ваш единственный вариант, если у вас есть Excel 2007, видящий, как Application.Volatileметод был добавлен в Office 2010.
I say Reinstate Monica 12.03.2015 19:31:58

Еще немного информации о сочетаниях клавиш F9 для расчета в Excel

  • F9 Пересчитывает все рабочие таблицы во всех открытых рабочих книгах.
  • Shift+ F9 Пересчитывает активный лист
  • Ctrl+ Alt+ F9 Пересчитывает все рабочие таблицы во всех открытых рабочих книгах (полный перерасчет)
  • Shift+ Ctrl+ Alt+ F9Перестраивает дерево зависимостей и делает полный пересчет
37
21.07.2013 17:58:18

Если вы включите ВСЕ ссылки на данные электронной таблицы в список параметров 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
11
30.05.2019 00:45:08
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
0
22.10.2014 12:34:53
Пожалуйста, объясните код немного. Это значительно увеличило бы полезность.
Trilarion 22.10.2014 13:44:06
rng.Formula = rng.Formula - это то же самое, что войти в ячейку и снова нажать Enter. Это заставляет Excel снова вычислять ячейку - включая любые пользовательские функции.
Sam V 6.04.2016 01:35:30

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

Application.Calculation = xlCalculationAutomatic    

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

Application.Calculation = xlCalculationManual    
1
3.12.2014 19:22:59

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

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

1
21.11.2017 09:12:20

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

Private Sub Worksheet_Change(ByVal Target As Range)
  If Not Intersect(Target, Range("F3")) Is Nothing Then
    Application.CalculateFull
  End If
End Sub
1
13.09.2019 20:33:43