为什么这个 VBA 索引语句会报错?

Why does this VBA index statement give an error?

在Excel

Dim arr1 As Variant
arr1 = WorksheetFunction.Index(Cells, Evaluate("row(1:100)"), Array(1, 7, 4, 3, 2))
arr1 = Application.Index(Cells, Evaluate("row(1:100)"), Array(1, 7, 4, 3, 2))

第一次尝试给 arr1 赋值失败,出现错误 13(类型不匹配),但第二次尝试工作正常。

但是,虽然 WorksheetFunction 对象是 Application 对象的一部分,但 Application 对象本身似乎没有 "index" 方法。然而代码有效。有什么想法吗?

物有所值,

arr1 = Application.WorksheetFunction.Index(Cells, Evaluate("row(1:100)"), Array(1, 7, 4, 3, 2))

同样失败并出现错误 13。

Excel 通过 WorksheetFunctionApplication 调用的函数 应该 做同样的事情,但它们在许多方面不同,因为它们是在不同的时间由不同的团队编写的。

WorksheetFunction.Index 期望第二个参数是 数字 。这似乎是 "mistake" 在编写其原型时,因为 Excel 的实际 INDEX 函数接受第二个参数的数组。奇怪的是,WorksheetFunction.Index 的第三个参数接受数组,因为它在原型中被声明为 Variant。该错误仅发生在声明为 As Double 的第二个参数处,因此 type mismatch.

WorksheetFunction.doStuffApplication.doStuff 之间还有其他已知差异。即:

  • 如果计算出现错误,前者会引发运行时错误。后者只是 returns 一个 错误变体 ,您可以使用 IsError

  • 通过代码检查
  • 以前的功能出现在 Intellisense 中,但非常模糊,几乎没有用。

我总是喜欢通过 Application 对象调用 Excel 函数。