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