Добавить ссылки программно

у нас есть 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