繁体   English   中英

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

[英]How to pass discontinuous range of cells from Excel to ExcelDNA function

考虑这样的 ExcelDNA 函数定义:

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

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

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

为了让 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()调用所做的。 如果您不关闭隐式注册,则函数最终会注册两次(一次由隐式进程注册,然后再次由您的代码注册)并且您会收到错误消息

如果您想允许多个参数,并且对于最终用户来说可能最容易使用,则其他答案很有用。 但是您也可以通过在公式中添加括号将不连续范围直接传递到您开始的单个AllowReference=true参数中:

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

您获得的单个ExcelReference将为不相交的部分提供多个InnerReferences

括号消除了将逗号用作范围联合运算符和用作函数调用中的参数分隔符之间的歧义。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM