c# - 如何将不连续的单元格范围从 Excel 传递到 ExcelDNA 函数
问题描述
考虑这样的 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!
。
有没有办法用不连续的未知数量的单元格调用 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()
调用中所做的。如果您不关闭隐式注册,那么函数最终会被注册两次(一次由隐式过程,然后再次由您的代码)并且您会收到错误消息
推荐阅读
- python - 如何覆盖石墨烯中的 DjangoModelFormMutation 字段类型?
- android-studio - Android emulator - dummy emulator-5554 和 AVD ... 已经在运行
- php - 登录后如何根据他的类型将用户重定向到不同的路由
- c# - 如果行以“ *:”开头,C#如何选择任何字符
- javascript - 中止之前正在运行的异步 componentDidMount
- java - JSP中HashMap中的重复键
- git - 我怎样才能拉/制作
当我用 --depth=1 克隆树时,进入头部? - xargs - fswatch 未运行脚本,报告为未找到
- html - 分隔网页页脚中的超链接
- velocity - 用于计算移动窗口中价格速度的 Esper EPL 查询