Access-Assistenten manipulierenAccess-Assistenten können manchmal recht nützlich sein. Sie erledigen Dinge, für die man sonst selbst Hand anlegen müsste und von denen man im schlimmsten Fall gar nicht weiß, wie sie funktionieren. Noch besser wäre es allerdings, wenn man die Assistenten hier und da anpassen könnte. Dieser Artikel zeigt am Beispiel des Tabellenverknüpfungs-Assistenten, wie dies funktioniert.
BeispieldatenbankDie folgende Beispieldatenbank enthält ein Formular mit der beschriebenen Technik.

Auch Access kocht nur mit ... Access!Teile von Access wie etwa die Assistenten sind mit Access-Bordmitteln erstellt worden. Sie befinden sich in externen Datenbanken, die bei Bedarf verknüpft werden. Dies geschieht auch beim Anzeigen des Tabellenverknüpfungsmanagers, mit dem man bestehende Verknüpfungen anpassen kann.
Ein Teilnehmer eines Forums stellte hier die Anforderung, dass doch das Kontrollkästchen "Neuen Speicherort immer bestätigen lassen" standardmäßig aktiviert sein sollte. Leider gibt Access aber keine Einstellung her, welche dies ermöglicht.
Abbildung 1: Das untere Kontrollkästchen soll standardmäßig aktiviert sein.
Also verwenden wir einen kleinen Trick, wobei vorausgesetzt wird, dass der Benutzer diesen Dialog von einem Formular aus öffnet (es geht auch anders, aber das hier ist für Beispielzwecke transparenter).
Das Formular enthält einen schlichte Schaltfläche, die den folgenden Code auslöst:
Private Sub cmdShowLinkManager_Click()
DoCmd.RunCommand acCmdLinkedTableManager
End Sub
Das ist keine Zauberei, es ist bekannt, dass man alle Menübefehle von Access auch mit der DoCmd.RunCommand-Methode aufrufen kann.
Nun gibt es aber das Problem, dass Access Dialoge wie diesen modal öffnet, das heißt, dass man erst nach dem Schließen des Dialogs wieder auf andere Objekte zugreifen kann und das auch der aufrufende Code erst dann weiterläuft. Man kann allerdings dafür sorgen, dass Routinen zeitgesteuert nach dem Aufruf des Dialogs aufgerufen werden.
Dazu verwendet man die Bei Zeitgeber-Ereignisprozedur des Formulars, die durch Einstellen der Zeitgeberintervall-Eigenschaft auf einen entsprechend kleinen Wert regelmäßig prüft, ob das Formular att_frmMain (so heißt der Tabellenverknüpfungs-Manager) geöffnet ist und, wenn dies der Fall ist, den Wert des Steuerelements chkAlwaysPrompt auf True einstellt:
Private Sub Form_Timer()
If IstFormularGeoeffnet("att_frmMain") Then
Forms("att_frmMain").Controls("chkAlwaysPrompt") = True
End If
End Sub
Public Function IstFormularGeoeffnet(strFormular As String) As Boolean
IstFormularGeoeffnet = SysCmd(acSysCmdGetObjectState, _
acForm, strFormular) > 0
End Function
Die Hilfsfunktion IstFormularGeoeffnet prüft dabei den Status des Formulars.
Nun erledigt das Formular mehr als die geforderte Aufgabe, denn der Benutzer kann die Option scheinbar noch nicht einmal mehr deaktivieren: Die Form_Timer-Prozedur schaltet sie immer wieder auf True.
Wenn das nicht passieren soll, verwendet man die folgende Variante:
Dim bolNotOpen As Boolean
Private Sub Form_Timer()
If IstFormularGeoeffnet("att_frmMain") Then
If Not bolNotOpen Then
Forms("att_frmMain").Controls("chkAlwaysPrompt") = True
bolNotOpen = True
End If
Else
bolNotOpen = False
End If
End Sub Mehr EinsatzzweckeDer Fragesteller zu dieser Lösung wollte den Dialog beeinflussen, um seinen Anwendern die Arbeit mit dem Dialog zu erleichtern. Genaugenommen ist das nur die Spitze des Eisbergs, denn man kann so alle als Access-Formular verfügbaren Dialoge so anpassen, dass auch unbedarfte Anwender sie verstehen - also beispielsweise durch das Ändern von Beschriftungen oder das Ausblenden von Steuerelementen, die aktuell nicht benötigte Funktionen enthalten. Wie geht's?Die einzige offene Frage dieses Artikels ist: Wie kommt man an die Formular- und Steuerelementnamen? Immerhin sind die Dialoge ja immer modal geöffnet und man kann die Formular- und Steuerelementnamen nicht über das Direktfenster abfragen (etwa mit Debug.Print Forms(0).Name).
Wenn man allerdings bei geöffnetem modalem Dialog auf die Zurücksetzen-Schaltfläche im VBA-Editor klickt, kann man wieder auf die Codefenster und das Direktfenster zugreifen und sich die benötigten Informationen zusammensuchen. |