window.dataLayer = window.dataLayer || []; function gtag(){dataLayer.push(arguments);} gtag('js', new Date()); gtag('config', 'G-TCJTE9L38H');

Erweitern der VBA-IDE: CommandBars

Lies diesen Artikel und viele weitere mit einem kostenlosen, einwöchigen Testzugang.

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.

Verweis auf die Office-Bibliothek

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.

Ende des frei verfügbaren Teil. Wenn Du mehr lesen möchtest, hole Dir ...

Testzugang

eine Woche kostenlosen Zugriff auf diesen und mehr als 1.000 weitere Artikel

diesen und alle anderen Artikel mit dem Jahresabo

Schreibe einen Kommentar