gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 19:52:27 25 4
gpt4 key购买 nike

考虑这样的 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com