3

我一直在尝试通过使用 XLL 来加速宏,但是,使用 UDF 似乎比使用 XLL 快得多。

一些带有代码分析的数据证明了这一点

子 Proc 的XLL时间:模块 1 迭代11.64831 秒

子 Proc 的UDF时间:模块 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 速度较慢。

4

1 回答 1

2
  1. VBA 直接访问单元格内容。它使用其本机类型,并且在 99% 的情况下,编码良好的 UDF 将比执行相同操作的外部库更快。

  2. 在您的示例中,您在 C# 版本中做了更多工作。

  3. 如果你真的想提高性能并利用 C# 的能力来做一些事情而不循环*你应该考虑将 Range 对象传递给你的外部库,假装你实际上是在传递一个 1D array。在 C# 中接收它,您就可以使用LINQ之类的所有酷东西了。

于 2015-03-10T16:11:02.463 回答