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

标签 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)
{
    // ...
}
  • 用像这样的单个单元格调用它工作正常 =Fnc1(A1)或像这样的 连续 单元格范围 =Fnc1(A1:A3) .
  • 但是当用 不连续 单元格范围调用时它不起作用,例如=Fnc1(A1,A5,A10) .错误#VALUE!被退回。

Is there a way how to call ExcelDNA function with discontinuous range of unknown amount of cells?

我试过这样声明参数 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) 或者如果您使用单元格引用,例如=你好(A1,A5,A10)

但是,Excel-DNA 不支持开箱即用的可变参数数量,因此您必须使用 ExcelDna.Registration帮助库,以便注册您的函数。

安装 ExcelDna.Registration NuGet package ,然后在您的 .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()
    {
        // ...
    }
}

Implicit vs Explicit Registration of functions

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

ExplicitRegistration="true" 关闭关闭 隐式注册,因此不会自动注册任何内容 - 你必须自己做 - 这就是我在AutoOpen 上面的 ... RegisterFunctions() 调用。 如果您不关闭隐式注册,那么函数最终会被注册两次(一次是通过隐式过程,然后是您的代码)并且你收到错误信息

关于c# - 如何将不连续的单元格范围从 Excel 传递到 ExcelDNA 函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60077214/

相关文章:

c# - 网格中的剑道日历

excel - 如果 K 列中有 0,则删除行 C 到 K 并将单元格上移

excel - 在纯 Excel 中,返回命名范围引用地址的最佳方式(无 VBA)

excel - MS Excel 对于每个循环 : Insert Rows

c# - 图中节点的拓扑排序子集

c# - 我如何在 winforms 中制作我的自定义对话框?

Excel:如何对每 n 列的单元格值求和

excel - 即使拼写错误,如何在excel中比较文本

c# - 如何在 Windows Phone 7 应用程序中显示来自互联网的图像?

excel - 如果日期时间单元格是 "AM"或 PM,如何查找并返回不同列中的值?