Mehr zum Thema Programmierung mit den Microsoft Office-Befehlsleisten

Veröffentlicht: 23. Sep 2002 | Aktualisiert: 22. Jun 2004

Von Paul Cornell

In der Kolumne des vorigen MonatsHier verlassen Sie die Website von Microsoft Deutschland habe ich Ihnen die Befehlsleisten vorgestellt. Dabei handelt es sich um Komponenten der Benutzeroberfläche, die im gesamten Microsoft Office-Paket zum Durchführen von Aktionen in Office-Anwendungen verwendet werden. Aufgrund der Rückmeldungen zur Kolumne des vorigen Monats möchte ich Ihnen hiermit einige zusätzliche Informationen und Codebeispiele für spezielle Probleme bei Befehlsleisten geben:

Auf dieser Seite

Befehlsleisten und das Outlook-Objektmodell Befehlsleisten und das Outlook-Objektmodell
Hinzufügen von benutzerdefinierten Bildern zu den Schaltflächen der Befehlsleisten Hinzufügen von benutzerdefinierten Bildern zu den Schaltflächen der Befehlsleisten
Hinzufügen von Kombinationsfeldern zu Befehlsleisten Hinzufügen von Kombinationsfeldern zu Befehlsleisten
Deaktivieren und Ausblenden von Befehlsleisten und Steuerelementen der Befehlsleisten Deaktivieren und Ausblenden von Befehlsleisten und Steuerelementen der Befehlsleisten
Positionieren der Befehlsleisten Positionieren der Befehlsleisten
Dynamisches Hinzufügen und Löschen von Befehlsleisten Dynamisches Hinzufügen und Löschen von Befehlsleisten
Die Subroutinen "CommandBarDocumenter" und "CommandBarControlDocumenter" Die Subroutinen "CommandBarDocumenter" und "CommandBarControlDocumenter"

Befehlsleisten und das Outlook-Objektmodell

In der Kolumne des vorigen Monats habe ich nicht erwähnt, dass sich der Zugriff auf die Befehlsleisten und Steuerelemente der Befehlsleisten im Microsoft Outlook-Objektmodell geringfügig vom Zugriff mit anderen Microsoft Office-Anwendungen unterscheidet.

In anderen Anwendungen als Outlook verwenden Sie für den Zugriff auf Befehlsleisten folgenden oder vergleichbaren Code:

Public Sub ListCommandBarNames()
    ' Zweck: Listet sämtliche Befehlsleistennamen für die aktuelle Anwendung auf. 
    ' Anmerkung: Dieser Code funktioniert in Outlook nicht!
    Dim objCommandBar As Office.CommandBar
    For Each objCommandBar In Application.CommandBars
        Debug.Print objCommandBar.Name
    Next objCommandBar
End Sub

Wenn Sie jedoch versuchen, diesen Code in Outlook zu verwenden, erhalten Sie einen Laufzeitfehler. Stattdessen müssen Sie die CommandBars-Eigenschaft im Explorer- oder Inspector-Objekt wie folgt verwenden:

Public Sub ListOutlookExplorerCommandBarNames()
    ' Zweck: Listet sämtliche Befehlsleistennamen für den aktuellen Explorer auf. 
    ' Anmerkung: Dieser Code funktioniert nur in Outlook!
    Dim objCommandBar As Office.CommandBar
    For Each objCommandBar In Application.ActiveExplorer.CommandBars
        Debug.Print objCommandBar.Name
    Next objCommandBar
End Sub

Ersetzen Sie im vorhergehenden Codebeispiel den Code ActiveExplorer durch ActiveInspector, um alle Befehlsleistennamen für den aktiven Inspektor zu drucken. Falls Sie mit dem Outlook-Objektmodell nicht vertraut sind: Ein Explorer stellt die Outlook-Benutzeroberfläche dar. Ein Inspektor ist ein Fenster, das ein bestimmtes Outlook-Element (z.B. eine E-Mail-Nachricht oder einen Kontakt) enthält, sowie alle Registerkarten innerhalb des Outlook-Elements (z.B. die Registerkarte Details einer Aufgabe).

 

Hinzufügen von benutzerdefinierten Bildern zu den Schaltflächen der Befehlsleisten

Sie können zwar mit der FaceId-Eigenschaft des CommandBarButton-Objekts anhand eines im Lieferumfang von Office enthaltenen Bildes ein Bild für die Schaltfläche einer Befehlsleiste festlegen. Wenn Sie jedoch ein selbst erstelltes Bild einfügen möchten, verwenden Sie die Picture-Eigenschaft des CommandBarButton-Objekts. Mit der Mask-Eigenschaft des CommandBarButton-Objekts können Sie zudem ein benutzerdefiniertes transparentes Bild erstellen.

Auch wenn zahlreiche Bildbearbeitungsprogramme als Share- oder Freeware im Web verfügbar sind und Programme wie beispielsweise Microsoft Visual C++ erhältlich sind, ist für die Erstellung dieser Bilder Microsoft Paint völlig ausreichend. So erstellen Sie die Bilder mit Paint:

  1. Klicken Sie auf Start, zeigen Sie auf Programme und anschließend auf Zubehör. Klicken Sie danach auf Paint.

  2. Klicken Sie im Menü Bild auf Attribute.

  3. Geben Sie im Feld Breite den Wert 16 ein. Geben Sie im Feld Höhe den Wert 16 ein. Stellen Sie sicher, dass die Optionen Pixel und Farben ausgewählt sind, und klicken Sie auf OK.

  4. Zeigen Sie im Menü Ansicht auf Zoomfaktor, und klicken Sie auf Benutzerdefiniert.

  5. Klicken Sie auf 800% und anschließend auf OK.

  6. Zeigen Sie im Menü Ansicht auf Zoomfaktor, und klicken Sie auf Raster einblenden.

  7. Stellen Sie im Menü Ansicht sicher, dass die Befehle Toolbox und Farbpalette aktiviert sind.

  8. Erstellen Sie das Bild mithilfe der Steuerelemente Toolbox und Farbpalette.

  9. Wenn Sie das Bild erstellt haben, klicken Sie im Menü Datei auf Speichern.

  10. Speichern Sie das Symbol als 256-Farben-Bitmap.

Nachstehend finden Sie ein von mir erstelltes Beispielbild:

Bild01

Abbildung 1. Benutzerdefiniertes undurchsichtiges Bitmap

Um ein durchsichtiges Bild anzulegen, müssen Sie eine entsprechende Bildmaske erstellen. Speichern Sie hierfür das soeben erstellte Bild unter einem anderen Namen. Färben Sie jedes Pixel, das durchsichtig werden soll, weiß. Färben Sie jedes Pixel, das undurchsichtig werden soll, schwarz. Speichern Sie anschließend das Bild erneut. Nachstehend finden Sie eine von mir erstellte Beispielbildmaske:

Bild02

Bild03

Abbildung 2. Benutzerdefinierte Bitmapmaske

Mit folgendem Beispielcode können Sie das transparente Bild der Schaltfläche für die Befehlsleiste hinzufügen:

Public Sub NewPictureOnNewCommandBar()
    ' Zweck: Fügt ein Bild einer Schaltfläche der Befehlsleiste hinzu. 
    Dim objCommandBar As Office.CommandBar
    Dim objCommandBarButton As Office.CommandBarButton
    Dim objPicture As stdole.IPictureDisp
    ' Die nächste Codezeile auskommentieren, wenn Sie kein transparentes Bild einfügen möchten. 
    Dim objMask As stdole.IPictureDisp
    Const PICTURE_PATH As String = "C:\Eigene Bilder\OK.bmp"
    ' Die nächste Codezeile auskommentieren, wenn Sie kein transparentes Bild einfügen möchten. 
    Const PICTURE_MASK As String = "C:\Eigene Bilder\OKMask.bmp"
    Const COMMAND_BAR_NAME As String = "Befehlsleiste testen"
    ' Die nächste Zeile ersetzen durch:
    ' For Each objCommandBar In Application.ActiveExplorer.CommandBars <- Für Outlook
    ' For Each objCommandBar In Application.VBE.CommandBars <- Für Visual Basic-Editor
    For Each objCommandBar In Application.CommandBars
        If objCommandBar.Name = COMMAND_BAR_NAME Then
            objCommandBar.Delete
        End If
    Next objCommandBar
    Set objCommandBar = Application.CommandBars.Add(COMMAND_BAR_NAME)
    Set objCommandBarButton = _
        objCommandBar.Controls.Add(msoControlButton)
    Set objPicture = LoadPicture(PICTURE_PATH)
    ' Die nächste Codezeile auskommentieren, wenn Sie kein transparentes Bild einfügen möchten. 
    Set objMask = LoadPicture(PICTURE_MASK)
    objCommandBarButton.Picture = objPicture
    ' Die nächste Codezeile auskommentieren, wenn Sie kein transparentes Bild einfügen möchten. 
    objCommandBarButton.Mask = objMask
End Sub

Wie Sie aus dem vorhergehenden Code ersehen können, legen Sie im Code ein Objekt für das undurchsichtige Bild und ein Objekt für die Bildmaske an. Jedes Objekt muss den Typ stdole.IPictureDisp aufweisen. Als Nächstes initialisieren Sie diese beiden Objekte, indem Sie die LoadPicture-Methode der Objekte aufrufen. Zuletzt legen Sie in der Picture-Eigenschaft der Befehlsleistenschaltfläche das undurchsichtige Bildobjekt fest. Anschließend setzen Sie die Mask-Eigenschaft des Schaltflächenobjekts der Befehlsleiste auf die Bildmaske.

Das Endergebnis sieht für undurchsichtige und durchsichtige Bilder wie folgt aus:

Bild04

Abbildung 3. Undurchsichtige und durchsichtige Bilder auf einer Befehlsleistenschaltfläche

Verwechseln Sie hierbei nicht die FaceId-Eigenschaft des CommandBarButton-Objekts mit der Id-Eigenschaft des CommandBarButton-Objekts. Mit der Id-Eigenschaft wird die integrierte Aktion für das entsprechende Steuerelement der Befehlsleiste festgelegt. Der Standardwert für die Id-Eigenschaft für alle benutzerdefinierten Steuerelemente der Befehlsleiste ist 1. Wenn Sie die Id-Eigenschaft eines benutzerdefinierten Steuerelements einer Befehlsleiste auf einen anderen Wert als 1 setzen, wird für das benutzerdefinierte Steuerelement der Befehlsleiste eine integrierte Aktion festgelegt, falls für die ID in der Anwendung eine solche existiert. Im folgenden Code werden sämtliche IDs für alle Steuerelemente einer Befehlsleiste in der Anwendung aufgeführt:

Public Sub ListCommandBarControlIDs()
    ' Zweck: Listet sämtliche Steuerelement-IDs der Befehlsleiste
    ' für die aktuelle Anwendung auf.
    Dim objCommandBar As Office.CommandBar
    Dim objCommandBarControl As Office.CommandBarControl
    ' Die folgende Zeile ersetzen durch:
    ' For Each objCommandBar In Application.ActiveExplorer.CommandBars <- Für Outlook
    ' For Each objCommandBar In Application.VBE.CommandBars <- Für Visual Basic-Editor
    For Each objCommandBar In Application.CommandBars
        For Each objCommandBarControl In objCommandBar.Controls
            Debug.Print objCommandBarControl.Caption & " " & _
                objCommandBarControl.ID
        Next objCommandBarControl
    Next objCommandBar
End Sub

 

Hinzufügen von Kombinationsfeldern zu Befehlsleisten

Zum Hinzufügen eines Kombinationsfelds zu einer Befehlsleiste verwenden Sie die Add-Methode der CommandBarControls-Auflistung und fügen dabei die enumerierte msoControlComboBox-Konstante für das Type-Argument ein. Fügen Sie anschließend mit der AddItem-Methode des CommandBarComboBox-Objekts Optionen zum Kombinationsfeld hinzu.

Mit der folgenden Funktion wird ein Kombinationsfeld einer bestehenden Befehlsleiste hinzugefügt:

Public Function AddComboBoxToCommandBar(ByVal strCommandBarName As String, _
        ByVal strComboBoxCaption As String, _
        ByRef strChoices() As String) As Boolean
    ' Zweck: Fügt einer Befehlsleiste ein Kombinationsfeld hinzu. 
    ' Akzeptiert:
    '   strCommandBarName: Der Name der Befehlsleiste zum Hinzufügen des Kombinationsfeldes. 
    '   strChoices(): Ein Optionsarray für das Kombinationsfeld. 
    ' Rückgabe: TRUE, wenn das Kombinationsfeld erfolgreich der Befehlsleiste hinzugefügt wurde.     
    Dim objCommandBarControl As Office.CommandBarControl
    Dim objCommandBarComboBox As Office.CommandBarComboBox
    Dim varChoice As Variant
    On Error GoTo AddComboBoxToCommandBar_Err
    ' Alle zuvor hinzugefügten Instanzen dieses Kombinationsfeldes löschen. 
    ' Die nächste Codezeile ersetzen durch:
    ' For Each objCommandBarControl In _
    '   Application.ActiveExplorer.CommandBars.Item(strCommandBarName).Controls _
  <- Für Outlook
    ' For Each objCommandBarControl In _
    '   Application.VBE.CommandBars.Item(strCommandBarName).Controls _
          <- Für Visual Basic-Editor
    For Each objCommandBarControl In Application.CommandBars.Item(strCommandBarName).Controls
        If objCommandBarControl.Caption = strComboBoxCaption Then
            objCommandBarControl.Delete
        End If
    Next objCommandBarControl
    ' Das Kombinationsfeld erstellen. 
    ' Die nächste Codezeile ersetzen durch:
    ' Set objCommandBarComboBox = _
    '   Application.CommandBars.Item(strCommandBarName).Controls.Add(msoControlComboBox) _
  <- Für Outlook
    ' Set objCommandBarComboBox = _
    '   Application.CommandBars.Item(strCommandBarName).Controls.Add(msoControlComboBox) _
  <- Für Visual Basic-Editor
    Set objCommandBarComboBox = _
      Application.CommandBars.Item(strCommandBarName).Controls.Add(msoControlComboBox)
    objCommandBarComboBox.Caption = strComboBoxCaption
    For Each varChoice In strChoices
        objCommandBarComboBox.AddItem varChoice
    Next varChoice
AddComboBoxToCommandBar_End:
    AddComboBoxToCommandBar = True
    Exit Function
AddComboBoxToCommandBar_Err:
    AddComboBoxToCommandBar = False
End Function

Sie können diese Funktion mit folgendem oder ähnlichem Code testen:

Public Sub TestAddComboBoxToCommandBar()
    ' Zweck: Testet die AddComboBoxToCommandBar-Funktion. 
    Dim strChoices(4) As String
    strChoices(1) = "Vanilla"
    strChoices(2) = "Chocolate"
    strChoices(3) = "Strawberry"
    strChoices(4) = "Other"
    If AddComboBoxToCommandBar("Tools", "Favorite Ice Cream", _
        strChoices) = True Then
        MsgBox "Das Kombinationsfeld wurde erfolgreich hinzugefügt."
    Else
        MsgBox "Das Kombinationsfeld konnte nicht hinzugefügt werden."
    End If
End Sub

 

Deaktivieren und Ausblenden von Befehlsleisten und Steuerelementen der Befehlsleisten

Bei der Entwicklung von Office-Lösungen möchten Sie unter Umständen verhindern, dass Benutzer auf bestimmte Befehlsleisten und Steuerelemente von Befehlsleisten klicken, die Bestandteil der Lösung sind. Möglicherweise sollen die Benutzer z.B. nicht auf Steuerelemente auf der Symbolleiste Formulare klicken und damit ein von Ihnen in Microsoft Word erstelltes benutzerdefiniertes Formular ändern können. Vielleicht möchten Sie auch im Menü Extras den Befehl Makro für eine bestimmte Lösung deaktivieren.

Zum Deaktivieren einer Befehlsleiste oder eines Steuerelements einer Befehlsleiste setzen Sie die Enabled-Eigenschaft einer Befehlsleiste oder eines entsprechenden Steuerelements auf FALSE. Wenn Sie die Befehlsleiste oder das Steuerelement der Befehlsleiste wieder aktivieren möchten, setzen Sie die Enabled-Eigenschaft hierfür auf TRUE.

Zum Ausblenden einer Befehlsleiste oder eines Steuerelements einer Befehlsleiste setzen Sie die Visible-Eigenschaft einer Befehlsleiste oder eines entsprechenden Steuerelements auf FALSE. Wenn Sie die Befehlsleiste oder das Steuerelement der Befehlsleiste wieder anzeigen möchten, setzen Sie die Visible-Eigenschaft hierfür auf TRUE.

Dies können Sie ausprobieren, indem Sie im Direktfenster folgende Codezeilen eingeben. Mit jeder Codezeile wird der aktivierte oder sichtbare Status der angegebenen Befehlsleiste bzw. des angegebenen Steuerelements der Befehlsleiste umgeschaltet. Verwenden Sie die Nomenklatur Application.ActiveExplorer oder Application.VBE, wenn Sie diesen Code in Outlook oder im Microsoft Visual-Basic-Editor eingeben. Achten Sie darauf, dass jede Zeile zweimal ausgeführt wird, damit Sie wieder zum aktivierten bzw. sichtbaren Ausgangsstatus zurückkehren.

Application.CommandBars("Tools").Enabled = _
  Not Application.CommandBars("Tools").Enabled
Application.CommandBars("Tools").Controls("Macro").Enabled = _
  Not Application.CommandBars("Tools").Controls("Macro").Enabled
Application.CommandBars("Tools").controls("Macro").Visible = _
  Not Application.CommandBars("Tools").controls("Macro").Visible

 

Positionieren der Befehlsleisten

Mit der Position-Eigenschaft einer Befehlsleiste wird festgelegt, an welcher Stelle in der Anwendung eine Befehlsleiste angezeigt wird. Mit den enumerierten Konstanten msoBarLeft, msoBarTop, msoBarRight und msoBarBottom wird festgelegt, dass die Befehlsleisten jeweils am linken, oberen, rechten bzw. unteren Rand der Anwendung angezeigt werden. Mit der enumerierten Konstante msoBarFloating wird angegeben, dass die Befehlsleiste an keinem Rand der Anwendung verankert ist. Mit der enumerierten Konstante msoBarPopup wird festgelegt, dass die Befehlsleiste ein Popupmenü darstellt.

Mit der folgenden Funktion wird die Position einer bestimmten Befehlsleiste geändert.

Public Function ChangeCommandBarPosition(ByVal strCommandBarName As String, _
        ByVal msoPosition As MsoBarPosition) As Boolean
    ' Zweck: Ändert die Position einer Befehlsleiste. 
    ' Akzeptiert:
    '   strCommandBarName: Der Name der Befehlsleiste, deren Position geändert werden soll. 
    ' Rückgabe: TRUE, wenn die Befehlsleiste erfolgreich verschoben wurde.     
    On Error GoTo ChangeCommandBarPosition_Err
    ' Die nächste Codezeile ersetzen durch:
    ' Application.ActiveExplorer.CommandBars.Item(strCommandBarName).Position = _
  msoPosition <- Für Outlook
    ' Application.VBE.CommandBars.Item(strCommandBarName).Position = _
      msoPosition <- Für Visual Basic-Editor
    Application.CommandBars.Item(strCommandBarName).Position = msoPosition
ChangeCommandBarPosition_End:
    ChangeCommandBarPosition = True
    Exit Function
ChangeCommandBarPosition_Err:
    ChangeCommandBarPosition = False
End Function

Sie können diese Funktion mit folgendem oder ähnlichem Code testen:

Public Sub TestChangeCommandBarPosition()
    ' Zweck: Testet die ChangeCommandBarPosition-Funktion.
    If ChangeCommandBarPosition("Standard", msoBarFloating) = True Then
        MsgBox "Die Befehlsleiste wurde erfolgreich verschoben."
    Else
        MsgBox "Die Befehlsleiste konnte nicht verschoben werden. Einige Befehlsleisten können nicht" & _
            "auf bestimmte Weise verschoben werden."
    End If
End Sub

 

Dynamisches Hinzufügen und Löschen von Befehlsleisten

Es sind zahlreiche Gelegenheiten vorstellbar, bei denen Sie Befehlsleisten bestimmten Office-Dokumenten zuordnen möchten. Möglicherweise möchten Sie z.B. bestimmte benutzerdefinierte Befehlsleisten nur anzeigen, wenn ein bestimmtes Office-Dokument geöffnet ist. Wenn das Dokument jedoch geschlossen ist, sollen die Befehlsleisten ausgeblendet werden.

Ein gutes Beispiel, wie dies beim Programmieren umgesetzt werden kann, ist die Verwendung von Excel. Um dies zu testen, erstellen Sie eine neue, leere Arbeitsmappe und benennen Tabelle1 in CommandBarInfo um. Geben Sie auf dem Arbeitsblatt CommandBarInfo folgende Informationen ein:

Bild05

Abbildung 4. Informationen für die dynamische Erstellung einer Befehlsleiste in Excel

Fügen Sie im Visual Basic-Editor folgenden Code einem neuen Codemodul hinzu, das mit der neuen, leeren Arbeitsmappe verknüpft ist:

Public Function CreateCommandBarPopup() As Boolean
    ' Zweck: Erstellt anhand von Informationen auf einem Excel-Arbeitsblatt 
    ' ein Popupsteuerelement mit Menüeinträgen für die Befehlsleiste. 
    ' Rückgabe: TRUE, wenn das Popupsteuerelement für die 
    ' Befehlsleiste erfolgreich hinzugefügt wurde.
    Dim objWorksheet As Excel.Worksheet
    Dim objCommandBarControl As Office.CommandBarControl
    Dim objCommandBarPopup As Office.CommandBarPopup
    Dim objCommandBarButton As Office.CommandBarButton
    Dim intRow As Integer
    On Error GoTo CreateCommandBarPopup_Err
    ' Das Arbeitsblatt mit den Befehleisteninformationen muss
    ' "CommandBarInfo" genannt werden.
    Set objWorksheet = ThisWorkbook.Sheets("CommandBarInfo")
    ' Alle vorhandenen Instanzen dieses Steuerelements 
    ' aus vorherigen Versionen löschen. 
    For Each objCommandBarControl In Application.CommandBars.Item("Standard").Controls
        If objCommandBarControl.Caption = objWorksheet.Cells(1, 1) Then
            objCommandBarControl.Delete
        End If
    Next objCommandBarControl
    Set objCommandBarPopup = _
      Application.CommandBars.Item("Standard").Controls.Add(msoControlPopup)
    objCommandBarPopup.Caption = objWorksheet.Cells(1, 1)
    intRow = 3
    ' Schaltflächen hinzufügen, bis keine Beschriftungen mehr vorhanden sind. 
    Do Until objWorksheet.Cells(intRow, 1) = ""
        With objCommandBarPopup
            Set objCommandBarButton = .Controls.Add(msoControlButton)
            With objCommandBarButton
                    .Caption = objWorksheet.Cells(intRow, 1)
                    .OnAction = objWorksheet.Cells(intRow, 2)
            End With
        End With
        intRow = intRow + 1
    Loop
CreateCommandBarPopup_End:
    CreateCommandBarPopup = True
    Exit Function
CreateCommandBarPopup_Err:
    CreateCommandBarPopup = False
End Function
Public Function DeleteCommandBarPopup() As Boolean
    ' Zweck: Löscht anhand der Informationen auf einem Excel-Arbeitsblatt 
    ' ein Popupsteuerelement der Befehlsleisten. 
    ' Rückgabe: TRUE, wenn das Popupsteuerelement für die 
    ' Befehlsleiste erfolgreich gelöscht wurde. 
    Dim objWorksheet As Excel.Worksheet
    Dim objCommandBarControl As Office.CommandBarControl
    On Error GoTo DeleteCommandBarPopup_Err
    ' Das Arbeitsblatt mit den Befehlsleisteninformationen muss 
    ' "CommandBarInfo" genannt werden. 
    Set objWorksheet = ThisWorkbook.Sheets("CommandBarInfo")
    ' Alle bestehenden Instanzen dieses Steuerelements löschen.
     For Each objCommandBarControl In Application.CommandBars.Item("Standard").Controls
        If objCommandBarControl.Caption = objWorksheet.Cells(1, 1) Then
            objCommandBarControl.Delete
        End If
    Next objCommandBarControl
DeleteCommandBarPopup_End:
    DeleteCommandBarPopup = True
    Exit Function
DeleteCommandBarPopup_Err:
    DeleteCommandBarPopup = False
End Function
Public Sub TestMacro()
    ' Zweck: Bietet ein Testmakro zur Vollständigkeit. 
    MsgBox "Dies ist ein Testmakro".
End Sub

Fügen Sie dem Modul ThisWorkbook der neuen, leeren Arbeitsmappe folgenden Code hinzu:

Private Sub Workbook_Open()
    If CreateCommandBarPopup = False Then
        MsgBox "Das Popupmenü konnte nicht ordnungsgemäß hinzugefügt werden".
    Else
        MsgBox "Das Popupmenü wurde erfolgreich hinzugefügt".
    End If
End Sub
Private Sub Workbook_BeforeClose(Cancel As Boolean)
    If DeleteCommandBarPopup = False Then
        MsgBox "Das Popupmenü konnte nicht ordnungsgemäß gelöscht werden".
    Else
        MsgBox "Das Popupmenü wurde erfolgreich gelöscht".
    End If
End Sub

Speichern und schließen Sie die Arbeitsmappe, und öffnen Sie sie anschließend erneut. Beachten Sie, dass in der Standard-Symbolleiste das Popupmenü Hausarbeit hinzugefügt wurde. Wenn Sie die Arbeitsmappe schließen, wird das Popupmenü Hausarbeit hingegen ausgeblendet.

Eine ausführlichere Version dieser Technik finden Sie in der von John Walkenbach, einem so genannten Excel-MVP (Most Valuable Professional), vorgestellten Lösung unter http://j-walk.com/ss/excel/tips/tip53.htm (in Englisch).

 

Die Subroutinen "CommandBarDocumenter" und "CommandBarControlDocumenter"

Bei der Entwicklung von Lösungen mit Befehlsleisten muss ich häufig einen bestimmten Index oder Namen bzw. eine bestimmte Beschriftung für Befehlsleisten oder Steuerelemente von Befehlsleisten abrufen. Ich habe die Subroutinen CommandBarDocumenter und CommandBarControlDocumenter erstellt, um die allgemeinen Eigenschaften aller Befehlsleisten und Steuerelemente der Befehlsleisten in einer Office-Anwendung zu dokumentieren.

Um diese Beispiele auszuführen, kopieren Sie den folgenden Code im Visual Basic-Editor in ein Codemodul einer Microsoft Office-XP-Anwendung, und führen anschließend eine der beiden oder beide der folgenden Subroutinen aus. Wenn Sie dazu aufgefordert werden, speichern Sie die Ergebnisse als Textdateien (.txt). Dadurch können Sie die Ergebnisse für die Anzeige und Filterfunktionen problemlos in eine Anwendung, beispielsweise Microsoft Excel, laden.

Public Sub CommandBarDocumenter()
    ' Zweck: Schreibt Informationen über alle Befehlsleisten 
    ' in der aktuellen Anwendung in eine Textdatei. 
    ' Sie müssen zuerst einen Verweis auf die Microsoft Scripting Runtime
    ' (scrrun.dll) festlegen, damit dieser Code richtig ausgeführt wird. 
    ' Anmerkung: Dieser Code funktioniert nur mit Microsoft Office XP.
    Dim objCommandBar As Office.CommandBar
    Dim strType As String
    Dim strPosition As String
    Dim objFileSaveDialog As Office.FileDialog
    Dim objFSO As Scripting.FileSystemObject
    Dim objTextStream As Scripting.TextStream
    Const SAVE_BUTTON As Integer = -1
    Set objFileSaveDialog = Application.FileDialog(msoFileDialogSaveAs)
    objFileSaveDialog.Title = "Ergebnisse speichern unter"
    ' Der Benutzer hat auf die Schaltfläche "Speichern" geklickt.
    If objFileSaveDialog.Show = SAVE_BUTTON Then
        Set objFSO = New Scripting.FileSystemObject
        Set objTextStream = objFSO.CreateTextFile(objFileSaveDialog.SelectedItems.Item(1))
        objTextStream.WriteLine "Name" & vbTab & _
            "Type" & vbTab & _
            "Enabled" & vbTab & _
            "Visible" & vbTab & _
            "Index" & vbTab & _
            "Position" & vbTab & _
            "Protection" & vbTab & _
            "Row Index" & vbTab & _
            "Top" & vbTab & _
            "Height" & vbTab & _
            "Left" & vbTab & _
            "Width"
        ' Die nächste Zeile ersetzen durch:
        ' For Each objCommandBar In Application.ActiveExplorer.CommandBars _
           <- Für Outlook
        ' For Each objCommandBar In Application.VBE.CommandBars <- Für _
            Visual Basic-Editor
        For Each objCommandBar In Application.CommandBars
            Select Case objCommandBar.Type
                Case msoBarTypeMenuBar
                    strType = "Menu Bar"
                Case msoBarTypeNormal
                    strType = "Normal"
                Case msoBarTypePopup
                    strType = "Pop-Up"
            End Select
            Select Case objCommandBar.Position
                Case msoBarBottom
                    strPosition = "Bottom"
                Case msoBarFloating
                    strPosition = "Floating"
                Case msoBarLeft
                    strPosition = "Left"
                Case msoBarMenuBar
                    strPosition = "Menu Bar"
                Case msoBarPopup
                    strPosition = "Pop-Up"
                Case msoBarRight
                    strPosition = "Right"
                Case msoBarTop
                    strPosition = "Top"
            End Select
            Select Case objCommandBar.Protection
                Case msoBarNoChangeDock
                    strProtection = "No Change Dock"
                Case msoBarNoChangeVisible
                    strProtection = "No Change Visible"
                Case msoBarNoCustomize
                    strProtection = "No Customize"
                Case msoBarNoHorizontalDock
                    strProtection = "No Horizontal Dock"
                Case msoBarNoMove
                    strProtection = "No Move"
                Case msoBarNoProtection
                    strProtection = "No Protection"
                Case msoBarNoResize
                    strProtection = "No Resize"
                Case msoBarNoVerticalDock
                    strProtection = "No Vertical Dock"
            End Select
            objTextStream.WriteLine objCommandBar.Name & vbTab & _
                strType & vbTab & _
                objCommandBar.Enabled & vbTab & _
                objCommandBar.Visible & vbTab & _
                objCommandBar.Index & vbTab & _
                strPosition & vbTab & _
                strProtection & vbTab & _
                objCommandBar.RowIndex & vbTab & _
                objCommandBar.Top & vbTab & _
                objCommandBar.Height & vbTab & _
                objCommandBar.Left & vbTab & _
                objCommandBar.Width
        Next objCommandBar
        objTextStream.Close
        MsgBox "Ergebnisse geschrieben in " & objFileSaveDialog.SelectedItems.Item(1) & "."
    End If
End Sub
Sub CommandBarControlDocumenter()
    ' Zweck: Schreibt Informationen über alle Steuerelemente von 
    ' Befehlsleisten in der aktuellen Anwendung in eine Textdatei. 
    ' Sie müssen zuerst einen Verweis auf die Microsoft Scripting Runtime
    ' (scrrun.dll) festlegen, damit dieser Code richtig ausgeführt wird. 
    ' Anmerkung: Dieser Code funktioniert nur mit Microsoft Office XP.
    Dim objCommandBar As Office.CommandBar
    Dim objCommandBarControl As Office.CommandBarControl
    Dim strOLEUsage As String
    Dim strType As String
    Dim objFileSaveDialog As Office.FileDialog
    Dim objFSO As Scripting.FileSystemObject
    Dim objTextStream As Scripting.TextStream
    Const SAVE_BUTTON As Integer = -1
    Set objFileSaveDialog = Application.FileDialog(msoFileDialogSaveAs)
    objFileSaveDialog.Title = "Ergebnisse speichern unter"
    ' Der Benutzer hat auf die Schaltfläche "Speichern" geklickt.
    If objFileSaveDialog.Show = SAVE_BUTTON Then
        Set objFSO = New Scripting.FileSystemObject
        Set objTextStream = objFSO.CreateTextFile(objFileSaveDialog.SelectedItems.Item(1))
        objTextStream.WriteLine "ID" & vbTab & _
            "Index" & vbTab & _
            "Caption" & vbTab & _
            "Parent" & vbTab & _
            "DescriptionText" & vbTab & _
            "BuiltIn" & vbTab & _
            "Enabled" & vbTab & _
            "IsPriorityDropped" & vbTab & _
            "OLEUsage" & vbTab & _
            "Priority" & vbTab & _
            "Tag" & vbTab & _
            "TooltipText" & vbTab & _
            "Type" & vbTab & _
            "Visible" & vbTab & _
            "Height" & vbTab & _
            "Width"
            ' Die nächste Zeile ersetzen durch:
            ' For Each objCommandBar In Application.ActiveExplorer.CommandBars <- Für Outlook
            ' For Each objCommandBar In Application.VBE.CommandBars _
                <- Für Visual Basic-Editor
            For Each objCommandBar In Application.CommandBars
                For Each objCommandBarControl In objCommandBar.Controls
                    Select Case objCommandBarControl.OLEUsage
                        Case msoControlOLEUsageBoth
                            strOLEUsage = "Both"
                        Case msoControlOLEUsageClient
                            strOLEUsage = "Client"
                        Case msoControlOLEUsageNeither
                            strOLEUsage = "Neither"
                        Case msoControlOLEUsageServer
                            strOLEUsage = "Server"
                    End Select
                    Select Case objCommandBarControl.Type
                        Case msoControlActiveX
                            strType = "ActiveX"
                        Case msoControlAutoCompleteCombo
                            strType = "Auto-Complete Combo Box"
                        Case msoControlButton
                            strType = "Button"
                        Case msoControlButtonDropdown
                            strType = "Drop-Down Button"
                        Case msoControlButtonPopup
                            strType = "Popup Button"
                        Case msoControlComboBox
                            strType = "Combo Box"
                        Case msoControlCustom
                            strType = "Custom"
                        Case msoControlDropdown
                            strType = "Drop-Down"
                        Case msoControlEdit
                            strType = "Edit"
                        Case msoControlExpandingGrid
                            strType = "Expanding Grid"
                        Case msoControlGauge
                            strType = "Gauge"
                        Case msoControlGenericDropdown
                            strType = "Generic Drop-Down"
                        Case msoControlGraphicCombo
                            strType = "Graphic Combo Box"
                        Case msoControlGraphicDropdown
                            strType = "Graphic Drop-Down"
                        Case msoControlGraphicPopup
                            strType = "Popup Graphic"
                        Case msoControlGrid
                            strType = "Grid"
                        Case msoControlLabel
                            strType = "Label"
                        Case msoControlLabelEx
                            strType = "LabelEx"
                        Case msoControlOCXDropdown
                            strType = "OCX Drop-Down"
                        Case msoControlPane
                            strType = "Pane"
                        Case msoControlPopup
                            strType = "Popup"
                        Case msoControlSpinner
                            strType = "Spinner"
                        Case msoControlSplitButtonMRUPopup
                            strType = "Split Button MRU Popup"
                        Case msoControlSplitButtonPopup
                            strType = "Button Popup"
                        Case msoControlSplitDropdown
                            strType = "Split Drop-Down"
                        Case msoControlSplitExpandingGrid
                            strType = "Split Expanding Grid"
                        Case msoControlWorkPane
                            strType = "Work Pane"
                        End Select
                        objTextStream.WriteLine objCommandBarControl.ID & _
                          vbTab & _
                            objCommandBarControl.Index & vbTab & _
                            objCommandBarControl.Caption & vbTab & _
                            objCommandBarControl.Parent.Name & vbTab & _
                            objCommandBarControl.DescriptionText & vbTab & _
                            objCommandBarControl.BuiltIn & vbTab & _
                            objCommandBarControl.Enabled & vbTab & _
                            objCommandBarControl.IsPriorityDropped & vbTab & _
                            strOLEUsage & vbTab & _
                            objCommandBarControl.Priority & vbTab & _
                            objCommandBarControl.Tag & vbTab & _
                            objCommandBarControl.TooltipText & vbTab & _
                            strType & vbTab & _
                            objCommandBarControl.Visible & vbTab & _
                            objCommandBarControl.Height & vbTab & _
                            objCommandBarControl.Width
                    Next objCommandBarControl
                Next objCommandBar
                objTextStream.Close
                MsgBox "Ergebnisse geschrieben in " & _
                  objFileSaveDialog.SelectedItems.Item(1) & "."
            End If
End Sub