Zur Hauptseite ... Zum Onlinearchiv ... Zum Abonnement ... Zum Newsletter ... Zu den Tools ... Zum Impressum ... Zum Login ...

Access-Assistenten manipulieren

Access-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.

Beispieldatenbank

Die 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 Einsatzzwecke

Der 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.

© 2003-2015 André Minhorst Alle Rechte vorbehalten.