我一直试图通过使用XLL来加速宏,但是,使用UDF似乎比使用XLL快得多。
一些带代码分析的数据演示了它
XLL 潜艇的时间 Proc:模块1迭代 11.64831秒
UDF sub的时间 Proc:模块1迭代 4.25986秒
它发生在我转换的两个UDF上,因子是2倍或3倍慢。 例如,XLL函数是:
[ExcelFunction(Description="Joins cell values", Category="Example1")]
public static object RangeJoin(object[,] cells)
{
List<string> list = new List<string>();
foreach (object o in cells){
if ( !(o is ExcelEmpty) )
list.Add(o.ToString()); }
return string.Join(" ", list.ToArray());
}
UDF功能
Function RangeJoin(Rng As Range) As String
Dim vArr As Variant
Dim v As Variant
vArr = Rng
RangeJoin = vbNullString
For Each v In vArr
RangeJoin = RangeJoin & " " & v
Next v
End Function
两个都测试了Range(A1:A701)的数据和单元格之间的空白,两者都按预期工作,只是XLL更慢。
答案 0 :(得分:2)
VBA直接访问单元格内容。它使用其原生类型,99%的情况下,编码良好的UDF将比执行相同操作的外部库更快。
在您的示例中,您正在使用C#版本执行更多操作。
如果你真的想提高性能并利用C#的能力来做事而不循环*,你应该考虑passing a Range object to your external library pretending like you're actually passing a 1D array。在C#中接收它,你可以选择LINQ等所有很酷的东西。