【问题标题】:How to check if object supports method in vba?如何检查对象是否支持vba中的方法?
【发布时间】:2018-03-08 03:08:11
【问题描述】:

是否可以在没有 VBA 错误处理程序的情况下检查对象是否支持某种方法?

我发现很多重复的问题,例如 JavaScriptSymphony2,但在 VBA 中还没有。

我想对ie.document 类项使用.sendkeys "{ENTER}" 命令,并学习如何检查对象是否支持某种方法,从长远来看,我可以编写更简洁的代码。

示例代码:

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

【问题讨论】:

    标签: vba excel object methods properties


    【解决方案1】:

    没有查看您正在使用的 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
    

    【讨论】:

    • 非常感谢@Mat's Mug,感谢您的完整而直接的回答。我对解释知之甚少,一旦我对概念/术语有了更广泛的基础和理解,我将回到这个问题,看看是否可以遵循论证。据我所知,它不算“没有错误处理”,但我要感谢您的贡献,我没有添加最后一个Next,这是导致我提出这个问题的问题首先是。
    • @a.t.您可以将“早期绑定”视为引用项目引用的库的任何内容(请参阅工具 > 参考):这些在编译时解决。 “后期绑定”是针对 ObjectVariant/Object 进行的任何调用 - VBA 在运行时解析该成员(如果找不到则抛出错误 438)。
    • 感谢您的介绍,它让我对运行时和编译时代码进行了更详细的解释here.
    • 当对象本身有一个方法来评估它是否支持一个方法时是可能的。 ie.document下的所有对象都是这种情况。
    • @FlorentB。虽然这是特定于实现的(IDK,我不做 IE 自动化)。引用类型库(使用早期绑定对象)并使用 Object Browser 查看哪些类型支持哪些成员,这似乎是一个更简单和通用的解决方案 IMO。出于某种原因,everyone 使用后期绑定代码来执行此操作 - 我敢打赌,这与涉及该类型库的大量 SO 问题有关。
    猜你喜欢
    • 2018-10-05
    • 1970-01-01
    • 2019-11-02
    • 2011-10-17
    • 2010-10-12
    • 1970-01-01
    • 2011-03-01
    • 2011-08-12
    • 1970-01-01
    相关资源
    最近更新 更多