以编程方式添加引用

时间:2011-04-08 10:09:48

标签: ms-access vba ms-office

我们有一个Access-Application,它在某些客户端上不起作用,主要是因为引用被破坏了。例如,当您使用访问运行时2007启动访问应用程序但安装了版本2003或2000的办公室时,就会发生这种情况。左/右/修剪等功能就此停止工作。

我认为解决此问题的唯一方法是以编程方式检查安装了哪个办公室版本并以编程方式添加引用,因为在这些异构环境中我们无法控制用户安装的内容。具体来说,我需要引用Excel和Word的Microsoft Office对象库。

但我既没有所有办公室版本的指南,也没有线索如何自动检查它们。

4 个答案:

答案 0 :(得分:10)

所以是的,这个答案有点晚了,但万一有人偶然发现这个问题,就像我一直在寻找答案一样,我想出了以下一些代码来添加一个excel引用,它似乎工作得很好,也是在MDE / ACCDE!

If Dir("C:\Program Files (x86)\Microsoft Office\Office12\EXCEL.exe") <> "" And Not refExists("excel") Then
    Access.References.AddFromFile ("C:\Program Files (x86)\Microsoft Office\Office12\EXCEL.exe")
End If
If Dir("C:\Program Files (x86)\Microsoft Office\Office14\EXCEL.exe") <> "" And Not refExists("excel") Then
    Access.References.AddFromFile ("C:\Program Files (x86)\Microsoft Office\Office14\EXCEL.exe")
End If
If Dir("C:\Program Files (x86)\Microsoft Office\Office12\EXCEL.exe") = "" And Dir("C:\Program Files (x86)\Microsoft Office\Office14\EXCEL.exe") = "" Then
    MsgBox ("ERROR: Excel not found")
End If

refExists引用了以下函数:

Private Function refExists(naam As String)
Dim ref As Reference
refExists = False
For Each ref In References
    If ref.Name = naam Then
        refExists = True
    End If
Next
End Function

答案 1 :(得分:3)

如果您发运了MDE / ACCDE,则无法更新您的参考文献。

但具体的参考文献是什么导致你的问题?您有可能引用Word,Excel或Outlook。如果是这样,请使用后期绑定,因此您的解决方案与客户端系统上安装的版本无关。

延迟绑定意味着您可以安全地删除引用,并且只有在应用程序执行相关代码行时才会出错。而不是在启动应用程序时出错并且根本不允许应用程序中的用户。或者当遇到mid,left或trim函数调用时。

当您不知道外部应用程序的哪个版本将驻留在目标系统上时,这也非常有用。或者,如果您的组织正处于从一个版本移动到另一个版本的过程中。

有关更多信息,包括其他文字和一些详细链接,请参阅“Late Binding in Microsoft Access”页面。

答案 2 :(得分:2)

这是一个示例 - 它检查某些引用 - 删除它们并导入Access 2000变体。只是为了确保所有客户端使用相同(最低)版本的依赖项

Sub CheckReference()
' This refers to your VBA project.
    Dim chkRef As Reference ' A reference.

    Dim foundWord, foundExcel As Boolean

    foundWord = False
    foundExcel = False

    ' Check through the selected references in the References dialog box.
    For Each chkRef In References


        ' If the reference is broken, send the name to the Immediate Window.
        If chkRef.IsBroken Then
           Debug.Print chkRef.Name
        End If

        If InStr(UCase(chkRef.FullPath), UCase("MSWORD9.olb")) <> 0 Then
            foundWord = True
        End If

        If InStr(UCase(chkRef.FullPath), UCase("EXCEL9.OLB")) <> 0 Then
            foundExcel = True
        End If

        If InStr(UCase(chkRef.FullPath), UCase("MSWORD.olb")) <> 0 Then
            References.Remove chkRef
        ElseIf InStr(UCase(chkRef.FullPath), UCase("EXCEL.EXE")) <> 0 Then
            References.Remove chkRef
        End If


    Next

    If (foundWord = False) Then
        References.AddFromFile ("\\pathto\database\MSWORD9.OLB")
    End If

    If (foundExcel = False) Then
        References.AddFromFile ("\\pathto\database\EXCEL9.OLB")
    End If

End Sub

答案 3 :(得分:1)

这是一个代码示例,用于检查损坏的引用。我知道这不是你的整个解决方案,但它会为你提供一些线索。

Public Function CheckRefs()
    On Error GoTo Handler

    Dim rs As Recordset
    Dim ref As Reference
    Dim msg As String

    For Each ref In Application.References
        ' Check IsBroken property.
        If ref.IsBroken = True Then
            msg = msg & "Name: " & ref.Name & vbTab
            msg = msg & "FullPath: " & ref.FullPath & vbTab
            msg = msg & "Version: " & ref.Major & "." & ref.Minor & vbCrLf
        End If
    Next ref

    If Len(msg) > 0 Then MsgBox msg
    Exit Function

Handler:
    ' error codes 3075 and 3085 need special handling

    If Err.Number = 3075 Or Err.Number = 3085 Then
        Err.Clear
        FixUpRefs
    Else
        rs.Close
        Set rs = Nothing
    End If
End Function

Private Sub FixUpRefs()
    Dim r As Reference, r1 As Reference
    Dim s As String

    ' search the first ref which isn't Access or VBA
    For Each r In Application.References
        If r.Name <> "Access" And r.Name <> "VBA" Then
            Set r1 = r
            Exit For
        End If
    Next
    s = r1.FullPath

    ' remove the reference and add it again from file
    References.Remove r1
    References.AddFromFile s

    ' hidden syscmd to compile the db
    Call SysCmd(504, 16483)
End Sub