Excel UDF принимает пустой параметр во втором нежелательном вызове - PullRequest
0 голосов
/ 26 декабря 2018

В моем проекте аргумент одного UDF является результатом другой функции UDF.

Например:

GetPeriod(string name, string date) {
           // logic 
          }

Data(string name, string period) {
          // logic
          }

Я использую эти UDF в двух разных ячейках как

cell a1: =GetPeriod("KMP", "27-12-18")
cell a3: =Data(a$1,"KMP")

Я использую результат одного UDF (GetPeriod) в качестве параметра в другом UDF (Данные).

Проблема здесь в том, что Data UDF запускается дважды: один раз с фактическим результатоми один раз с пустым значением ячейки A1.

Я попытался установить ручной режим расчета, но он все равно вызывается дважды.

Есть ли какие-либо возможные проблемы с этим дизайном или естьспособ установить приоритет в UDF, чтобы Excel понимал, какой UDF следует запускать первым?

Ответы [ 2 ]

0 голосов
/ 26 декабря 2018

Убедитесь, что ячейка A3 пуста, прежде чем вставить UDF в ячейку A1.Единственный способ, которым вызывается UDF «Данные», - это если он уже существует на листе, к которому вы его добавляете.Для пояснения: если в ячейке A3 нет формулы, то нет возможности вызвать UDF «Данные».Но изменение значения в ячейке A1 путем вставки пользовательской функции «Period» вызовет перерасчет формулы в ячейке A3, поскольку один из параметров, передаваемых в нее, только что изменился.Другой вариант основан на необходимости только значений, а не фактических UDF в ячейках.В этом случае просто установите «.Value2» ячеек, используя функции «Данные» и «Период», передав значение «Период» как функцию в функцию «Данные».

Range rngPeriod; //Set to cell "A1"
Range rngDate; //Set to cell "A3"
rngPeriod.Value2 = GetPeriod("KMP", "27-12-18");
rngData.Value2 =Data(GetPeriod("KMP", "27-12-18"),"KMP");
0 голосов
/ 26 декабря 2018

Я не уверен, как код VBA переводится в c # для Excel, поэтому я попытаюсь дать подробное объяснение / пример.


В VBA есть два основных способа передачиссылка для ячейки Excel (или диапазона) на UDF.

  1. Использование строкового параметра (т.е. Data(name as String))

  2. Использование диапазонаПараметр объекта (т. Е. Data(name as Range) или в более широком смысле Data(name as Object))

При использовании строкового параметра к значению диапазона в коде обычно обращаются через Worksheet("Name").Range("String Param")).Value.Когда используется параметр объекта, код обычно выглядит так: RangeParam.Value.

Бывают также случаи, когда диапазон жестко закодирован или косвенно указан в UDF.Я бы избегал этого;особенно если этот диапазон содержит формулу.


Когда Excel выполняет вычисления, он выполняет несколько шагов.

  1. Инициирует вычисления в каждой ячейке для определения параметров диапазона.(Используется для определения зависимостей.)
  2. Создайте дерево зависимостей с правильным порядком вычислений.
  3. Выполните окончательные вычисления в определенном порядке.

Из этого следует понимать следующие важные вещи:

  • Если на диапазон ссылается через строковый параметр, Excel может не понимать зависимость.
  • Если на диапазон ссылаются в расчете,но жестко закодированный, косвенно связанный или иным образом не переданный в качестве параметра, Excel не поймет зависимости.
  • Если UDF получит отличающиеся результаты в зависимости от количества раз, которое он запускает, то произойдет неожиданноерезультаты (из многоступенчатых определений зависимостей в Excel).

Несколько других замечаний:

Если в UDF возникает ошибка, то, как ее устранить, может варьироватьсямежду тем, используется ли UDF в листе или вызывается ли он из другого кода.

Я не думаю, что вы сможете превзойтиВ Excel нет необходимости выполнять вычисления дважды, так как это часть того, как они определяют зависимости (если я не совсем понимаю, что вы написали).Однако я также ожидал бы, что вычисление с пустым значением A1 произойдет до окончательного значения вычисления с фактическим результатом.Если второй (окончательный) результат вычисления - это результат с пробелом A1, то я не уверен, что вам сказать, кроме проверки того, что все ячейки / диапазоны, на которые есть ссылки в UDF, передаются в эту UDF как объекты параметров.

...