c# - 如何根据 UsedRange 剪辑 ExcelReference?

标签 c# excel excel-dna xll

我正在使用 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/

相关文章:

c# - 如何获取日期时间月份开始和结束日期?

excel-dna - 为什么Excel不能加载excel-dna插件?

c# - 如何加载特定版本的程序集

异步任务中的 C# 更改标签文本

Excel vba 直方图 bin

python |循环语句为 Excel 文件中的每个工作表创建文件

mysql - 确定 MySQL 的 VBA ODBC 驱动程序是否存在结果

c# - Excel 无法识别带有 DateTime 参数的 C# 函数

excel - 在 "insert function"提示中禁用 excel UDF 计算

c# - 传递流的最佳方式是什么