Symbole in Symbolleisten mit VBA ein- und ausschalten

Symbole in Symbolleisten verän- dern 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