VSTO – Word: Tastenkombination für Aufruf von Funktionen aus eigenem Ribbon

Beschreibung

Hat man per VSTO sein eigenes Word-Ribbon erstellt, möchte man evtl. den Funktionen dieses Ribbons – wie bei VBA-Makros auch möglich – Tastenkombinationen in Word zuordnen. So ging es mir jedenfalls nach der Erstellung meines ersten Word-Ribbons. Dummerweise kann man den Funktionen in Word allerdings erstmal keine Tastenkombinationen auf herkömmliche Weise (Word-Optionen -> Menüband anpassen -> ganz unten: Tastenkombinationen: Anpassen…) zuordnen. Damit das funktioniert, muss man zwei Dinge tun.

Der erste Schritt ist die Vorbereitung des Word-Ribbons in Visual Studio. Die entsprechenden Funktionen müssen dort „nach außen“ bekannt gemacht werden, so dass man über VBA-Makros darauf zugreifen kann. Der zweite Schritt ist die Erstellung der VBA-Makros in Word, welche die entsprechenden Funktionen aufrufen. Diesen VBA-Makros kann man dann auf übliche Weise Tastenkombinationen in Word zuordnen.

Schritt 1 (Ribbon-Vorbereitung im Visual Studio)

Im Visual Studio-Projekt muss ein neues Modul hinzugefügt werden. In meinem Fall heißt die Datei „cls_AddInUtilities.vb“. Diese Datei enthält beispielsweise den nachstehenden Code.

Imports System.Runtime.InteropServices

' Deklaration der benötigten Schnittstellen für die VBA-Makros in Word
<ComVisible(True)> _
Public Interface IAddInUtilities

    ' Schnittstelle für das VBA-Makro in Word
    ' Dies ist der Funktionsname, der in Word im VBA-Makro verwendet wird
    Sub Funktion()

End Interface

' Klasse zum Aufrufen der Ribbon-Funktionen
<ComVisible(True)> _
<ClassInterface(ClassInterfaceType.None)> _
Public Class cls_AddInUtilities
    Implements IAddInUtilities

    ' Verbindung des oben definierten Interfaces zur Ribbon-Funktion
    ' ----------------------------------------------------------------
    ' Die Zuordnung des Funktionsnamens, der in Word im VBA-Makros verwendet wird, erfolgt über Schnittstellen (definiert in IAddInUtilities)
    ' Die Schnittstelle wird hier der Funktion über den Zusatz Implements IAddInUtilities.Funktion zugewiesen
    ' 
    Public Sub AIU_Funktion() Implements IAddInUtilities.Funktion
        ' Aufrufen der Ribbon-Funktion mit dem Namen "Funktion"
        Call Funktion()
    End Sub

End Class

Schritt 2 (VBA-Makro-Definition in Word)

In Word muss für dieses Beispiel ein VBA-Makro hinzugefügt werden, das die entsprechende Funktion des Ribbons (ComAddins) aufruft. Da in der Regel nicht nur eine Funktion ansprechen möchte, sondern mehrere, zeigt der folgenden Code einen generischen Ansatz, bei dem die Suche nach dem ComAddin in eine separate Funktion (initAutomationObject) ausgelagert wurde.

' Konstante, die den ComAddin-Namen des entsprechenden Ribbons festlegt
Private Const MYRIBBON_COMADDIN_NAME As String = "MyRibbon"

' Durchsuchen der ComAddins nach dem angegebenen Ribbon
'
' Parameter:
' ByRef automationObject As Object   - ComAddin-Objekt
' ByVal sRibbon As String            - Name des zu suchenden Ribbons
'
' Rückgabewerte:
' true  - Ribbon / ComAddin vorhanden
' false - Ribbon / ComAddin NICHT vorhanden
'
Function initAutomationObject(ByRef automationObject As Object, ByVal sRibbon As String) As Boolean
    Dim addIn As COMAddIn
    Dim objCOMAddIn As Object

    ' Durchsuchen aller vorhandenen ComAddin
    For Each objCOMAddIn In Application.COMAddIns
        ' ...nach dem übergebenen Ribbon- / ComAddin-Namen
        If StrComp(objCOMAddIn, sRibbon) = 0 Then
            addIn = Application.COMAddIns(sRibbon)
            automationObject = addIn.Object

            initAutomationObject = True
            Exit For
        Else
            initAutomationObject = False
        End If
    Next
End Function

' Interface zur Ribbon-Funktion
Sub MyRibbon_Funktion()
    Dim automationObject As Object

    ' Prüfen, ob das ComAddin vorhanden ist
    If initAutomationObject(automationObject, MYRIBBON_COMADDIN_NAME) Then
        ' Aufrufen der entsprechenden Ribbon-Funktion
        automationObject.Funktion()
    End If
End Sub