Symbole in Symbolleisten mit VBA ein- und ausschalten

Symbole in Symbolleisten verΣndern ihre Farbe in grau und funktionieren dann auch nicht mehr, wenn ihre Ausfⁿhrung zum gegenwΣrtigen Zeitpunkt keinen Sinn ergibt. So sind zum Beispiel die Symbole fⁿr ╗Ausschneiden½ und ╗Kopieren½ grau und ohne Funktion, wenn das Dokument keine Markierung enthΣlt. Wie erreiche ich diesen Effekt fⁿr eigene Symbolleisten, die ich in meinen selbstprogrammierten VBA-Anwendungen nutze?

Auf Ihre allgemeine Frage nach der Steuerung des beschriebenen Effekts in VBA-Programmen m÷chten wir die L÷sung an einer Access-97-Anwendung beschreiben und demonstrieren, die Sie auf der Heft-CD finden. CHIP-Code SYMBOL. Bei anderen VBA-Programmen funktioniert es ganz genauso wie bei diesem.
Microsoft bezeichnet sowohl Menⁿ- als auch Symbolleisten allgemein als Befehlsleisten, mit deren Hilfe der Anwender seine Anwendung steuern kann. Wenn Sie mit Befehlsleisten programmieren m÷chten, mⁿssen Sie allerdings zuerst einen Verweis auf die ╗Microsoft Office Object Library½ erzeugen.
Dazu ÷ffnen Sie in Access 97 ein Modul in der Entwurfsansicht, wΣhlen im Kontext-Menⁿ den Befehl ╗Extras | Verweise½ und aktivieren das KontrollkΣstchen neben dem Eintrag ╗Microsoft Office 8.0 Object Library½.
Ein Bestandteil dieser Bibliothek ist das Objekt ╗CommandBar½, das wiederum die Auflistung ╗Controls½ enthΣlt. Mit Hilfe dieser Objekte und deren Eigenschaften kann die VBA-Funktion ╗SwitchCtl()½ zwischen dem aktiven und deaktiven Zustand einzelner Symbole einer Symbolleiste wechseln.
Der ╗Set½-Befehl erzeugt mit dem an die Funktion ⁿbergebenen Namen der Symbolleiste das ben÷tigte Objekt ╗CommandBar½. ▄ber die ╗Controls½-Auflistung kann die Funktion nun in einer ╗For Each½-Schleife auf die einzelnen Symbole - Objekte des Typs ╗Office.CommandBarControl½ - dieser Symbolleiste zugreifen.
Hierbei vergleicht die Funktion die ebenfalls ⁿbergebene ID des gesuchten Symbols mit den IDs der in der Auflistung enthaltenen Objekte. Sollten die IDs identisch sein, setzt die Funktion die Eigenschaft ╗Enabled½ des Objekts: Beim Wert ╗True½ ist das Symbol aktiviert; bei ╗False½ wird das Symbol grau und lΣ▀t sich nicht mehr ausfⁿhren.
Auf die ╗CommandBarControl½-Objekte k÷nnen Sie auch ⁿber einen Index zugreifen, doch im Gegensatz zur ID verΣndert sich der Index des Symbols, falls ein Anwender die Reihenfolge der Symbole Σndert. Ein Vergleich ist sicherer. Dabei hilft die VBA-Prozedur ╗ListCtlId½.

Listing 1: Funktion SwitchCtl ()

Public Function SwitchCtl (Symbolleiste As String, CtlId As Long) As Boolean

Dim cbr As Office.CommandBar

Dim cbrCtl As Office.CommandBarControl

' StandardRⁿckgabe ist FALSE

SwitchCtl = False

' Richtige Symbolleiste ansprechen

Set cbr = Application.CommandBars (Symbolleiste)

For Each cbrCtl In cbr.Controls

If cbrCtl.Id = CtlId Then

If cbrCtl.Enabled = True Then

cbrCtl.Enabled = False

SwitchCtl = True

Else

cbrCtl.Enabled = True

SwitchCtl = True

End If

End If

Next cbrCtl

End Function



Listing 2: Funktion ListCtlId

Public Sub ListCtlId (Symbolleiste As String)

Dim cbr As Office.CommandBar

Dim cbrCtl As Office.CommandBarControl

' Richtige Symbolleiste ansprechen

Set cbr = Application.CommandBars (Symbolleiste)

For Each cbrCtl In cbr.Controls

MsgBox cbrCtl.Id

Next cbrCtl

End Sub