我们有一个Access-Application,它在某些客户端上不起作用,主要是因为引用被破坏了。例如,当您使用访问运行时2007启动访问应用程序但安装了版本2003或2000的办公室时,就会发生这种情况。左/右/修剪等功能就此停止工作。
我认为解决此问题的唯一方法是以编程方式检查安装了哪个办公室版本并以编程方式添加引用,因为在这些异构环境中我们无法控制用户安装的内容。具体来说,我需要引用Excel和Word的Microsoft Office对象库。
但我既没有所有办公室版本的指南,也没有线索如何自动检查它们。
答案 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