2017-09-26 57 views
3

是否可以在VBA中检查某个对象是否支持没有错误处理程序的特定方法?如何检查对象是否支持vba中的方法?

我发现许多重复的问题,例如JavaScriptSymphony2,但尚未在VBA中。

我想使用.sendkeys "{ENTER}"命令到ie.document类项目,并学习如何检查对象是否支持方法,使我可以长期编写更干净的代码。

示例代码:

Set elements(17) = ie.document.getElementsByClassName("ng-binding ng-scope") 
for each item in elements(17) 
    item.sendkeys "{ENTER}" 
next item 

回答

3

短于为API文档看你使用,你不能。

至少不是晚期代码。根据定义,后期绑定代码在运行时解决,这意味着你必须确认一个成员是否将提供该对象的界面上没有编译时的方式 - 这就是为什么这个代码编译:

Option Explicit 

Public Sub Test(ByVal o As Object) 
    Debug.Print o.FooBarBazz 
End Sub 

或者这个有点更现实的一个:

Debug.Print ThisWorkbook.Worksheets("Test").Naame 'Worksheets.Item returns an Object 

运行时的成员是否被支持前需要了解的唯一方法,就是使用早期绑定电话:

Dim ws As Worksheet 
Set ws = ThisWorkbook.Worksheets("Test") 
Debug.Print ws.Naame ' typo won't compile! 

当然这是不是很简单,因为即使是早期绑定的接口也可以有一个COM标志表示它们是“可扩展的”。 Excel.Application就是这样的一个接口:

Debug.Print Excel.Application.FooBarBazz ' compiles! 

但是我在漂流。

你说“没有错误处理”......这算不算?

On Error Resume Next 
item.sendkeys "{ENTER}" 
'If Err.Number = 438 Then Debug.Print "Not supported!" 
On Error GoTo 0 
+0

非常感谢@马特杯,为您的完整,直接的答案。我对这个解释很少了解,我会回到这个问题来看看,如果我有更广泛的基础和理解概念/术语,我是否可以跟随论证。据我所知,它不算“没有错误处理”,但我要感谢你的贡献,我没有添加最后一个“下一个”,这是导致我提出这个问题的一个问题第一个例子。 –

+1

@ a.t。您可以将“早期绑定”看作是指您的项目引用的库的任何内容(请参见工具>参考):这些内容将在编译时解析。 “迟到”是针对“Object”或“Variant/Object”进行的任何调用 - VBA在运行时解析成员(如果未找到它,则抛出错误438)。 –

+1

感谢您的介绍,它让我对运行时和编译时代码有更详细的解释[here。](https://stackoverflow.com/questions/846103/runtime-vs-compile-time#846421) –

相关问题