Я не уверен, как код VBA переводится в c # для Excel, поэтому я попытаюсь дать подробное объяснение / пример.
В VBA есть два основных способа передачиссылка для ячейки Excel (или диапазона) на UDF.
Использование строкового параметра (т.е. Data(name as String)
)
Использование диапазонаПараметр объекта (т. Е. Data(name as Range)
или в более широком смысле Data(name as Object)
)
При использовании строкового параметра к значению диапазона в коде обычно обращаются через Worksheet("Name").Range("String Param")).Value
.Когда используется параметр объекта, код обычно выглядит так: RangeParam.Value
.
Бывают также случаи, когда диапазон жестко закодирован или косвенно указан в UDF.Я бы избегал этого;особенно если этот диапазон содержит формулу.
Когда Excel выполняет вычисления, он выполняет несколько шагов.
- Инициирует вычисления в каждой ячейке для определения параметров диапазона.(Используется для определения зависимостей.)
- Создайте дерево зависимостей с правильным порядком вычислений.
- Выполните окончательные вычисления в определенном порядке.
Из этого следует понимать следующие важные вещи:
- Если на диапазон ссылается через строковый параметр, Excel может не понимать зависимость.
- Если на диапазон ссылаются в расчете,но жестко закодированный, косвенно связанный или иным образом не переданный в качестве параметра, Excel не поймет зависимости.
- Если UDF получит отличающиеся результаты в зависимости от количества раз, которое он запускает, то произойдет неожиданноерезультаты (из многоступенчатых определений зависимостей в Excel).
Несколько других замечаний:
Если в UDF возникает ошибка, то, как ее устранить, может варьироватьсямежду тем, используется ли UDF в листе или вызывается ли он из другого кода.
Я не думаю, что вы сможете превзойтиВ Excel нет необходимости выполнять вычисления дважды, так как это часть того, как они определяют зависимости (если я не совсем понимаю, что вы написали).Однако я также ожидал бы, что вычисление с пустым значением A1
произойдет до окончательного значения вычисления с фактическим результатом.Если второй (окончательный) результат вычисления - это результат с пробелом A1
, то я не уверен, что вам сказать, кроме проверки того, что все ячейки / диапазоны, на которые есть ссылки в UDF, передаются в эту UDF как объекты параметров.