VBA Excel UDF, сохраняющий исходное значение

#vba #excel #vsto #user-defined-functions

#vba #excel #vsto #определяемые пользователем функции

Вопрос:

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

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

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

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

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

Ответ №1:

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

Ответ №2:

В конечном итоге я выбрал подход xlsm.