Как передать прерывистый диапазон ячеек из Excel в функцию ExcelDNA - PullRequest
1 голос
/ 05 февраля 2020

Рассмотрим такое определение функции ExcelDNA:

[ExcelFunction(Name = "Fnc1", Description = "Fnc1")]
public static object Fnc1(
    [ExcelArgument(Name = "Arg1", Description = "Arg1", AllowReference = true)]
    object rng)
{
    // ...
}
  • Он отлично работает при вызове с одной ячейкой, такой как =Fnc1(A1), или с непрерывным диапазоном ячеек, подобным этому =Fnc1(A1:A3).
  • Но он не работает при вызове с прерывистым диапазоном ячеек, например =Fnc1(A1,A5,A10). Ошибка #VALUE! возвращается.

Есть ли способ вызова функции ExcelDNA с прерывистым диапазоном неизвестным количеством ячеек?

Я попытался объявить параметр следующим образом params object[] rng, но тоже не повезло.

Ответы [ 3 ]

3 голосов
/ 05 февраля 2020

Чтобы иметь функцию Excel-DNA, которая позволяет передавать неизвестное количество аргументов во время выполнения, вам необходимо использовать params object[] в аргументах вашей функции.

public static class MyFunctions
{
    [ExcelFunction]
    public static object Hello(params object[] values)
    {
        return "Hello " + DateTime.Now;
    }
}

Тогда не имеет значения, если вы вызываете его с жестко закодированными значениями, например, =Hello(10, 20), или если вы используете ссылки на ячейки, например, =Hello(A1,A5,A10).

Однако переменное число аргументов не поддерживается вне of-the-box от Excel-DNA, и поэтому вам нужно будет использовать вспомогательную библиотеку ExcelDna.Registration для регистрации ваших функций.

Установите ExcelDna . Зарегистрируйте пакет NuGet , затем в файле .dna отметьте ссылку на сборку надстройки для использования ExplicitRegistration, например:

<?xml version="1.0" encoding="utf-8"?>
<DnaLibrary Name="My Add-In" (...)>
  <ExternalLibrary Path="MyAddIn.dll" ExplicitRegistration="true" (...) />
</DnaLibrary>

Затем, в своем AutoOpen, вы зарегистрируетесь функции с ProcessParamsRegistrations вызовом ... например,

public class AddIn : IExcelAddIn
{
    public void AutoOpen()
    {
        ExcelRegistration
            .GetExcelFunctions()
            .ProcessParamsRegistrations()
            .RegisterFunctions();

        // ...
    }

    public void AutoClose()
    {
        // ...
    }
}

Неявная или явная регистрация функций

По умолчанию Excel-DNA ищет каждый public static метод в вашей сборке и регистрирует их как функции в Excel. Это неявный процесс регистрации.

ExplicitRegistration="true" отключает выключение неявной регистрации и, следовательно, ничего не регистрируется автоматически - вы должны сделать это самостоятельно - это то, что я Я делаю в AutoOpen выше с вызовом ... RegisterFunctions(). Если вы не отключите неявную регистрацию, то в конечном итоге функции будут зарегистрированы дважды (один раз неявным процессом, затем снова вашим кодом) , и вы получите сообщения об ошибках

2 голосов
/ 07 февраля 2020

Остальные ответы полезны, если вы хотите разрешить несколько параметров, и, возможно, проще для конечного пользователя. Но вы также можете передать прерывистые диапазоны непосредственно в один параметр AllowReference=true, с которого вы начинаете, добавив скобки в формулу:

=Fnc1((A1,A5,A10:A12))

Получите один ExcelReference иметь несколько InnerReferences для непересекающихся частей.

В скобках нет различий между использованием запятой в качестве оператора объединения диапазона и в качестве разделителя параметров в вызове функции.

0 голосов
/ 05 февраля 2020

Да, можно передать несколько параметров в атрибуте.

Вот ссылка на другой вопрос с той же проблемой, которая уже решена:

Можно ли инициализировать C# атрибут с массивом или другим переменным числом аргументов?

...