当我尝试运行下面的代码时,弹出以下错误消息:“无法获取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)))
如果有人可以告知我发生这种情况的原因,那将是很大的帮助!
答案 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.Match
(WorksheetFunction.Match
)-如果查找值,它还会返回一个#N/A
错误值找不到,但应该性能要好一些。
“无法获取WorksheetFunction类的{函数名称}属性”也可能意味着您的参数在某种程度上是错误的。行号应该是Long
,而不是Integer
,并且请注意,Range("R" & i)
隐式地指的是ActiveSheet
是什么,因为它不符合正确的Worksheet
的条件。对象引用-也许活动工作表不是您的代码所假定的工作表吗?