Чтобы иметь функцию 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)
.
Однако переменное количество аргументов не поддерживается Excel-DNA «из коробки», и поэтому вам придется использовать ExcelDna.Registration
для регистрации ваших функций.
Установите пакет ExcelDna.Registration 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()
. Если вы не отключите неявную регистрацию, функции будут зарегистрированы дважды (один раз неявным процессом, а затем вашим кодом) и вы получаете сообщения об ошибках
person
C. Augusto Proiete
schedule
05.02.2020