я использую Excel C / C ++ SDK > = 2007 (я поставил ссылку на 2007 год для справки) и excel> = 2007. Я закодировал (с SDK) XLL что обеспечивает превосходство функции F, и эта функция F может быть вызвана двумя способами в листе Excel: 1) написать непосредственно формулу с участием F в ячейке Excel / диапазоне ячеек или в строке формул 2) записывать =F
в ячейке Excel и нажмите на значок FX слева от строки формул и используйте мастер функций Excel.
Меня интересует только второй случай. В этом случае открывается диалоговое окно мастера функций Excel: окна с n ячейками, каждое из которых соответствует одному аргументу F (при условии, что F — функция, принимающая n аргументов). Теперь, по умолчанию, вы вводите что-то в одну из ячеек Excel и запускаете пересчет функции.
Это особенно удобно, когда вы не знаете функцию и хотите «обнаружить» ее, потому что вы можете видеть, представляет ли введенный вами текст правильный аргумент для F и т. Д., Например, появляются ли ошибки и т. Д.
Но если F опирается на очень интенсивную числовую процедуру (на с ++), то все пересчеты занимают слишком много времени и замораживают мастера. (Потому что каждый раз, когда ячейка в диалоговом окне изменяется, пересчет происходит по триггеру.)
Поэтому я хотел бы сделать следующее: как-то деактивировать пересчет, когда функция «вызывается» через мастер функций. Это, скажем, решение низкого качества.
В идеале я хотел бы сделать следующее: авторизовать пересчеты, которые должны быть запущены, но убедиться (в коде c ++ excel sdk), что они выполняются в другом «потоке», чем тот, в котором вызывается мастер. Чтобы больше не было замерзания. (Чтобы можно было сохранить удобную часть мастера.) Видимо, если я понимаю эта статья MSDN правильно (возможно, нет, если это не та же проблема), это невозможно в Excel 2007, но в Excel> = 2010.
Поскольку пользователи F используют различные версии Excel — в основном 2007, но даже 2003 года — для некоторых из них — даже если у меня есть соблазн подтолкнуть к переходу в 2010 (да ладно, мы ведь уже в 2013 году в реальной жизни! ), Я не буду этого делать по упомянутой причине, а также потому, что мне не нравится, когда что-то работает только для некоторых версий Excel …
Поэтому я хотел бы найти другое решение. Я слышал, что люди говорят об RTD для этого, но я не уверен.
Вот почему любые идеи приветствуются! Огромное спасибо заранее. (И извините за длину вопроса.)
Видеть это Статья MSDN который обсуждает метод, который будет использоваться, с примерами C ++
Это метод, используемый фреймворками, такими как XLDNA и XLL Plus (и я думаю, что также Addin Express).
Я не думаю, что использование асинхронной подписи UDF помогло бы, потому что мастер функций использует метод Evaluate под прикрытием, а не фактический пересчет (но я не пробовал его на практике)
Обходной путь должен был бы проверить, являются ли параметры отсутствует или же ноль в начале вашей маршрутизации и только рассчитать, если все параметры установлены. Я знаю, что это не помешает пересчету каждый раз, когда пользователь открывает диалоговое окно и изменяет некоторые значения, но по крайней мере это предотвратит пересчет, пока пользователь не установит все параметры.
Вы можете добавить дополнительный параметр (например, триггер) и проверить, установлено ли для параметра определенное значение (например, 1), перед вычислением.