Добавить ссылки программно
у нас есть Access-приложение, которое не работает на некоторых клиентах, главным образом потому, что ссылки нарушены. Это происходит, например, когда вы запускаете приложение доступа с временем выполнения доступа 2007, но имеете офис в версии 2003 или 2000. Такие функции, как Left/Right/Trim и т.д., Просто перестают работать.
Я думаю, что единственный способ исправить эту проблему - это программно проверить, какая версия Office установлена и добавить ссылки программно, как в этих гетерогенных средах, мы не можем контролировать то, что пользователь установил. В частности, мне нужно ссылаться на библиотеки объектов Microsoft Office для Excel и Word.
Но у меня нет указаний на все служебные версии и не знаю, как их автоматически проверять.
Ответы
Ответ 1
Если вы отправляете MDE/ACCDE, вы не можете обновлять свои ссылки.
Но какие конкретные рекомендации вызывают у вас проблемы? Скорее всего, вы ссылаетесь на Word, Excel или Outlook. Если это так, используйте последнее связывание, поэтому ваше решение не имеет значения, какая версия установлена в клиентской системе.
Позднее связывание означает, что вы можете безопасно удалить ссылку и только иметь ошибку, когда приложение выполняет строки кода, о котором идет речь. Вместо ошибок при запуске приложения и вообще не разрешать пользователям в приложении. Или при нажатии на вызов функции mid, left или trim.
Это также очень полезно, когда вы не знаете, какая версия внешнего приложения будет находиться в целевой системе. Или если ваша организация находится в середине перехода от одной версии к другой.
Для получения дополнительной информации, включая дополнительный текст и некоторые подробные ссылки, см. страницу Late Binding in Microsoft Access.
Ответ 2
Так что да, этот ответ немного запоздал, но на всякий случай кто-то споткнулся об этом, как будто я искал ответ, я вычислил следующий бит кода, чтобы добавить ссылку 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
Ответ 3
Вот пример кода, который проверяет неработающие ссылки. Я знаю, что это не все решение для вас, но это даст вам некоторые подсказки, как это сделать.
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
Ответ 4
Вот пример - он проверяет определенные ссылки - удаляет их и импортирует вариант 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