为什么此vlookup导致错误消息

时间:2019-03-29 18:29:39

标签: vba

当我尝试运行下面的代码时,弹出以下错误消息:“无法获取WorksheetFunction类的Vlookup属性”

我单步执行了代码,这在第二个vlookup中弹出。第一个vlookup运行正常。

这两个查找之间的唯一区别是所搜索的值已从Range(“ R”&i)-> Range(“ S”&rrow);更改。 i和rrow都是整数,并且两个范围都有存在的值。

Worksheets("Sheet2").Cells(i, 22) = Not(IsError(Application.WorksheetFunction.VLookup(Range("R" & i),Worksheets("Sheet3").Range("AD:AD"), 1, False)))

Worksheets("Sheet2").Cells(i, 21) = Not(IsError(Application.WorksheetFunction.VLookup(Range("S" & rrow),Worksheets("Sheet3").Range("AD:AD"), 1, False)))

如果有人可以告知我发生这种情况的原因,那将是很大的帮助!


1 个答案:

答案 0 :(得分:1)

WorksheetFuntion界面是早期绑定的:在设计时,您会获得自动完成功能,参数快速信息工具提示等。在运行时,早期绑定的WorksheetFunction如果失败,则会引发实际的VBA运行时错误。

所以返回值甚至不会到达IsError,因为错误不是返回,而是 raised

Scott mentioned一样,您可以改用Application.VLookup-这是后期绑定,因此在设计时,您不会自动完成,也没有参数快速信息工具提示;如果您输入错误,编译器将无济于事。在运行时,后期绑定的工作表函数将返回错误值(实际的Variant/Error值),可以将其与例如CVErr(xlErrNA),或输入IsError进行评估。

Not IsError(expression)将返回一个布尔值,而不是查找值-这可能是您想要的,也可能不是您想要的。

因此,将Application.WorksheetFunction.VLookup替换为Application.VLookup,您的代码应该可以工作...除外...

  

,并且两个范围的值都存在

如果是这种情况,早先绑定的WorksheetFunction.VLookup不会引发错误(假设您的参数都正确)。

最后,由于您仅对值是否存在感兴趣,请考虑改用Application.MatchWorksheetFunction.Match)-如果查找值,它还会返回一个#N/A错误值找不到,但应该性能要好一些。

“无法获取WorksheetFunction类的{函数名称}属性”也可能意味着您的参数在某种程度上是错误的。行号应该是Long,而不是Integer,并且请注意,Range("R" & i)隐式地指的是ActiveSheet是什么,因为它不符合正确的Worksheet的条件。对象引用-也许活动工作表不是您的代码所假定的工作表吗?