powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft Office [игнор отключен] [закрыт для гостей] / Excel: UDF - отмена и откладывание выполнения - как зайти?
1 сообщений из 1, страница 1 из 1
Excel: UDF - отмена и откладывание выполнения - как зайти?
    #34816331
Бабай
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
требуется без использования механизмов типа RTD или DDE написать xla-специального типа,
в которой кроме обычных пользовательских функций с нормальным в смысле правил пересчета
Excel поведением будут функции двух специальных типов:

1) с отклоняемым расчетом и 2) отложенным расчетом

функции 1-го типа должны иметь следующее поведение:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
Function SpecialFunction1(param)
   If  Not someFlag Then
      ' нормальный расчет, для которого и предназначена эта функция.
       SpecialFunction1=DoALotOfCalcuations(param)
   Else
      Select Case TypeName(Application.Caller)
        Case "Range" 
                If Это_Первое_вычисление_Для_Данной_клетки then
                  SpecialFunction1=CVErr(xlErrValue)  
                else
                   'значение клетки не должно измениться независимо от состояния входных 
                   'параметров, если пользовательский флаг запрещает пересчет.
                   SpecialFunction1=предыдущее(ранее_расчитанное)значение_вызывающей_клетки
                   
                   'прямое восстановление предыдущего значения путем повторного выполнения 
                   '   DoALotOfCalcuations(previouse_param_value) невозможно, т.к. 
                   '  внутри DoALotOfCalcuations происходит обращение к внешнему источнику данных
                   ' и нет способа привести эту внешнюю информацию к моменту предыдущего         
                   'вычисления.
                endif  
        Case Else
            'Do Nothing
      End Select

End Function

Конечному пользователю и скриптам его рабочих книг полностью доступны ctrl-alt-f9 и application.calculateFull

Возможно ли в принципе создание функций типа 1 без параллельного ведения потенциально обширных (и, вероятно бесполезных, ввиду возможности пересчета при старте пользовательской книги) списков "предыдущих значений" в недрах надстройки?
------------------
Логика работы функций второго типа заключается в том, что они не должны возвращать
осмысленных значений, пока не закончится длинный DoALotOfCalcuations, в результате которого вернутся значения сразу для большого числа клеток. Но не должен задерживаться и excel с завершением пересчета.

Эта логика укладывается в такой псевдокод
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
'A)
Function SpecialFunction2(param)
  If XLA_Has_Fresh_PreCalulation Then
      SpecialFunction2= GetPreparedValue(param)
  Else 
      RegisterCellWaitedForValue  param, Application.Caller,Application.Caller.Parent
      SpecialFunction2=CVErr(xlErrValue)  
  Endif
End Function
'B) 
Private Sub Worksheet_Calculate()
Application.OnTime Now + TimeValue(smallTime), "DoALotOfCalculationOnRegisterdParams"
End Sub

'C)
Sub  DoALotOfCalculationOnRegisterdParams
.....
.....
.....
   XLA_Has_Fresh_PreCalulation=True
  'запуск процедуры перевычисления
  Application.CalculateFullRebuild
End Sub

Слабое место пункт B) - Excel может оказаться в режиме запрета событий и запуска процедуры расчета не произойдет.
перенос назначения запуска расчета в SpecialFunction2 потребует дополнительного флага - расчет назначен.

Кроме того, поскольку для определения момента завершения пересчета листа внутри
SpecialFunction2 нет информации, то в таком случае не вполне ясно - как выбирать smallTime
и какова вероятность пропуска для запуска "большого расчета".

Есть ли решение для задачи1 и как может быть улучшена реализация задачи2 ?

автор
...
Рейтинг: 0 / 0
1 сообщений из 1, страница 1 из 1
Форумы / Microsoft Office [игнор отключен] [закрыт для гостей] / Excel: UDF - отмена и откладывание выполнения - как зайти?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]