VBA – Word: Neuen Menüpunkt + Befehle mit Parametern hinzufügen [Update 03.10.2015]

Beschreibung

Wer viel mit Makros arbeitet möchte diese meist auch gern in das Menü oder als Symbolleiste einbinden. Hier erkläre ich, wie man bestehende Makros per VBA als Menüpunkt in ein vorgegebenes Menü bringt.

Die folgenden Makros demonstrieren eine Installations- und Deinstallationsroutine, die ein Menü hinzufügt und 3 Menüpunkte in diesem Menü erzeugt bzw. das Menü mit den Menüpunkten wieder entfernt. Zwei dieser Menüpunkte sind einfache Funktionen, die ohne Parameter aufgerufen werden, der dritte Menüpunkt setzt einen übergebenen Parameter voraus. Befehle ohne Parameter lassen sich leicht realisieren, daher war mir besonders der 3. Menüpunkt wichtig.

[Update 03.10.2015]: Das Makro hat schon ein paar Jahre auf dem Buckel und sollte zwar auch in Word 2007 und neuer funktionieren, dort empfiehlt es sich allerdings Menübänder (Ribbons) zu erstellen. Hierfür kann RibbonX eingesetzt werden oder auch (wenn es noch komfortabler sein soll) das kostenpflichtige MS Visual Studio in der Professional Version (wird VSTO benötigt).

Sourcecode

' Benötigte Konstanten
Const MENÜNAME = "&Test"
Const BEFEHL1 = "&1. Befehl"
Const BEFEHL2 = "&2. Befehl"
Const BEFEHL3 = "&3. Befehl"

' Installation des neuen Menüpunktes und Einrichten von 3 Befehlen
Public Sub Install()
    On Error GoTo NoDocumentOpen 'Bei Fehlern wird zur Sprungmarke NoDocumentOpen gesprungen und damit die Funktion beendet

    Dim objMenüleiste As Object
    Dim objMenü As Object
    Dim objBefehl As Object

    Call Uninstall(MENÜNAME) ' löschen eines evtl. vorhandenen Menüs mit gleichem Namen

    ' neues Menü hinzufügen
    objMenüleiste = CommandBars.ActiveMenuBar
    objMenü = objMenüleiste.Controls.Add(Type:=msoControlPopup)
    objMenü.Caption = MENÜNAME

    ' neuen Menüpunkt (ohne Parameter) hinzufügen
    ctrlBefehl = objMenü.Controls.Add(Type:=msoControlButton, ID:=1)
    With ctrlBefehl
        .Caption = BEFEHL1
        .OnAction = "runBefehl1"
    End With

    ' neuen Menüpunkt (ohne Parameter) hinzufügen
    ctrlBefehl = objMenü.Controls.Add(Type:=msoControlButton, ID:=1)
    With ctrlBefehl
        .Caption = BEFEHL2
        .OnAction = "runBefehl2"
    End With

    ' neuen Menüpunkt (mit Parameter) hinzufügen
    ctrlBefehl = objMenü.Controls.Add(Type:=msoControlButton, ID:=1)
    With ctrlBefehl
        .Caption = BEFEHL3
        .Parameter = "Test-Parameter"
        .OnAction = "runBefehl3"
    End With

NoDocumentOpen:
End Sub

' Deinstallation des neuen bzw. bereits vorhandenen Menüpunktes
Sub Uninstall(sMenüname As String)
    On Error Resume Next

    CommandBars.ActiveMenuBar.Controls(sMenüname).Delete()
End Sub

' Befehl 1 (keine Parameter)
Sub runBefehl1()
    Call MsgBox("1. Befehl")
End Sub

' Befehl 2 (keine Parameter)
Sub runBefehl2()
    Call MsgBox("2. Befehl")
End Sub

' Befehl 3 (ein übergebener Parameter)
Sub runBefehl3()
    Call MsgBox(CommandBars.ActionControl.Parameter)
End Sub