Как бы вы написать Excel UDF, который рассчитывается вручную, независимо от режима расчета? - PullRequest
2 голосов
/ 05 января 2012

В настоящее время у меня есть макрос, который использует форму для выполнения некоторых вычислений с помощью внешней программы. Все, что он делает, это записывает некоторые значения листа в файл для использования другой программой, внешним .exe, в качестве входных данных (эта программа с закрытым исходным кодом). Затем указанная программа записывает вывод в произвольном формате, я удаляю его с помощью VBA и затем возвращаю результат обратно на лист. Макрос вызывается через пользовательскую форму, где указываются исходный и целевой диапазоны.

То, что я пытаюсь сделать, это заменить метод вызова вычислений через пользовательскую форму на UDF. При использовании метода GUI обновление вычислений становится громоздким; также невозможно узнать, какие вычисления были выполнены в данных диапазона назначения. Этот путь был выбран вместо UDF из-за проблем с производительностью. Поскольку вычисления довольно медленные, я не могу просто повторно использовать часть кода пользовательской формы, которая вызывает внешнюю программу как UDF, и покончить с этим , поскольку это будет слишком медленно . Кажется, в VBA нет асинхронного выполнения (в отличие от xll в Excel 2010).

Возможным решением было бы выйти из UDF, как только он начнет выполняться, если для global не установлено значение true. Это глобальное значение всегда будет ложным, если только вызов не вызывается с определенной кнопки ленты. Проблема в том, что он постоянно выполняет UDF, отправляя эти диапазоны в значения # N / A все время, поэтому я не могу ссылаться на эти диапазоны. Другой способ заключается в создании поддельных формул, т. Е. Комментария к ячейке, в котором указаны параметры и диапазон назначения. Это тоже имеет много проблем.

Итак. Любая идея о том, как реализовать фальшиво-асинхронный расчет UDF?

Спасибо!

1 Ответ

2 голосов
/ 06 января 2012

Если я вас правильно понимаю, вы хотите иметь UBA VBA, которая возвращает значение из предыдущего вычисления, если глобальное значение равно false, в противном случае выполните полный медленный расчет.
Существует несколько различных подходов к этому, которые все имеют разные недостатки:

  • используйте application.caller.value. Это вызовет циклическую ссылку и потребует, чтобы вы включили итеративный расчет
  • используйте application.caller.text. Это просто и работает без итерационных вычислений, но получает отформатированное значение, поэтому вы должны быть уверены, что ваш UDF не потеряет точность и т. Д.
  • при выходе из udf сохраняет значение в глобальном массиве , проиндексированном полный адрес вызывающей ячейки и при вводе udf получить его. Это будет не сохраняется в сохраненной книге, если вы не сохраните глобальный массив где-нибудь при сохранении / закрытии и восстановлении при открытии.
  • Запишите XLL или XLM макроэквивалентную UDF, которая извлекает предыдущее значение
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...