- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在使用 Excel-DNA 在 Excel 中开发一些 UDF。从 Excel 传递到我的 UDF 的参数之一是一个范围。当使用特定范围(例如“A1:C50”)时,UDF 可以正常工作。以下是我的函数定义示例:
[ExcelCommand()]
public static object CalcSMA(object[,] range, int num_points) {
...
}
但是,当传递整个列范围(例如“A:C”)时,我会收到“内存不足”错误。我可以通过设置参数属性 AllowReference=true 并将参数类型更改为对象来避免错误,如下例所示:
[ExcelCommand()]
public static object CalcSMA([ExcelArgument("Range", AllowReference=true)]object range, int num_points) {
ExcelReference xref = (ExcelReference)range;
...
}
但现在我想知道 UDF 实际需要多少行。我可以尝试迭代工作表中的所有行,但这是非常低效的。有没有办法根据使用的范围裁剪 ExcelReference(外部参照)?我想避免使函数变得易变 (IsMacroType=true),但如果需要的话我会这样做。
最佳答案
在 VBA(或 COM)中,您可以将 Range 参数与 Range 参数的 Parent 的 UsedRange 相交。但在 XLL 中,获取使用范围并不简单,因为 XLL 接口(interface)不为工作表提供 UsedRange 方法。所以你必须使用 COM 接口(interface)(这在 XLL UDF 内部是有问题的)。我构建了一个例程,该例程使用 AfterCalculate 事件来缓存每个工作表的使用范围。
这里有一些关于这样做的方法的讨论 https://fastexcel.wordpress.com/2014/09/26/getting-used-range-in-an-xll-udf-multi-threading-and-com/
请注意,如果您愿意使您的 UDF 成为单线程宏类型 UDF,您可以使用 GETDOCUMENT(10) XLL api。但付出的代价可能不值得。
关于c# - 如何根据 UsedRange 剪辑 ExcelReference?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30896290/
我正在使用 Excel-DNA 在 Excel 中开发一些 UDF。从 Excel 传递到我的 UDF 的参数之一是一个范围。当使用特定范围(例如“A1:C50”)时,UDF 可以正常工作。以下是我的
我是一名优秀的程序员,十分优秀!