动态设置对象库引用?

时间:2011-04-10 15:07:29

标签: ms-access vba ms-access-2007 access-vba ms-access-2003

所以我最初有一个2002-2003格式的MS Access应用程序。在生产网络图像上开发,当图像推动办公室升级时,它成为了Office 2007.所以这是以非常传统的方式使用...代表在公司笔记本电脑上随身携带输入数据,并自动化复杂的ppt演示文稿,以及他们的excel工作表(他们喜欢它......他们需要它)。数据不像数据库存储库那样保存,只需要足够长的时间来生成他们需要的自动化,并且它可以工作....节省时间。因此访问是有限的,并且在用例中,因为我以某种方式使用它确实有限,因此它当然不打算使用。我明白了,但就像我说到目前为止,它工作得很好.....

我遇到的一个问题是,如果有人因为某种原因不得不使用另一台计算机(经常不会发生,但它让我思考),并说他们有2002-2003版本的访问权限,该工具将会运行,但是一旦我们进入ppt&的代码例程/模块outlook,对象库显示MISSING,因为使用此工具似乎会自动导致库升级到下一个可用版本,但不能找到版本.....

所以最初当我做这个......它使用的是MS PowerPoint 11.0和MS Outlook 11.0,然后当我不得不在2007年开始工作时,两者都成了12.0,有些情况下我看到它升到了14.0,并没有任何问题,但现在因为我有一个Office 2007的图像,我尝试给他们的新文件版本默认为12.0的库,如果他们遇到他们将采取该文件的情况一张光盘并在具有office 2003的计算机上使用它,这些库只是缺失而且它不再识别适当的11.0对象库。

所以最后我的问题....任何暗示(除了显而易见的,并构建一个真正的应用程序......大声笑...会喜欢....没有$)处理这个?是否有代码可以/将评估使用vba打开文件时需要设置的库?这可能吗?

1 个答案:

答案 0 :(得分:4)

您可以使用Remove Method删除引用,然后AddFromFile MethodAddFromGuid Method添加引用。

AddFromFile方法是在最近的StackOverflow问题的答案中提供的:Add references programatically但是,请务必阅读Tony's answer ...如果您将应用程序作为MDE分发,那么您就是SOL

考虑切换到PowerPoint和Outlook内容的后期绑定。这样你就不必使用引用(后期绑定不需要引用)。后期绑定的一个缺点是您在开发过程中失去了IntelliSense的优势。但是,您可以使用早期绑定进行开发,然后切换到后期绑定以进行部署。替换您在引用库中使用任何命名常量的值... debug将突出显示您忽略的任何内容。

一个经常反驳的观点是,后期绑定会造成“性能损失”。但是,我还没有遇到一个用例,其中“减速”大到足以让人类观察者注意到。

无论如何,我多年来一直在使用后期绑定,以避免您现在正在努力解决的部署问题。

编辑:以下是使用Excel类型库的示例。我把它设置为使用早期绑定。要将其转换为后期绑定,请在'*早期绑定... 下注释掉声明,并取消注释'*后期绑定下的声明...

另请注意包含命名常量的两行,xlAutomatic。

Public Sub EarlyVsLateBinding()
    Dim strFullPath As String
    '* early binding requires reference to Excel type library *'
    Dim objExcel As Excel.Application
    Set objExcel = New Excel.Application
    Dim objBook As Excel.Workbook
    Dim objSheet As Excel.Worksheet
    '* late binding; no reference required *'
'    Dim objExcel As Object '
'    Dim objBook As Object '
'    Dim objSheet As Object '
'    Set objExcel = CreateObject("Excel.Application") '

    strFullPath = CurrentProject.Path & Chr(92) & "foo.xls"

    Set objBook = objExcel.Workbooks.Open(strFullPath)
    Set objSheet = objBook.Worksheets("bar")
    objSheet.Range("B1").Select
    With objExcel.Selection.Font
        .Name = "Arial"
        .FontStyle = "Regular"
        .Size = 10
        .ColorIndex = xlAutomatic 'named constant available with reference set '
        '.ColorIndex = -4105 'substitute xlAutomatic value so we drop reference
    End With
    objBook.Close SaveChanges:=True
    objExcel.Quit
    Set objSheet = Nothing
    Set objBook = Nothing
    Set objExcel = Nothing
End Sub