VBA: Menüs ändern und erzeugen

Benutzerdefinierte Menüs, ganz nach Wunsch!

Von: Lorenz Hölscher
Stand: 4. Mai 2011
Anmelden um Kommentare zu schreiben

Downloads zu diesem Beitrag

Über den Autor: Lorenz Hölscher

bild80517

Lorenz Hölscher ist freiberuflicher Dozent, Berater und Programmierer mit Schwerpunkt Anwendungs-Programmierung. Vorrangig widmet er sich Access, Word und Excel sowie begleitenden grafischen Arbeiten. Er legt viel Wert auf benutzerfreundliche Oberflächen und ordentliches Design in Optik und Programmierung. Zu Hilfe kommen ihm da seine langjährigen "branchenfremden" Erfahrungen als Architekt, Layouter und Designer.

Lorenz Hölscher bietet eigene Hilfeseiten an und hat bei Microsoft Press mehrere Bücher veröffentlicht zu Access 2007, Access 2007 VBA, Word 2007 VBA und Access 2010.

Beiträge des Autors als Atom-Feed Atom-Feed: Neues von akademie.de

Untermenüs

Untermenü anlegen

Wie oben bereits erwähnt, können Sie natürlich auch innerhalb eines eigenen Menüs Untermenüs anlegen. Dazu ändert sich der Typ des Menüeintrags von msoControlButton auf msoControlPopUp, damit dort wieder ein Menü ausklappen kann.

Der folgende Code bereitet schon ein Untermenü vor, welches später mal alle Absätze des Dokuments nennt und die Möglichkeit bietet, einen davon zu markieren. Wie Sie sehen, wird das Untermenü dabei gar nicht wirklich angelegt, sondern lediglich eine Sub-Prozedur SammleAbsaetze aufgerufen:

Sub MacheMenue()
	Dim cbpSpezial As CommandBarPopup
	Dim cbbEintrag As CommandBarButton

	CustomizationContext = ThisDocument
	Set cbpSpezial = Application.CommandBars("Menu bar").Controls.Add(msoControlPopup)

	With cbpSpezial
		.Caption = "Spe&zial"
		.OnAction = "SpezialAnpassen"
		.BeginGroup = True

		Set cbbEintrag = cbpSpezial.Controls.Add(msoControlButton)
		With cbbEintrag
			.Caption = "&Info..."
			.OnAction = "ZeigeInfo"
		End With

		With cbpSpezial.Controls.Add(msoControlButton)
			.Caption = "&Grafik ändern"
			.OnAction = "GrafikAendern"
		End With

		With cbpSpezial.Controls.Add(msoControlPopup)
			.Caption = "Gehe zu Absatz"
			.OnAction = "SammleAbsaetze"
		End With
	End With
End Sub


Sub SammleAbsaetze()

End Sub

Die Sub-Prozedur SammleAbsaetze muss vorhanden sein, darf aber noch leer sein. Dann präsentiert sich das Menü wie im folgenden Bild:

Bild vergrößernDas Untermenü hat noch keine Einträge

Untermenü-Einträge dynamisch anlegen

Die tatsächlichen Einträge werden erst beim Klick auf den "Gehe zu Absatz"-Eintrag dynamisch erzeugt. Zu Testzwecken sollen erst einmal ein paar wenige Einträge angefügt werden, damit Sie die Technik und eventuelle Probleme dabei kennenlernen:

Sub SammleAbsaetze()
	Dim cbpSammeln As CommandBarPopup
	Dim intI As Integer

	Set cbpSammeln = Application.CommandBars("Menu bar").Controls("Spezial").CommandBar.Controls(3)
	With cbpSammeln.CommandBar.Controls
		For intI = 1 To 5
			With .Add(msoControlButton)
				.Caption = "Test " & intI
				.OnAction = "TesteEintrag"
				.Tag = intI
			End With
		Next
	End With
End Sub

Sub TesteEintrag

End Sub

Sobald Sie diese Prozedur mit dem obigen Code ergänzt haben, zeigt die Auswahl im Menü tatsächlich die gewünschten Testeinträge an, wie das folgende Bild zeigt:

Bild vergrößernDas Untermenü enthält nun die dynamisch erzeugten Einträge.

Untermenü-Einträge löschen

Jeder weitere Aufruf des Untermenüs zeigt allerdings, dass jedes Mal neue Testeinträge hinzugefügt werden, auch wenn sie bereits vorhanden sind. Genau das stand ja auch nur im Code drin, daher muss er nun so erweitert werden, dass vorher alle Einträge im Untermenü gelöscht werden.

Diese Seite ist für Mitglieder von akademie.de reserviert.

Möchten Sie die Mitgliedschaft 14 Tage kostenlos testen und den Beitrag komplett lesen?

Ich bin bereits Mitglied
Jetzt Probemitglied werden
Ich kann in den 14 Tagen Probezeit formlos z.B. per E-Mail stornieren. Wenn ich das nicht tue, entscheide ich mich für ein