【问题标题】:How to do late binding in VBA?如何在 VBA 中进行后期绑定?
【发布时间】:2018-04-13 20:39:57
【问题描述】:

我有一个通过 VBA 创建电子邮件的函数。

我是通过 Excel 2016 完成的。当我的一些同事尝试使用它时,出现缺少引用的错误 (Outlook Library 16.0)。

我在互联网上寻找解决方案,发现最好的是后期装订。我已经阅读了它,但我不明白如何在下面的示例代码中使其工作。

Sub EscalateCase(what_address As String, subject_line As String, email_body As String)
    
    Dim olApp As Outlook.Application
    Set olApp = CreateObject("Outlook.Application")
    
    Dim olMail As Outlook.MailItem
    Set olMail = olApp.CreateItem(olMailItem)
        
    olMail.To = what_address
    olMail.Subject = subject_line
    olMail.BodyFormat = olFormatHTML
    olMail.HTMLBody = email_body
    olMail.Send
        
End Sub

【问题讨论】:

标签: vba excel outlook late-binding


【解决方案1】:

这是早期绑定:

Dim olApp As Outlook.Application
Set olApp = New Outlook.Application

这是后期绑定:

Dim olApp As Object
Set olApp = CreateObject("Outlook.Application")

后期绑定不需要引用 Outlook Library 16.0,而早期绑定则需要。但是,请注意后期绑定要慢一些,并且您不会获得该对象的智能感知。

【讨论】:

    【解决方案2】:

    正如 Callum 所指出的,后期绑定涉及更改应用程序对对象的引用,而不是设置对库的引用。

    没有参考,Excel 直到运行时才知道有关 Outlook 的任何信息。这也意味着不仅智能感知不起作用,Outlook 中值的常量名称也不起作用。

    例如在 Outlook 即时窗口中,如果您键入 Application.CreateItem(,您将弹出一大堆项目类型供您选择。例如olContactItem

    Excel 不知道 olContactItem 是什么意思 - 它是一个 Outlook 常量,只有 Outlook 或引用 Outlook 的应用程序才能理解。

    在 Outlook 即时窗口中键入 ?olContactItem,它将返回 2。这是您需要使用的数字,而不是常量名称。

    因此您的代码从
    Application.CreateItem(olContactItem) 更改为 olApp.CreateItem(2)

    您需要在整个代码中执行此操作。

    【讨论】:

      【解决方案3】:

      在这种情况下,我通常在这样的模块中全局定义常量,这样您就可以保留变量的描述性值。

      Public Const olFormatHTML = 2

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-03-09
        • 2023-03-29
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多