{"id":1756,"date":"2013-02-03T13:35:42","date_gmt":"2013-02-03T11:35:42","guid":{"rendered":"http:\/\/www.kastenmaier.de\/?p=1756"},"modified":"2018-05-02T07:54:33","modified_gmt":"2018-05-02T06:54:33","slug":"vsto-word-tastenkombination-fuer-aufruf-von-funktionen-aus-eigenem-ribbon","status":"publish","type":"post","link":"https:\/\/www.kastenmaier.de\/?p=1756","title":{"rendered":"VSTO &#8211; Word: Tastenkombination f\u00fcr Aufruf von Funktionen aus eigenem Ribbon"},"content":{"rendered":"<h1>Beschreibung<\/h1>\n<p>Hat man per VSTO sein eigenes Word-Ribbon erstellt, m\u00f6chte man evtl. den Funktionen dieses Ribbons &#8211; wie bei VBA-Makros auch m\u00f6glich &#8211; 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\u00a0keine Tastenkombinationen auf herk\u00f6mmliche Weise (Word-Optionen -&gt; Men\u00fcband anpassen -&gt; ganz unten: Tastenkombinationen: Anpassen&#8230;) zuordnen. Damit das funktioniert, muss man zwei Dinge tun.<\/p>\n<p><!--more-->Der erste Schritt ist die Vorbereitung des Word-Ribbons in Visual Studio. Die entsprechenden Funktionen m\u00fcssen dort &#8222;nach au\u00dfen&#8220; bekannt gemacht werden, so dass man \u00fcber 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 \u00fcbliche Weise Tastenkombinationen in Word zuordnen.<\/p>\n<h1>Schritt 1 (Ribbon-Vorbereitung im Visual Studio)<\/h1>\n<p>Im Visual Studio-Projekt muss ein neues Modul hinzugef\u00fcgt werden. In meinem Fall hei\u00dft die Datei &#8222;cls_AddInUtilities.vb&#8220;. Diese Datei enth\u00e4lt beispielsweise den nachstehenden Code.<\/p>\n<pre class=\"brush: vbnet; gutter: true\">Imports System.Runtime.InteropServices\r\n\r\n&#039; Deklaration der ben\u00f6tigten Schnittstellen f\u00fcr die VBA-Makros in Word\r\n&lt;ComVisible(True)&gt; _\r\nPublic Interface IAddInUtilities\r\n\r\n    &#039; Schnittstelle f\u00fcr das VBA-Makro in Word\r\n    &#039; Dies ist der Funktionsname, der in Word im VBA-Makro verwendet wird\r\n    Sub Funktion()\r\n\r\nEnd Interface\r\n\r\n&#039; Klasse zum Aufrufen der Ribbon-Funktionen\r\n&lt;ComVisible(True)&gt; _\r\n&lt;ClassInterface(ClassInterfaceType.None)&gt; _\r\nPublic Class cls_AddInUtilities\r\n    Implements IAddInUtilities\r\n\r\n    &#039; Verbindung des oben definierten Interfaces zur Ribbon-Funktion\r\n    &#039; ----------------------------------------------------------------\r\n    &#039; Die Zuordnung des Funktionsnamens, der in Word im VBA-Makros verwendet wird, erfolgt \u00fcber Schnittstellen (definiert in IAddInUtilities)\r\n    &#039; Die Schnittstelle wird hier der Funktion \u00fcber den Zusatz Implements IAddInUtilities.Funktion zugewiesen\r\n    &#039; \r\n    Public Sub AIU_Funktion() Implements IAddInUtilities.Funktion\r\n        &#039; Aufrufen der Ribbon-Funktion mit dem Namen &quot;Funktion&quot;\r\n        Call Funktion()\r\n    End Sub\r\n\r\nEnd Class<\/pre>\n<h1>Schritt 2 (VBA-Makro-Definition in Word)<\/h1>\n<p>In Word muss f\u00fcr dieses Beispiel ein VBA-Makro hinzugef\u00fcgt werden, das die entsprechende Funktion des Ribbons (ComAddins) aufruft. Da in der Regel nicht nur eine Funktion ansprechen m\u00f6chte, sondern mehrere, zeigt der folgenden Code einen generischen Ansatz, bei dem die Suche nach dem ComAddin in eine separate Funktion (initAutomationObject) ausgelagert wurde.<\/p>\n<pre class=\"brush: vbnet; gutter: true\">&#039; Konstante, die den ComAddin-Namen des entsprechenden Ribbons festlegt\r\nPrivate Const MYRIBBON_COMADDIN_NAME As String = &quot;MyRibbon&quot;\r\n\r\n&#039; Durchsuchen der ComAddins nach dem angegebenen Ribbon\r\n&#039;\r\n&#039; Parameter:\r\n&#039; ByRef automationObject As Object   - ComAddin-Objekt\r\n&#039; ByVal sRibbon As String            - Name des zu suchenden Ribbons\r\n&#039;\r\n&#039; R\u00fcckgabewerte:\r\n&#039; true  - Ribbon \/ ComAddin vorhanden\r\n&#039; false - Ribbon \/ ComAddin NICHT vorhanden\r\n&#039;\r\nFunction initAutomationObject(ByRef automationObject As Object, ByVal sRibbon As String) As Boolean\r\n    Dim addIn As COMAddIn\r\n    Dim objCOMAddIn As Object\r\n\r\n    &#039; Durchsuchen aller vorhandenen ComAddin\r\n    For Each objCOMAddIn In Application.COMAddIns\r\n        &#039; ...nach dem \u00fcbergebenen Ribbon- \/ ComAddin-Namen\r\n        If StrComp(objCOMAddIn, sRibbon) = 0 Then\r\n            addIn = Application.COMAddIns(sRibbon)\r\n            automationObject = addIn.Object\r\n\r\n            initAutomationObject = True\r\n            Exit For\r\n        Else\r\n            initAutomationObject = False\r\n        End If\r\n    Next\r\nEnd Function\r\n\r\n&#039; Interface zur Ribbon-Funktion\r\nSub MyRibbon_Funktion()\r\n    Dim automationObject As Object\r\n\r\n    &#039; Pr\u00fcfen, ob das ComAddin vorhanden ist\r\n    If initAutomationObject(automationObject, MYRIBBON_COMADDIN_NAME) Then\r\n        &#039; Aufrufen der entsprechenden Ribbon-Funktion\r\n        automationObject.Funktion()\r\n    End If\r\nEnd Sub<\/pre>\n<p>&nbsp;<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Beschreibung Hat man per VSTO sein eigenes Word-Ribbon erstellt, m\u00f6chte man evtl. den Funktionen dieses Ribbons &#8211; wie bei VBA-Makros auch m\u00f6glich &#8211; 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\u00a0keine Tastenkombinationen auf herk\u00f6mmliche Weise (Word-Optionen -&gt; Men\u00fcband anpassen [&hellip;]<\/p>\n","protected":false},"author":3,"featured_media":0,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"ngg_post_thumbnail":0,"_jetpack_memberships_contains_paid_content":false,"footnotes":""},"categories":[29,45],"tags":[49,37,46,38],"class_list":["post-1756","post","type-post","status-publish","format-standard","hentry","category-startseite","category-vsto-word","tag-programmieren","tag-vba","tag-vsto","tag-word"],"jetpack_featured_media_url":"","jetpack_shortlink":"https:\/\/wp.me\/p5LyzC-sk","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/www.kastenmaier.de\/index.php?rest_route=\/wp\/v2\/posts\/1756","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.kastenmaier.de\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.kastenmaier.de\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.kastenmaier.de\/index.php?rest_route=\/wp\/v2\/users\/3"}],"replies":[{"embeddable":true,"href":"https:\/\/www.kastenmaier.de\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=1756"}],"version-history":[{"count":9,"href":"https:\/\/www.kastenmaier.de\/index.php?rest_route=\/wp\/v2\/posts\/1756\/revisions"}],"predecessor-version":[{"id":1760,"href":"https:\/\/www.kastenmaier.de\/index.php?rest_route=\/wp\/v2\/posts\/1756\/revisions\/1760"}],"wp:attachment":[{"href":"https:\/\/www.kastenmaier.de\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=1756"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.kastenmaier.de\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=1756"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.kastenmaier.de\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=1756"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}