Tipps "n" Tricks
Anwender-Software - Excel

Menüs und Befehle an Arbeitsmappe binden

Thema:

Excel 97, 2000, XP

Problem:

Ich möchte die Bedienung einer Arbeitsmappe durch ein Menü mit speziellen Befehlen erleichtern. Da die Befehle und die dahinter stehenden VBA-Makros genau auf diese Mappe zugeschnitten sind, soll das Menü nur angezeigt werden, wenn die Datei geöffnet und aktiv ist. Geht das überhaupt? Wenn ja, wie sähe eine entsprechende Lösung aus?

Lösung: 

Da sich Excel objekt- und ereignisorientiert programmieren lässt, können Sie auch für bedarfsgerechte Menüs sorgen. Am einfachsten erreichen Sie das, indem Sie Ereignisprozeduren in das VBA-Objekt "DieseArbeitsmappe" einfügen. So blenden Sie das spezielle Menü aus, sobald Sie die Mappe deaktivieren - zum Beispiel beim Wechsel in ein anderes Fenster -, und Sie blenden das Menü ein, wenn Sie die Mappe wieder in den Vordergrund holen.

Das folgende Beispiel zeigt ausserdem, wie Sie ein Menü per Programmcode beim Öffnen einer Datei einrichten und es beim Schliessen der Datei wieder entfernen. So gehen Sie vor:
  • Öffnen Sie die Excel-Datei, die Sie um ein Menü mit Spezialbefehlen erweitern wollen.
  • Wechseln Sie mit Alt + F11 in den Visual Basic-Editor.
  • Suchen Sie im Projekt-Explorer den Projektnamen der aktuellen Datei und blenden Sie den untergeordneten Zweig "Microsoft Excel Objekte" sowie die darunter befindlichen Elemente ein.
  • Zu diesen Elementen gehört ein Eintrag namens "DieseArbeitsmappe". Öffnen Sie mit einem Doppelklick das zugehörige Codefenster.
  • Beginnen Sie mit einer Prozedur, die beim Öffnen der Datei ein neues Menü mit einem einzelnen Befehl anlegt. Dafür können Sie auf die vorgefertigten Ereignisprozeduren zurückgreifen, indem Sie am oberen Rand des Codefensters die linke Dropdown-Liste öffnen und "Workbook" auswählen. Dann öffnen Sie das rechte Dropdown-Feld und wählen "Open" an. Das daraufhin eingefügte Prozedurgerüst ergänzen Sie wie folgt:

Private Sub Workbook_Open()
Dim cbMenu As CommandBar
Dim cbSpecialMenu As CommandBarPopup
Dim cbCommand As CommandBarControl

  Set cbMenu = _
  Application.CommandBars("Worksheet Menu Bar")
  Set cbSpecialMenu = _
   cbMenu.Controls.Add(Type:=msoControlPopup)
  cbSpecialMenu.Caption = "Spezialmenü"
  Set cbCommand = _
  cbSpecialMenu.Controls.Add(Type:=
msoControlButton)
  cbCommand.Caption = "Spezialbefehl"
End Sub

Mit diesen Anweisungen fügen Sie ein Menü namens "Spezialmenü" in die Standard-Menüleiste von Excel ein. Ausserdem erweitern Sie das Menü um einen Befehl namens "Spezialbefehl". Wenn dieser Befehl eine Aktion ausführen soll, müssen Sie nicht nur die "Caption"- sondern auch die "OnAction"-Eigenschaft setzen und ihr den Namen eines Makros zuweisen.
  • Fahren Sie mit einer Prozedur fort, die das "Spezialmenü" beim Schliessen der Datei wieder entfernt. Dazu verfahren Sie wie in Schritt 5, um das "Workbook"-Objekt aus dem linken Dropdown-Feld auszuwählen. Im rechten Dropdown-Feld aktivieren Sie dieses Mal aber das "BeforeClose"-Ereignis. Als Prozedurcode geben Sie folgendes ein:

Private Sub Workbook_BeforeClose(Cancel As Boolean)
Dim cbSpecialMenu As CommandBarControl

  On Error Resume Next
  Set cbSpecialMenu = _
  Application.CommandBars("Worksheet Menu " & _
  "Bar").Controls("Spezialmenü")
  cbSpecialMenu.Delete
End Sub

  • Den Menübefehl müssen Sie nicht gesondert entfernen, da er zusammen mit dem übergeordneten Menü gelöscht wird.
  • Damit haben Sie bereits die erste Voraussetzung für ein bedarfsgerechtes Einblenden und Ausblenden des Menüs geschaffen. In dieser Form bleibt es aber so lange sichtbar wie die Datei geöffnet ist, auch wenn Sie das Fenster einer anderen Datei aktivieren.

Um den Menüzugriff ausschliesslich im Rahmen der passenden Arbeitsmappe zu erlauben, fügen Sie Prozeduren für das "Deactivate"- sowie das "Activate"-Ereignis des "Workbook"-Objekts hinzu. Wie Sie die Ereignisprozeduren im Codefenster anlegen, wissen Sie aus den vorherigen Schritten. Hier nur die entsprechenden Programmzeilen:

Private Sub Workbook_Deactivate()
  On Error Resume Next
  Application.CommandBars("Worksheet Menu " & _
  "Bar").Controls("Spezialmenü").Visible = False
End Sub

Private Sub Workbook_Activate()
  On Error Resume Next
  Application.CommandBars("Worksheet Menu " & _
  "Bar").Controls("Spezialmenü").Visible = True
End Sub

  • Nun können Sie die aktuelle Arbeitsmappe speichern und schliessen. Beim nächsten Öffnen wird am rechten Ende der Excel-Menüleiste das neue Menü "Spezialmenü" erscheinen. Es verschwindet, sobald Sie die Mappe schliessen oder eine andere Excel-Datei aktivieren. Wenn Sie zur ursprünglichen Mappe zurückkehren, steht Ihnen das Menü wieder zur Verfügung.

 

Tipps "n" Tricks
Anwender-Software - Excel