【问题标题】:Late Binding vs Early Binding in VBA - (CreateObject() vs New)VBA 中的后期绑定与早期绑定 - (CreateObject() vs New)
【发布时间】:2023-03-29 00:50:01
【问题描述】:

我正在尝试使用 VBA 代码来调用需要使用 OAuth2 进行身份验证的受保护 API。一旦我尝试打开一个 URL,我会被重定向到 ADFS 页面进行身份验证,然后我会返回。

现在对于使用CreateObject("InternetExplorer.Application").Navigate URL 的某些应用程序可以正常工作,对于其他网络应用程序,我需要使用New InternetExplorerMedium 才能使代码正常工作。

您能否告诉我这些对象之间的区别以及为什么有些网站使用其中一个而有些网站使用另一个?

谢谢

【问题讨论】:

    标签: vba early-binding


    【解决方案1】:

    这种引用对象的方式称为“早期”和“晚期绑定”。 From MSDN:

    将对象分配给对象变量时,Visual Basic 编译器会执行一个称为绑定的过程。

    当一个对象被分配给一个声明为特定对象类型的变量时,它是早期绑定的。早期绑定对象允许编译器在应用程序执行之前分配内存并执行其他优化。

    相比之下,当一个对象被分配给一个声明为 Object 类型的变量时,它是后期绑定的。这种类型的对象可以持有对任何对象的引用,但缺乏早期绑定对象的许多优点。

    您应该尽可能使用早期绑定对象,因为它们允许编译器进行重要的优化,从而产生更高效的应用程序。早期绑定对象比后期绑定对象快得多,并且通过准确说明正在使用的对象类型使您的代码更易于阅读和维护。

    TL DR:

    不同之处在于,在早期绑定中,您可以获得智能感知和编译时间奖励,但您应该确保 你已经添加了相应的库。


    • 后期绑定的示例用法:

    Sub MyLateBinding()
    
        Dim objExcelApp     As Object
        Dim strName         As String
    
        'Definition of variables and assigning object:
        strName = "somename"
        Set objExcelApp = GetObject(, "Excel.Application")
    
        'A Is Nothing check:
        If objExcelApp Is Nothing Then Set objExcelApp = CreateObject("Excel.Application")
    
        'Doing something with the Excel Object
        objExcelApp.Caption = strName
    
        MsgBox strName
    
    End Sub
    

    • 提前绑定的用法示例:

    首先确保从 VBE>Extras>Libraries 添加 MS Excel 16.0 对象库


    Sub MyEarlyBinding()
    
        Dim objExcelApp     As New Excel.Application
        Dim strName         As String
    
        'Definition of variables and assigning object:
        strName = "somename"
    
        'A IsNothing check:
        If objExcelApp Is Nothing Then Set objExcelApp = CreateObject("Excel.Application")
    
        'Doing something with the Excel Object
        objExcelApp.Caption = strName
    
        MsgBox strName
    
    End Sub
    

    相关文章:

    【讨论】:

    • 感谢您的快速回复。我检查了,我有那个库,现在因为一些应用程序与早期绑定一起工作,而其他应用程序不是一种工作方式,例如管理错误,如在错误恢复下一个或类似这样的错误?我该如何解决这个问题?
    • @zanza67 - 在示例中,解释了 Excel 对象的早期和晚期绑定。为此,您需要相应的 Excel 库。如果您尝试提前绑定其他对象,则必须将它们的库添加到 VBE。
    • 我从来没有遇到过类似的问题,你有没有在同一个网站上测试过CreateObject("InternetExplorerMedium.Application") vs New InternetExplorerMediumCreateObject("InternetExplorer.Application") vs New InternetExplorer
    • @zanza67 - 我想现在是时候请在您的问题中提供一些minimal reproducible example
    • 在取消选中 IE 中 Internet 区域中的保护模式后,我的示例开始工作。这解决了我所有的问题。感谢大家的帮助和努力。 zanza67
    猜你喜欢
    • 2021-10-08
    • 1970-01-01
    • 2016-12-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多