1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 | Для того, чтобы управлять пересчётом пользовательской функции, можно воспользоваться вышеприведённым советом и создать следующий "шаблон" (см. ниже). Подобный подход, позволит Вам создать функцию, которая будет пересчитываемой (volatile) по умолчанию, т.к. значение необязательного аргумента Пересчёт, который и отвечает за метод пересчёта этой функции, равно True . Когда же надобность в подобном способе пересчёта отпадёт, Вам достаточно будет передать эту аргументу значение ЛОЖЬ или 0 . code: #vba Function Имя_функции(Аргумент 1 As Тип, Аргумент 2 As Тип, ..., Optional Пересчёт As Boolean = True ) As Тип Application . Volatile Пересчёт 'Здесь выполняются необходимые вычисления Имя_функции = Результат вычислений End Function Далее следует пример пользовательской функции, созданной на основании предложенного шаблона, а также примеры её вызова: Function NamesOfSheets(IndexWorkbook As Integer , Optional VolatileOn As Boolean = True ) As String Application . Volatile VolatileOn If Workbooks . Count >= IndexWorkbook Then Dim iSheet As Object For Each iSheet In Workbooks(IndexWorkbook).Sheets NamesOfSheets = NamesOfSheets & ";" & iSheet . Name Next NamesOfSheets = Mid(NamesOfSheets, 2 ) Else NamesOfSheets = "нет книги с указанным индексом" End If End Function =NamesOfSheets( 3 ) =NamesOfSheets( 3 ; 1 ) =NamesOfSheets( 3 ;ИСТИНА) =NamesOfSheets( 3 ;A1) Четыре примера вызова пересчитываемой функции. В последнем случае желательно, чтобы ячейка A1 содержала значение или формулу, возвращающую ИСТИНА или 1 =NamesOfSheets( 3 ; 0 ) =NamesOfSheets( 3 ;ЛОЖЬ) =NamesOfSheets( 3 ;A1) Три примера вызова не пересчитываемой функции. В последнем случае нужно, чтобы ячейка A1 содержала значение или формулу, возвращающую ЛОЖЬ или 0 (допускается также ссылка на пустую ячейку) =NamesOfSheets( 2 ;ДЕНЬНЕД(ТДАТА(); 2 )< 6 ) А этот пример демонстрирует как можно обойтись без дополнительной ячейки и дать "отдохнуть" UDF в выходные, т.е. в субботу и воскресенье. |