如何在VBA中进行后期绑定?

时间:2017-11-01 13:47:01

标签: excel vba excel-vba outlook late-binding

我有这个小功能,通过VBA实现电子邮件的创建,
它从另一个与Excel文件一起工作的函数中获取数据。

我遇到的问题是我通过Excel 2016完成了这一切,当我的一些同事尝试使用它时,错误的引用错误(Outlook Library 16.0)。

所以我查看了互联网解决方案,我找到的解决方案很多,但更好的是Late Binding。我已经阅读了所有相关信息,但我似乎并不真正理解发生了什么以及如何使其在以下代码中运行。

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

因此,也许你可以帮我解决这个例子,以便看到我的这个实际案例。

3 个答案:

答案 0 :(得分:9)

这是早期约束:

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

这是后期绑定:

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

后期绑定不需要引用 Outlook Library 16.0 ,而早期绑定则需要。但是,请注意,后期绑定有点慢,您将无法获得该对象的智能感知。

答案 1 :(得分:4)

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

如果没有引用,Excel在运行时之前对Outlook一无所知。这也意味着不仅intellisense不起作用,Outlook中值的常量名称也不会起作用。

e.g。在Outlooks立即窗口中,如果您键入Application.CreateItem(,您将会弹出一大堆项目类型以供选择。例如olContactItem

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

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

所以你的代码从中改变了 Application.CreateItem(olContactItem)olApp.CreateItem(2)

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

答案 2 :(得分:0)

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

公共常量olFormatHTML = 2