Access 2010-2016 VBA:您能在多个版本中引用MS Outlook对象库吗?

10 浏览
0 Comments

Access 2010-2016 VBA:您能在多个版本中引用MS Outlook对象库吗?

我被要求解决一个从Access数据库发送电子邮件的VBA脚本的问题。该数据库和VBA是在Access 2010上开发的(数据存储在SQL数据库中),并且可能针对Outlook 2010进行了目标设置。

目前,我们使用Outlook 2013和2016。

当我的脚本(如下所示)运行时,在Outlook.Application声明处生成一个错误:用户自定义数据类型未定义。

以下是脚本的开头,我们在其中定义了数据类型。

' 初始化Outlook设置outlookApp和outlookNamespace。

Private outlookApp As Outlook.Application

Private outlookNamespace As Outlook.NameSpace

脚本的其余部分如下所示。它由一个直接调用SendEmail()并传递电子邮件地址作为变量的表单按钮触发。

私有子初始化Outlook()

' 在Outlook中初始化会话

Set outlookApp = New Outlook.Application

' 返回对MAPI层的引用

Set outlookNamespace = outlookApp.GetNamespace("MAPI")

' 让用户使用Outlook配置文件对话框登录

' 然后创建一个新的会话

outlookNamespace.Logon, , True, False

结束子

公共子发送电子邮件(varTo As Variant)

Dim mailItem As Outlook.mailItem

初始化Outlook

Set mailItem = outlookApp.CreateItem(olMailItem)

mailItem.To = varTo & ""

mailItem.Subject = "主题文本"

mailItem.Body = "正文文本"

mailItem.Display

设置mailItem = Nothing

清理

结束子

我对VBA / Access不是非常熟悉,但我已经使用过VB.NET,并且从一开始就相当确定这只是一个简单的“缺少导入语句或引用”的问题。

在进行了一些调查后,我在这里找到了在线信息,为了使用此功能,您必须添加一个引用到Microsoft Outlook XX.X对象库。

我还没有看到这个数据库上的引用(现在正在努力获取),因为我对这个Access数据库的访问有限,因为它包含了大量敏感信息,我在查看时必须受到监督。

然而,考虑到我们在编写此脚本时使用的是Outlook 2010,现在我们在Outlook 2013和2016之间切换,我认为我们需要将此引用更新为更新的版本。

我正在这里与一位同事讨论这个问题,他问了我一个重要的问题:

我们可以引用多个版本的Microsoft Outlook对象库吗?

如果我们针对最新版本的库,比如Outlook 2016,脚本是否不适用于Outlook 2013用户?

更新:通过测试,我发现如果我们使用MS Outlook 16.0对象库,Outlook 2013将无法识别该引用,并且会抛出引用丢失的错误。

如果我们使用MS Outlook 15.0库,该脚本将在具有任何版本Outlook的计算机上正常工作。

0
0 Comments

问题出现的原因是在使用不同版本的Access软件时,需要引用不同版本的Outlook对象库。解决方法是通过添加适当的Outlook库引用来解决问题,或者使用晚期绑定来避免这个问题。

具体来说,如果新版本的Outlook库包含了旧版本库的所有内容,并且还包含其他库信息,那么只引用新版本的库就可以解决问题。但是,随意添加库引用并不总是最佳实践,所以最好的做法是只引用一个Outlook库。

另一个解决方法是使用晚期绑定。晚期绑定可以解决这类问题,并且转换到晚期绑定非常容易。

需要注意的是,较新的Outlook库可能包含较旧版本库的所有内容,但是较新库在较旧版本的应用程序上不可用。如果必须添加引用,那么应该添加最早支持的版本。

,解决这个问题的方法是添加适当的Outlook库引用或者使用晚期绑定。这样可以确保在不同版本的Access软件上都可以正常引用Outlook对象库。

0
0 Comments

问题的出现的原因:

在使用VBA编写Access 2010-2016的应用程序时,如果需要引用MS Outlook Object Library,可能会遇到以下问题:

1. 早期绑定(early-binding):如果要使用早期绑定,只需添加最早支持的引用即可,不需要添加对2003 Outlook的引用(如果只打算支持2013+版本的Outlook),系统会自动处理兼容性问题。因为很少有东西不向后兼容。

2. 晚期绑定(late-binding):如果不想使用早期绑定,可以使用晚期绑定。这需要使用CreateObject函数而不是New关键字来创建Outlook.__object__对象。需要注意的是,必须显式声明Outlook的常量(如olMailItem),否则会引发编译错误(假设使用了Option Explicit)。

解决方法:

1. 在代码的头部添加以下声明:

Option Compare Database
Option Explicit
' InitOutlook sets up outlookApp and outlookNamespace.
Private outlookApp As Object ' Outlook.Application
Private outlookNamespace As  Object ' Outlook.NameSpace

2. 对代码的主体进行一些小的调整:

Const olMailItem As Long = 0 '## You need to add this enumeration!
Private Sub InitOutlook()
    ' Initialize a session in Outlook
    Set outlookApp = CreateObject("Outlook.Application")
    'Return a reference to the MAPI layer
    Set outlookNamespace = outlookApp.GetNamespace("MAPI")
    'Let the user logon to Outlook with the
    'Outlook Profile dialog box
    'and then create a new session
    outlookNamespace.Logon , , True, False
End Sub
Public Sub SendEmail(varTo As Variant)
    Dim mailItem As Object ' Outlook.mailItem
    InitOutlook
    Set mailItem = outlookApp.CreateItem(olMailItem)
    mailItem.To = varTo & ""
    mailItem.Subject = "subject text"
    mailItem.Body = "Body text"
    mailItem.Display
    Set mailItem = Nothing
    CleanUp
End Sub

这样就可以正确引用MS Outlook Object Library并使用其功能了。

0