Für unbestimmte Zeit bieten Addison-Wesley und André Minhorst den kompletten Inhalt des Buchs als Download an. Schauen Sie rein und informieren Sie sich über den Inhalt! Und wenn Ihnen das Buch nützlich erscheint und Sie glauben, dass Sie etwas gelernt haben oder durch das Gelesene sogar etwas Zeit und somit Geld bei Ihrer Arbeit einsparen konnten, können Sie sich ja beim Autor und beim Verlag revanchieren - beispielsweise durch den Kauf dieses Buchs.
Am schönsten wäre es natürlich, wenn Sie das Buch direkt hier bestellen - Sie erhalten das Buch dann direkt vom Verlag, und der Autor und Verlag haben dann noch mehr davon, als wenn Sie es anderswo kaufen.
Wenn Sie einmal ein Ribbon mit mehr als nur einem tab-Element mit wenigen Unterelementen und passenden Callback-Funktionen bestücken, bekommen Sie möglicherweise Probleme bei der Vergabe der Namen für die Callback-Funktionen. Die Beispiele verwenden ja meist Routinennamen, die dem Namen der Ereigniseigenschaft bis auf den großgeschriebenen Anfangsbuchstaben gleichen.
Wenn Sie auch so vorgehen möchten, müssen Sie berücksichtigen, dass es auch einmal mehr als ein Steuerelement geben kann, für das Sie etwa eine Routine namens OnAction anlegen möchten.
In diesem Fall haben Sie zwei Möglichkeiten:
Sie verwenden für jede Callback-Routine jedes Elements einen eindeutigen Namen.
Sie verwenden für jede Ereignisart eine Routine, die jeweils das auslösende Steuerelement auswertet - etwa mit einem Select Case über den per Parameter übergebenen Steuerelementnamen.
Callback-Routinen mit eindeutigem Namen
Im ersten Fall weisen Sie den zu erstellenden Routinen Namen zu, die eindeutig sind und dennoch dem Element zugeordnet werden können (sonst entsteht schnell ein sehr unübersichtlicher Berg von Callback-Funktionen).
So können Sie etwa das label- oder id-Attribut des Steuerelements integrieren und die Bezeichnung btnBeispiel_onChange verwenden. Und wenn verschiedene group- oder tab-Elemente Steuerelemente gleichen Namens enthalten, bauen Sie eben auch noch das label- oder id-Attribut der übergeordneten Elemente mit ein.
Im Extremfall würde eine Callback-Routine dann beispielsweise tabMain_grpDateien_btnOeffnen_onAction heißen.
Eine Callback-Routine für alle Elemente
Bei der zweiten empfehlenswerten Variante legen Sie tatsächlich nur eine Callback-Routine für jedes Ereignis wie etwa onAction oder getDescription an, deren Name beispielsweise der Attributbezeichnung mit großem Anfangsbuchstaben entspricht (also OnAction oder GetDescription). Beim Aufruf einer solchen Funktion wertet diese dann den Parameter control aus, der übrigens in allen Callback-Funktionen enthalten ist. Das sieht dann beispielsweise wie im folgenden Listing aus:
Public Sub OnAction(ctl As IRibbonControl) Select Case ctl.id Case "btnBeispielschaltflaeche1" 'tu was Case "btnBeispielschaltflaeche2" 'tu was anderes Case Else MsgBox "Unbekannte Schaltfläche!" End Select End Sub
Listing 12.6: Diese Routine wertet aus, von welchem Steuerelement sie aufgerufen wurde, und reagiert mit der für dieses Element vorgesehenen Aktion
Leider kommen Sie damit nicht allzu weit: Wie Sie Tabelle 12.3 entnehmen können, besitzen Callback-Funktionen für gleichnamige Ereigniseigenschaften durchaus nicht immer die gleiche Syntax.
Die obige Routine entspricht etwa der Syntax für ein button-Element, die Syntax für die onAction-Callback-Routine eines dropDown-Elements hingegen sieht so aus:
Sub OnAction(control As IRibbonControl, selectedId As String, selectedIndex As Integer)
Und da Access einen Fehler meldet, wenn eine Callback-Funktion die falschen Parameter enthält (vorausgesetzt, Sie haben wie oben beschrieben die Fehlerbehandlung für Ribbons aktiviert), müssen Sie zumindest für jede Steuerelementart eine Callback-Funktion mit einem eigenen Namen anlegen. Beim onAction-Attribut könnte diese etwa OnButtonAction,OnCheckBoxAction,OnDropDownAction,OnGalleryAction oder OnToggleButtonAction heißen. Die Klasse (genauer: das Interface) IRibbonControl ist übrigens in der MicrosoftOffice12.0Library definiert, die Sie deshalb den Verweisen des VBA-Projekts hinzufügen müssen. Sie hat die folgenden Eigenschaften:
ID: Gibt die in der XML-Definition für das Steuerelement festgelegte und obligatorische ID zurück.
Context: Gibt einen Objektverweis auf die Anwendung des Ribbons zurück. Bei Access handelt es sich hierbei um das Application-Objekt.
Tag: Gibt eine Zeichenfolge zurück, die Sie optional in der XML-Definition für das Steuerelement angegeben haben. Beispiel:
Fehler in Callback-Routinen
Falls die Deklaration der Callback-Funktion nicht genau den Vorgaben entspricht, weil Sie fälschlicherweise etwa eine Deklaration wie in Listing 12.6 für ein dropDown-Element angegeben haben, dann meldet Access nicht etwa einen Syntaxfehler, sondern bemerkt lapidar: »Access kann die Makro- oder Rückrufaktion 'OnAction' nicht ausführen«. Die gleiche Meldung erscheint aber auch, wenn die Prozedur gar nicht existiert. Sollten Sie also feststellen, dass die betroffene Prozedur nicht fehlt, können Sie von einer fehlerhaften Deklaration der Parameter ausgehen. Access setzt das automatische Debugging von VBA bei allen Callback-Funktionen, die Eigenschaften zurückliefern, außer Kraft. Das bedeutet, dass bei Fehlern im VBA-Code der Callback-Routine nicht die übliche VBA-Fehlermeldung erscheint, sondern die Routine stillschweigend verlassen wird - so, als enthielte die Prozedur zu Beginn ein OnErrorResumeNext. Das macht das Debuggen dieser Routinen schwieriger. Wenn Sie vermuten, dass mit Ihrer Callback-Routine etwas nicht stimmt oder sie nicht das erwartete Ergebnis liefert, fügen Sie dem Code ganz vorne die Anweisung Stop hinzu. VBA unterbricht dann an dieser Stelle die Ausführung des Codes und lässt Sie im Einzelschritt (F8) die nächsten Code-Zeilen durchlaufen, den Ablauf untersuchen und Variableninhalte einsehen.