How to do late binding in VBA?

2019-01-25 23:32发布

I have this little function that achieves the creation of an email via VBA,
It gets the data from another function that works together with an Excel file.

The problem I have is that I made all this thru Excel 2016, and when some of my colleagues try to use it there an error of missing references (Outlook Library 16.0).

So I looked in the internet solutions and the ones I found are many, but the better is Late Binding. I have read all about it but I don't seem to really understand what's going on and how to make it work in the following code.

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

Therfore, maybe you can help me out with this example in order to see it this practical case of mine.

2条回答
对你真心纯属浪费
2楼-- · 2019-01-25 23:48

This is early binding:

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

And this is late binding:

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

Late binding does not require a reference to Outlook Library 16.0 whereas early binding does. However, note that late binding is a bit slower and you won't get intellisense for that object.

查看更多
Luminary・发光体
3楼-- · 2019-01-25 23:52

As Callum pointed out, late binding involves changing your application reference to an object and not setting a reference to the library.

Without a reference Excel doesn't know anything about Outlook until runtime. This also means that not only will intellisense not work, the constant names for values in Outlook won't work either.

e.g. In Outlooks Immediate window if you type Application.CreateItem( you'll get a whole load of item types pop up to choose from. olContactItem for instance.

Excel hasn't a clue what olContactItem means - it's an Outlook constant that only Outlook or an application with a reference to Outlook understands.

In Outlooks immediate window type ?olContactItem and it will return 2. That's the number you need to use instead of the constant name.

So your code changes from
Application.CreateItem(olContactItem) to olApp.CreateItem(2)

You need to do this throughout your code.

查看更多
登录 后发表回答