Menüschaltflächen lösen Funktionen in Formularmodulen ausWas für Ribbons gilt, funktioniert auch bei Menüs, Symbolleisten und Kontextmenüs: Die für die Eigenschaft OnAction angegebene Funktion wird auch ausgelöst, wenn sie sich als privat deklarierte Funktion im Klassenmodul des aktuell im Fokus befindlichen Formulars befindet. BeispieldatenbankDie Beispieldatenbank zu diesem Artikel finden Sie unter dem folgenden Link.

Private Funktion auslösenStellen Sie sich einmal vor, Sie zeigen eine benutzerdefinierte Symbolleiste zu einem bestimmten Formular an oder öffnen von diesem aus ein benutzerdefiniertes Kontextmenü. Alles schön und gut: Die durch die Steuerelemente der Menüs ausgelösten Funktionen werden öffentlich deklariert in einem Standardmodul untergebracht, und gut. Allerdings ist das nicht besonders wartungsfreundlich: Code, der in Zusammenhang mit einem Formular ausgelöst wird, sollte sich möglichst auch in dessen Klassenmodul befinden (außer natürlich, der Code wird an mehreren Stellen innerhalb der gleichen Anwendung aufgerufen).
Alles kein Problem: Entgegen gängiger Meinungen können Sie die Funktion, die Sie für die OnAction-Eigenschaft eines Menüsteuerelements angeben, auch im Klassenmodul eines Formulars hinterlegen - sogar als privat deklarierte Funktion!
Schauen wir uns ein Beispiel an. Die folgende Routine erzeugt auf die schnelle einen neuen Eintrag in der Menüleiste einer Datenbank unter Access 2003 und älter:
Public Sub AddSampleButton() Dim cbr As Office.CommandBar Dim cbc As Office.CommandBarButton Set cbr = CommandBars("Menu bar") On Error Resume Next cbr.Controls("TestAction").Delete On Error GoTo 0 Set cbc = cbr.Controls.Add(1, , , , True) With cbc .OnAction = "=TestAction()" .Caption = "TestAction" .Visible = True .Style = msoButtonCaption End With End Sub
Wenn Sie im gleichen Standardmodul (oder einem beliebigen anderen) die folgende Funktion hinterlegen, wird diese bei Betätigung des Menüsteuerelements anstandslos ausgeführt:
Public Function TestAction() MsgBox "Öffentliche Funktion aus einem Standardmodul ausgelöst." End Function
Was aber, wenn wir eine Funktion wie die folgende im Klassenmodul eines Formulars unterbringen?
Private Function TestAction() MsgBox "Private Funktion aus dem Klassenmodul eines Formulars ausgelöst." End Function
Ganz einfach: Wenn dieses Formular zum Zeitpunkt der Betätigung des Menüsteuerelements den Fokus besitzt, führt Access die private Funktion aus dem Klassenmodul dieses Formulars aus.
Somit können Sie für erheblich mehr Ordnung im Code Ihrer Datenbank sorgen, wenn Sie Symbolleisten und Kontextmenüs in Zusammenhang mit Formularen verwenden und die durch die in den Menüs enthaltenen Steuerelementen ausgelösten Funktionen in externen Standardmodulen untergebracht haben. |