Neuigkeiten:

Wenn ihr euch für eine gute Antwort bedanken möchtet, im entsprechenden Posting einfach den Knopf "sag Danke" drücken!

Mobiles Hauptmenü

Verweise (Excel, Outlook) automatisch von 16.0 auf 14.0 object library setzen

Begonnen von Ken, Oktober 18, 2016, 17:46:09

⏪ vorheriges - nächstes ⏩

markusxy

@MaggieMay,
das Löschen der Verweise deshalb, weil fehlende Verweise im Gegensatz zu nicht vorhandenen Verweisen zu nicht abfangbaren Fehlern führen.
Wie könnte also dieses Handeln bei Bedarf aussehen, ohne dass es zu einer Fehlermeldung kommt?
Falls du da eine Lösung kennst, bitte ich darum. Das Prinzip in Stichworten reicht.

LG Markus

Josef P.

Hallo!

[eventuell etwas OT / Entwickeln mit unterschiedlichen Access-Versionen]

Von einer ähnlichen Lästigkeit kann ich berichten. ;)
Ich muss hin und wieder eine Anwendung mit Access 2016 weiterentwickeln, die aber hauptsächlich mit Access 2010 genutzt wird. Die accde erstelle ich natürlich mit Access 2010.
Zur Entwicklungszeit verwende ich gerne Early Binding - also sind die Verweise in der Anwendung eingestellt. Öffne ich die accdb mit Access 2016 wird ohne Probleme von den Office 2010-Verweisen (Excel, Word, ..) auf die 2016er-Version geändert.
Öffne ich später die accdb wieder mit Access 2010 passen die Verweise nicht mehr. Korrigieren kann man diese nur durch Löschen und erneutem Einbinden.
Da das manuelle Löschen und erneute Einbinden mit dem Verweisdialog umständlich ist, eine Variante, die etwas schneller zum Ziel führt:


  • GUID der defekten Verweise ermitteln (Kann man per Code durchlaufen oder man kennt die GUIDs für Word & Co.
  • Verweise manuell löschen (Application.References.Remove funktioniert bei defekten Verweisen leider nicht)
  • Verweise per Code wieder einbinden (siehe Code)

Einbinden von Verweisen:
Application.References.AddFromGuid "GUID-String des Verweises", 0, 0

Die Parameter Major und Minor auf 0 einstellen, dann muss man sich beim Code nicht um die benötigte Version kümmern. (Anm.: GUID für Word, Excel und Co. ist von Office 2016 und 2010 identisch.)

mfg
Josef


markusxy

Danke Josef, was würden wir nur ohne dich tun?

Kann man sich auf diese Parameter Major und Minor verlassen, oder hattest du da auch schon Probleme?
Bei einer accde kann ich die Verweise ja nicht ändern.
Late Binding schön und gut, aber ich nutzt halt oft Events von COM Klassen.
LG Markus

MaggieMay

Hallo,
ZitatWie könnte also dieses Handeln bei Bedarf aussehen, ohne dass es zu einer Fehlermeldung kommt?
der Trick dabei ist, dass du in den - möglichst in ein separates Modul verpackten - beim DB-Start auszuführenden Prozeduren die dort benutzten Funktionen qualifiziert ansprichst, bspw. mit "VBA.Left", dann werden sie auch gefunden und der zur Prüfung und Reparatur benötigte Code kann problemlos durchlaufen.

PS:
ZitatVerweise manuell löschen (Application.References.Remove funktioniert bei defekten Verweisen leider nicht)
Da habe ich aber andere Erfahrungen gemacht - wovon mag das abhängen?

@Markus:
Bei einer ACCDE funktioniert die Reparatur natürlich nicht - leider.
Freundliche Grüße
MaggieMay

Josef P.

@Markus:
Ich nutze das nur für die Office-Anwendungen (Word, Excel und Outlook). Bei diesen Verweisen funktionierte das mit Guid + 0 für Major und Minor. (Falls Interesse besteht, kann ich das VB-Script zum Download bereitstellen, mit dem ich meine Entwickler-Version korrigiere.)

Bezüglich accde:
Da das Ändern der Verweise nicht möglich ist, kannst du nur versuchen, die accde mit der niedrigsten Version erstellen, und hoffen, dass die Abwärtskompatiblität erhalten bleibt.

Falls du nicht zu viele Events benötigst, könntest du diese auch bei Late-Binding verwenden. Ist aber viel umständlicher zu programmieren als über eingebundene tlb/dll-Verweise.
(Das zu beschreiben weicht aber zu sehr vom Thread-Thema ab.)

@MaggieMay
Zitat
ZitatVerweise manuell löschen (Application.References.Remove funktioniert bei defekten Verweisen leider nicht)
Da habe ich aber andere Erfahrungen gemacht - wovon mag das abhängen?
Bei mir kommt unter Access 2010: Runtime error '48': Error in loading DLL
Funktioniert bei dir das Entfernen eines defekten Word-2016-Verweises, wenn auf dem PC ein Word 2010 installiert ist?

LG
Josef

MaggieMay

Hi,
ZitatLate Binding schön und gut, aber ich nutzt halt oft Events von COM Klassen.
das Thema dieses Threads ist aber ein anderes...
Freundliche Grüße
MaggieMay

Ken

@MaggieMay

hier ist wie versprochen der Code (aus dem Netz, nicht von mir!)

Function CheckRefs()
Dim db As Database, rs As RecordsetDim x
Set db = CurrentDb

On Error Resume Next
'Stop
' Führt die Abfrage TestVerweise aus,um das Auftreten des Fehlers
' zu testen
Set rs = db.OpenRecordset("TestVerweise", dbOpenDynaset)
x = rs!ausdr1
' Wenn Sie nun den Fehler 3075 sehen, informieren Sie die
' Benutzer, daß Sie die Anwendung bearbeiten müssen.
' Fehler 3075 steht für folgende Meldung:
' "Funktion steht in Ausdrücken nicht zur Verfügung"

If Err.Number = 3075 Then
MsgBox "Diese Anwendung hat neuere Versionen " _
& "benötigter Dateien auf Ihrem Computer entdeckt. " _
& "Es kann einige Minuten dauern, Ihre Anwendung " _
& "erneut zu kompilieren."
Err.Clear
FixUpRefs
End If
End Function

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

' Sucht die erste Referenz in der Datenbank, die weder
' Access noch Visual Basic for Aplications ist.
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

' Entfernt den Verweis und setzt ihn wieder ein.
References.Remove r1
References.AddFromFile s

' Ruft einen versteckten SysCmd-Befehl auf, um alle Moduleder
' Datenbank zu kompilieren bzw. zu speichern.
Call SysCmd(504, 16483)
End Sub
Gruß
Ken


Office 2010

markusxy

Zitat von: Josef P. am Oktober 18, 2016, 22:28:51
@Markus:
Ich nutze das nur für die Office-Anwendungen (Word, Excel und Outlook). Bei diesen Verweisen funktionierte das mit Guid + 0 für Major und Minor. (Falls Interesse besteht, kann ich das VB-Script zum Download bereitstellen, mit dem ich meine Entwickler-Version korrigiere.)

Ich schau mir immer gerne Code von Profis an, ansonsten schreibe ich ihn lieber selber - der TS könnte ihn ja auch gut gebrauchen.

Wenn ich das jetzt richtig verstanden habe, ist Late Binding im Bereich Office absolut überflüssig und kontraproduktiv?
Oder gibt es dennoch Gründe die dafür sprechen?
LG Markus

Josef P.

Hallo!

Mein Script zum Reparieren der Office-Verweise in der accdb/mdb: RepairReferences.vbs
Das Script hilft natürlich nur dem Entwickler während der Anwendungserstellung. Für die Anwender ist das nicht brauchbar.
Ich verwende das Script per Drag&Drop - also einfach die zu reparierende accdb/mdb über die Script-Datei schieben. Alternativ kann man auch nur das Script starten, dann kommt eine Auswahldialog um die Access-Datei auszuwählen.

[OT]
ZitatWenn ich das jetzt richtig verstanden habe, ist Late Binding im Bereich Office absolut überflüssig und kontraproduktiv?
Oder gibt es dennoch Gründe die dafür sprechen?
Wenn ich Early-Binding nicht benötige, bevorzuge ich Late-Binding (bei der Anwendungsauslieferung), da dadurch kein Nachteil entsteht und die Anwendung auch läuft, falls einmal kein Word o. ä. installiert ist. Dann kracht es zwar trotzdem bei CreateObject("Word.Application"), aber der Rest der Anwendung läuft.

Wenn ich aber davon ausgehen kann, dass alle Anwender eine identische Software-Installation haben (was bei meinen Kunden durchaus ausreichend gegeben ist), sehe ich Early Binding nicht so kritisch. Ich bin sogar dagegen, dass man Late Binding als Paradigma betrachtet. Es hängt einfach vom jeweiligen Anwendungsfall ab, was im sinnvollsten ist.
Wenn man sich natürlich mit Early Binding Fehler einfängt, war es die falsche Wahl. ;)

LG
Josef


MaggieMay

Hi,
ZitatWenn ich das jetzt richtig verstanden habe, ist Late Binding im Bereich Office absolut überflüssig und kontraproduktiv?
ich sehe das genau umgekehrt, gute Gründe dafür wurden bereits mehrfach genannt.
Gerade bei Office-Programmen würde ich (in der Auslieferungsversion einer Anwendung) Late-Binding einsetzen, da hiermit keine Probleme zu erwarten sind. Selbst wenn der Anwender eine benötigte Komponente nicht installiert hat (und dementsprechend auf die jeweilige Funktionalität verzichten muss), ist das auf diese Weise noch am ehesten behandelbar.

Dass eine einheitliche Systemumgebung vorhanden ist, kann man wohl eher selten voraussetzen.
Freundliche Grüße
MaggieMay

markusxy

@Maggie, danke für deine Argumente.
@Josef, mit VB Script habe ich mich noch nicht beschäftigt. Bei Zeiten werde ich das aber.
Was mich mehr interessiert, Events bei Late Binding. Wie geht das.

@Ken, hast du die Lösung von Josef - lediglich den Verweis zu verändern - verstanden?