Kategorie szkoleń | Egzaminy | Kontakt
  • 3
  • 0
  • 1

Udostępniłem użytkownikom bazę (Interfejsem użytkownika jest z Access, a tabele są na Serwerze). Przy jej tworzeniu korzystałem z MS Offica 2010. Aplikację zamieściłem na wspólnej witrynie SharePoint skąd każdy użytkownik może sobie ją pobrać.

Jeżeli użytkownik A  (który posiada Office 2010) zamiast pobrać z witryny SharePoint, otrzyma bazę od użytkownika B (który posiada Office 2013 lub nowszy, to pojawia się błąd, który wynika z odwołań do nowszych referencji vba. Moje pytanie:

Jak sprawdzić zainstalowaną wersję bibliotek vba oraz jak je zaktualizować?

Znalazłem przykłady jak to zrobić w Excelu lub Wordzie (linki poniżej), ale nie udaje mi się dostosować tego kodu do Accessa.

https://support.microsoft.com/sl-si/help/308340/how-to-check-and-remove-incorrect-project-references-in-the-visual-bas

http://www.vbaexpress.com/kb/getarticle.php?kb_id=267

 

Dariusz_Kępiński
  • Zapytał
  • @ Dariusz_Kępiński | 09.04.2018
    • 7
    • 3
    • 5
Komentarze (1)
Do jakich bibliotek się odwołujesz? Może wystarczy przerzucić się na późne wiązanie?
Skomentował : @ Mirosław_Janiak ,10.04.2018
  • 1
  • 7
  • 1

Odpowiedzi (3)

  • 1

Mam nadzieję, że zadziała. Funkcje dodają i usuwają referencje, ale nie mam takiego przypadku, w którym IsBroken daje wartość True, więc nie mogę sprawdzić czy wszystko zadziała jak należy.

Function ZamienReferencje() As Boolean
Dim NazwaRef As String, x As Integer, i As Integer
On Error GoTo PrzyBłędzie

ZamienReferencje = False

x = Application.References.Count

For i = 1 To x
If Application.References.Item(i).IsBroken Then
    NazwaRef = Application.References.Item(i).Name
    Application.References.Remove Application.References.Item(NazwaRef)
    Application.References.AddFromFile Application.References.Item(NazwaRef).FullPath
End If

Next i

ZamienReferencje = True

KoniecPracy:
Exit Function

PrzyBłędzie:
MsgBox Err.Number & ". " & Err.Description
Resume KoniecPracy

End Function

 

Tomasz_Kasprzycki
  • Odpowiedział
  • @ Tomasz_Kasprzycki | 09.04.2018
    • 2
    • 4
    • 8
  • 0

Przerobiłem funkcję na procedure i trochę zmieniłem kod do postaci poniżej:

 For i = 1 To Application.References.Count
        If Application.References.Item(i).IsBroken Then
            NazwaRef = Application.References.Item(i).Name
            Application.References.Remove Application.References.Item(NazwaRef)
            Application.References.AddFromFile Application.References.Item(NazwaRef).FullPath
        End If

Next i

Jednak w przypadku gdy isbroken = true pojawia się komunikat:

Run-time error 48
Error in loading DLL

Niemniej dziękuję za zainteresowanie tematem.

 

 

 

Dariusz_Kępiński
  • Odpowiedział
  • @ Dariusz_Kępiński | 10.04.2018
    • 7
    • 3
    • 5
Komentarze
A przy której linijce pojawia się błąd?
Może nie powinno być: Application.References.Remove Application.References.Item(NazwaRef)?
Skomentował : @ Tomasz_Kasprzycki ,10.04.2018
  • 2
  • 4
  • 8
I może to będzie pomocne:
https://support.microsoft.com/en-us/help/857136/vb-runtime-error-48-unable-to-load-dll
Skomentował : @ Tomasz_Kasprzycki ,10.04.2018
  • 2
  • 4
  • 8
https://docs.microsoft.com/en-us/previous-versions/visualstudio/visual-basic-6/aa232611(v=vs.60)
Skomentował : @ Tomasz_Kasprzycki ,10.04.2018
  • 2
  • 4
  • 8
Błąd pojawia się przy linijce: Application.References.Item(i).IsBroken
Skomentował : @ Dariusz_Kępiński ,10.04.2018
  • 7
  • 3
  • 5
Jeżeli IsBroken ma wartość True, to nie można odczytać Name i FullPath
Być może trzeba spróbować tak:
If Application.References.Item(i).IsBroken Then
Application.References.AddFromFile Application.References.Item(i).FullPath
End If
Skomentował : @ Tomasz_Kasprzycki ,10.04.2018
  • 2
  • 4
  • 8
  • 1

Spróbowałbym jeszcze poprzez AddFromGUID:

For i = 1 To x
If Application.References.Item(i).IsBroken Then
    GUIDRef = Application.References.Item(i).Guid
    a = Application.References.Item(i).Major
    b = Application.References.Item(i).Minor
    Application.References.AddFromGuid GUIDRef, a, b
End If

Next i

 

Tomasz_Kasprzycki
  • Odpowiedział
  • @ Tomasz_Kasprzycki | 10.04.2018
    • 2
    • 4
    • 8