Im zweiten Teil dieser Beitragsreihe haben Sie das Handwerkszeug für das Steuern der VBA-Entwicklungsumgebung und spezieil von Modulen und dem enthaltenen Code kennen gelernt. Im vorliegenden zweiten Teil geht es ans Eingemachte: Anhand praktischer Beispiele werden wir die VBA-Entwicklungsumgebung erweitern und dafür sorgen, dass die Erweiterungen von der Symbolleiste und dem Kontextmenü aus aufrufbar sind.
Beispieldatenbank
Die Beispiele dieses Artikels finden Sie in der Datenbank 1906_Commandbars.accdb.
Voraussetzungen
Für die Programmierung von Menüleisten mit Early Binding benötigen Sie einen Verweis auf die Bibliothek Microsoft Office x.0 Object Library. Diesen finden Sie in älteren Office-Versionen unter dieser Bezeichnung im Verweise-Dialog. In neueren Versionen heißt der Verweis einfach Office (siehe Bild 1). Nach dem Hinzufügen und dem erneuten öffnen des Dialogs wird die Bibliothek jedoch unter dem standardmäßigen Namen angezeigt.
Bild 1: Verweis auf die Office-Bibliothek
Einführung
Erweiterungen der VBA-Entwicklungsumgebung dienen häufig einer Vereinfachung der Quellcodeeingabe, um sich die Durchführung immer wiederkehrender oder komplizierter Aufgaben zu erleichtern.
Dazu gehört beispielsweise das Hinzfuügen einer Fehlerbehandlung zu einer Prozedur, einer Zeilennummerierung oder von Property Get– und Property Let– beziehungsweise Property Set-Prozeduren für bestimmte Variablen.
Eingabe von Klammern und Anführungszeichen
Eine zwar sehr klein erscheinende, aber dennoch auf Dauer nervende Aufgabe ist das Hinzufügen von Klammernpaaren sowie von einfachen oder doppelten Anführungszeichen. Damit ist nicht die Eingabe dieser Zeichen beim erstmaligen Anlegen einer Prozedur gemeint, sondern das nachträgliche Einfügen – etwa, wenn Sie eine MsgBox-Funktion nicht nur aufrufen, sondern auch den Rückgabewert ermitteln möchten. Die erste Variante sieht wie folgt aus:
MsgBox "Bitte klicken Sie auf Ja oder Nein.", vbYesNo
Variante mit Rückgabewert:
Debug.Print MsgBox("Bitte klicken Sie auf Ja oder Nein.", vbYesNo)
Das Anlegen der Klammern ist zwar kein allzu großer Aufwand, aber man könnte es auch vereinfachen, indem man beispielsweise den einzuklammernden Bereich markiert und auf eine Schaltfläche der Symbolleiste oder des Kontextmenüs des Moduls klickt.
Die Aussicht auf eine kleine Vereinfachung des Programmieralltags müssen Sie nun allerdings noch ein paar Abschnitte lang zurückstellen: Zunächst erfahren Sie, wie sich Menüs in die VBA-Benutzeroberfläche integrieren lassen, mit denen die Erweiterung aufgerufen werden kann.
Menüpunkte in der VBA-Entwicklungsumgebung anlegen
Die Verwendung von Menübefehlen und deren Erstellung wäre an sich kein Problem – wenn es nicht einen unsäglichen Bug gäbe, der die OnAction-Eigenschaft der Menüleisten-Steuerelemente untauglich macht.
Man könnte dann über den Anpassen-Modus der Menüleisten die gewünschten Schaltflächen hinzufügen, per OnAction-Eigenschaft die gewünschten Funktionen festlegen und diese in einem öffentlichen Modul speichern. Das Gleiche funktioniert zum Glück auch per VBA, allerdings nur mit einer alternativen Programmiertechnik zu der einfachen Verwendung der für die Eigenschaft OnAction hinterlegten Prozedur.
So muss man sich eines trickreichen Umweges behelfen, der folgendermaßen aussieht (siehe auch Listing 1):
<font color=blue>Option Compare Database</font>
<font color=blue>Option Explicit</font>
<font color=blue>Dim </font>colButtons<font color=blue> As </font>Collection
<font color=blue>Public Function </font>VBEMenueAn1egen()
<font color=blue>Dim </font>cbr<font color=blue> As </font>CommandBar
<font color=blue>Dim </font>objMenuEvents<font color=blue> As </font>clsMenuEvents
<font color=blue>Set</font> colButtons = <font color=blue>New</font> Collection
On Error Resume <font color=blue>Next</font>
Application.VBE.CommandBars("VBEErweiterungen").Delete
<font color=blue>On Error GoTo</font> 0
<font color=blue>Set</font> cbr = Application.VBE.CommandBars.Add("VBEErweiterungen")
cbr.Visible = <font color=blue>True</font>
cbr.Position = msoBarTop
<font color=blue>Set</font> objMenuEvents = <font color=blue>New</font> clsMenuEvents
<font color=blue>Set</font> objMenuEvents.objButtonBrakes = cbr.Controls.Add(msoControlButton)
<font color=blue>With</font> objMenuEvents.objButtonBrakes
.Style = msoButtonCaption
.Caption = "Klammern setzen()"
End <font color=blue>With</font>
colButtons.Add objMenuEvents
End Function
Listing 1: Standardmodul mit einer Funktion zum Anlegen einer neuen Symbolleiste mit einer Schaltfläche
Deklarieren Sie in einem öffentlichen Modul ein Col-lection-Objekt namens colButtons. Dieses wird später die einzelnen Schaltflächen-Objekte aufnehmen.
Die Anweisungen zum Erstellen der Symbolleiste und Anlegen der gewünschten Schaltflächen fassen Sie in einer Funktion namens VBEMenueAnlegen zusammen. Dort deklarieren Sie zunächst ein CommandBars-Element namens cbr und eine Objektvariable, die auf eine Instanz der Klasse clsMenu-Events verweist – diese Klasse schauen wir uns gleich im Anschluss an.
Als Erstes initialisieren wir die Auflistung colButtons mit der New-Anweisung.
Das Erstellen der Symbolleiste verläuft dann genauso, als ob Sie die Access-Oberfläche mit zusätzlichen Symbolleisten bestücken wollten. Sie fügen zur CommandBars-Auflistung des VBE-Objekts ein neues Element namens VBEErweiterungen hinzu, positionieren es oben bei den anderen Symbolleisten (cbr.Position = msoBarTop) und machen es sichtbar (cbr.Visible = True).
Nachdem die Symbolleiste vorhanden ist, erstellen wir eine neue Instanz der Klasse clsMenu-Events und bestücken die Symbolleiste mit einer Schaltfläche.
Dazu ruft die Prozedur die Add-Methode der Controls-Auflistung des CommandBar-Objekts auf. Das neue CommandBarButton-Objekt weist sie der öffentlichen Objektvariablen objButtonBrakes der Klasse clsMenu-Events zu.
Nach dem Einstellen der Eigenschaften Style und Caption landet die Instanz der Klasse objMenuEvents – und damit auch die referenzierte neue Schaltfläche – in der Auflistung colButtons.
Klassenmodul mit Button-Ereignis
Danach legen Sie mit dem Menübefehl Einfügen|Klassenmodul ein neues Klassenmodul namens clsMenuEvents an. Diesem fügen wir eine Objektvariable namens obj-ButtonBrakes hinzu und deklarieren sie mit dem Typ CommandBarButton.
Dabei verwenden wir das Schlüsselwort WithEvents, was uns erlaubt, die Ereignisprozeduren des Typs CommandBarButton in der gleichen Klasse zu implementieren. Um diese Ereignisprozedur anzulegen, wählen wir im linken Kombinationsfeld des Codefensters für das Klassenmodul einfach den Namen der Va-ri-ablen objButtonBrakes aus. Da für dieses nur das Er-eig-nis Click vorgesehen ist, wird die entsprechende Er-eig-nisprozedur so direkt angelegt (siehe Bild 2).
Bild 2: Hinzufügen einer Ereignisprozedur für die Schaltfläche
Das Ergebnis sieht so aus wie in Listing 2. Sie brauchen nur noch eine MsgBox-Anweisung hinzuzufügen. Wenn Sie diese gleich im Anschluss erfolgreich getestet haben, füllen Sie die Prozedur mit der eigentlichen Funktion.
<font color=blue>Public </font>WithEvents objButtonBrakes<font color=blue> As </font>ConmandBarButton
<font color=blue>Private Sub </font>objButtonBrakes_Click(ByVal ctrl<font color=blue> As </font>Office.ComnandBarButton, CancelDefault<font color=blue> As Boolean</font>)
<font color=blue>MsgBox</font> "Klammern anlegen"
End Sub
Listing 2: Die Klasse cIsMenuEvents mit einem Schaltflächenobjekt und der entsprechenden Methode
Menü mit Schaltfläche erstellen lassen
Möchten Sie weiterlesen? Dann lösen Sie Ihr Ticket!
Hier geht es zur Bestellung des Jahresabonnements des Magazins Access [basics]:
Zur Bestellung ...
Danach greifen Sie sofort auf alle rund 400 Artikel unseres Angebots zu - auch auf diesen hier!
Oder haben Sie bereits Zugangsdaten? Dann loggen Sie sich gleich hier ein: