VBA Excel UDF с сохранением первоначального значения - PullRequest
2 голосов
/ 01 июня 2011

У меня есть энергонезависимая функция UDF в VBA, которая требует инициализации глобальной переменной (обратного вызова VSTO). Эта функция находится в xla или xlam (то же поведение)

Можно ли отменить расчет формулы, если переменная еще не доступна?

В режиме автоматического пересчета Excel (я не хочу его менять) Excel пересчитывает ячейки с моей функцией каждый раз, когда я открываю книгу, заменяя значение, сохраненное в ячейке, ошибкой: «#ARG!».

Я знаю, как вернуть пустую ячейку, если моя переменная не инициализирована, но возможно ли вернуть исходное значение? Я проверил с помощью отладчика, что он был сохранен в книге. Попытка вернуть Application.Caller.Value2 вызывает циклическую ссылку.

Кроме того, функция не вызывается (ожидаемое поведение), если код VBA встроен в рабочую книгу (xlsm) или если рабочая книга имеет формат xls. Однако преобразование рабочей книги в xlsx приводит к пересчету ячеек после открытия рабочей книги, как описано.

Ответы [ 2 ]

2 голосов
/ 01 июня 2011

Вы можете сделать это в XLM или C XLL, пометив функцию как макро функцию. В VBA единственный простой способ, которым я знаю, - это безобразный хак: вернуть Application.Caller.Text, если переменная не инициализирована. Это страдает основным недостатком, заключающимся в том, что он дает вам отформатированное значение ячейки, а не фактическое значение. В противном случае вы должны создать способ сохранения значения ячейки в закрытой, но сохраненной книге: возможные схемы включают использование определенных имен, комментариев к ячейке, реестра, внешних файлов и т. Д., Но я не думаю, что есть чистая VBA решение.

0 голосов
/ 11 ноября 2011

Я в конечном итоге пошел с подходом xlsm.

...