如何将不连续范围的单元格从 Excel 传递到 ExcelDNA 函数

gli*_*ick 2 c# excel excel-formula excel-dna

考虑这样的 ExcelDNA 函数定义:

[ExcelFunction(Name = "Fnc1", Description = "Fnc1")]
public static object Fnc1(
    [ExcelArgument(Name = "Arg1", Description = "Arg1", AllowReference = true)]
    object rng)
{
    // ...
}
Run Code Online (Sandbox Code Playgroud)
  • 当使用这样的单个单元格=Fnc1(A1)或这样的连续单元格范围调用时,它工作正常=Fnc1(A1:A3)
  • 但是当使用不连续的单元格范围调用时它不起作用,例如=Fnc1(A1,A5,A10). #VALUE!返回错误。

有没有办法如何调用具有不连续范围的未知单元格数量的ExcelDNA 函数?

我已经尝试像这样声明参数,params object[] rng但也没有运气。

Cai*_*ete 6

为了让 Excel-DNA 函数允许在运行时传入未知数量的参数,您需要params object[]在函数参数中使用。

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

那么,如果您使用硬编码值(例如)调用它=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>
Run Code Online (Sandbox Code Playgroud)

然后,在您的 中AutoOpen,您通过ProcessParamsRegistrations调用注册函数......例如

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

        // ...
    }

    public void AutoClose()
    {
        // ...
    }
}
Run Code Online (Sandbox Code Playgroud)

函数的隐式与显式注册

默认情况下,Excel-DNA 会搜索public static程序集中的每个方法,并将它们注册为 Excel 中的函数。这就是隐式注册过程。

ExplicitRegistration="true"轮流关闭隐式注册,因此没有被自动注册-你必须做你自己-这是我在做什么在AutoOpen上面的... RegisterFunctions()电话。如果您不关闭隐式注册,则函数最终会被注册两次(一次由隐式进程注册,然后再次由您的代码注册)并且您会收到错误消息