Как сделать функцию Excel, которая включает паузу, не останавливая Excel

У меня есть «проект» Excel, который включает в себя .dll, где я написал некоторые сложные статистические вычисления, вызываемые через VBA. Я сделал это из соображений скорости. Вычисления занимают около секунды каждый. Поскольку они вызываются через VBA, Excel останавливается на время вычислений, и это приемлемо. (Выбор Excel не мой, а результат того, как третья сторона выбрала способ доставки данных)

Но для проекта мне нужно, чтобы результаты расчетов появлялись не через одну секунду, а через десять. Я мог либо расширить расчеты для большей точности, либо просто включить паузу в код. Но поскольку это делается через VBA, весь проект останавливается на все десять секунд, а это неприемлемо.

Я изучил ExcelDNA, так как он полностью избегает VBA и может позволить делать ВСЕ, что делается через VBA с ExcelDNA или существующими встроенными функциями. Я изменил этот пример для тестирования:

https://grumpyop.wordpress.com/2009/11/25/a-Third-way-dna/

и включил простой Thread.Sleep(10000); к коду для имитации паузы. Но это ТАКЖЕ останавливает Excel на время расчета.

Есть ли способ включить паузу в функциях, которая не заставляет Excel ждать результата, но когда результат «вталкивается» в ячейку/ячейка «подписывается» на результат? Можно ли это сделать через ExcelDNA, XLL или через третье решение? Я бы предпочел решение, в котором я могу использовать C или слегка модифицированный C, поскольку все статистические функции написаны на C.


person blagstar    schedule 20.04.2015    source источник
comment
Обычный способ, если бы Excel был похож на структуру пользовательского интерфейса, состоял бы в том, чтобы переместить работу в рабочий поток (например, через ThreadPool.QueueUserWorkItem, Task.Factory.StartNew, Task.Run) и вернуться к исходному потоку, когда вы закончите (например, используя некоторые synchronizationContext.Post). Этот подход может сработать, если ExcelDNA настроит подходящий SynchronizationContext (но я подозреваю, что это не сработает, поскольку Excel не является фреймворком пользовательского интерфейса).   -  person stakx - no longer contributing    schedule 20.04.2015
comment
Вероятно, ответ в этом ТАК вопрос или this поможет вам (добавив несколько секунд к Application.OnTime аргументам)   -  person PatricK    schedule 20.04.2015
comment
Может быть, использовать метод WAIT? stackoverflow.com/ вопросы/1544526/   -  person Shauno_88    schedule 20.04.2015


Ответы (1)


Вам нужно сделать вашу функцию асинхронной.

Excel поддерживает это из Excel 2010. https://msdn.microsoft.com/en-us/library/office/ff796219%28v=office.14%29.aspx

ExceDNA также поддерживает асинхронные функции https://exceldna.codeplex.com/wikipage?title=Asynchronous%20Functions

Но вы не можете использовать UDF VBA для асинхронного вызова внешнего ресурса: UDF должен быть XLL.

person Charles Williams    schedule 20.04.2015