{"id":55000376,"date":"2023-06-01T00:00:00","date_gmt":"2023-06-21T11:46:17","guid":{"rendered":"http:\/\/access-im-unternehmen.aix-dev.de\/aiu\/?p=376"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-30T00:00:00","slug":"Outlook_Ribbon_per_COMAddIn_anpassen","status":"publish","type":"post","link":"https:\/\/vbentwickler.de\/Outlook_Ribbon_per_COMAddIn_anpassen\/","title":{"rendered":"Outlook: Ribbon per COM-Add-In anpassen"},"content":{"rendered":"<p><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/vg08.met.vgwort.de\/na\/a1fc3f9044f7490984a485df52edce59\" width=\"1\" height=\"1\" alt=\"\"><\/p>\n<p><b>Wenn wir Outlook um eigene Funktionen erweitern wollen, stellt sich eine Frage: Wie wollen wir diese ausl&ouml;sen? Es gibt einige Ereignisse, die wir bereits im Artikel Outlook: Explorer automatisieren (www.vbentwickler.de\/307) erl&auml;utert haben. Diese werden beispielsweise durch Benutzeraktionen wie das Verschieben einer E-Mail in einen anderen Ordner ausgel&ouml;st. Aber wie k&ouml;nnen wir eigene Funktionen &uuml;ber die Benutzeroberfl&auml;che starten? Dazu bietet sich das Ribbon an. Hier k&ouml;nnen wir eigene Bereiche definieren, in denen wir unsere Funktionsaufrufe unterbringen. Der vorliegende Artikel erl&auml;utert, wie wir das Ribbon unter Outlook anpassen. Dabei sind einige Dinge zu ber&uuml;cksichtigen &#8211; zum Beispiel, dass es nicht wie bei den &uuml;brigen Office-Anwendungen nur ein Fenster gibt, das eine eigene Ribbondefinition verwendet.<\/b><\/p>\n<h2>Ribbon-Elemente im &Uuml;berblick<\/h2>\n<p>Wir beginnen direkt mit dem eingangs erw&auml;hnten Umstand, dass Outlook nicht nur eine Ribbondefinition verwendet wie die &uuml;brigen Office-Anwendungen.<\/p>\n<p>Das wird offensichtlich, wenn wir beispielsweise den Ribbonbefehl <b>Start|Neu|Neue E-Mail <\/b>aufrufen. Nicht nur das Outlook-Hauptfenster, sondern auch das Fenster zum Erstellen einer neuen E-Mail weist ein Ribbon auf (siehe Bild 1). Das macht die Sache im Gegensatz zu den &uuml;brigen Office-Anwendungen komplizierter. Woher wissen wir, f&uuml;r welches Fenster wir gerade das Ribbon anpassen? Und wie passen wir es in Outlook &uuml;berhaupt an?<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2023_03\/pic_376_001.png\" alt=\"Outlook hat verschiedene Fenster mit Ribbons\" width=\"624,6265\" height=\"498,2142\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 1: Outlook hat verschiedene Fenster mit Ribbons<\/span><\/b><\/p>\n<h2>Ribbon per Benutzeroberfl&auml;che anpassen<\/h2>\n<p>Genau wie die &uuml;brigen Office-Anwendungen bietet auch Outlook die M&ouml;glichkeit, das Ribbon &uuml;ber die Benutzeroberfl&auml;che anzupassen. Dazu &ouml;ffnen wir die Outlook-Optionen und wechseln zum Bereich <b>Men&uuml;band anpassen<\/b> (siehe Bild 2). Hier finden wir in der rechten Liste einige Eintr&auml;ge mit den Hauptregisterkarten. Je nachdem, welcher Objekttyp gerade im Explorer angezeigt wird, also beispielsweise E-Mail oder Termin, erscheint ein anderes <b>Start<\/b>-Tab. Diese werden auch in der Liste der Hauptregisterkarten dargestellt &#8211; zum Beispiel <b>Start (E-Mail) <\/b>oder <b>Start (Kalender)<\/b>.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2023_03\/pic_376_002.png\" alt=\"Anpassen des Ribbons im Optionen-Dialog von Outlook\" width=\"700\" height=\"424,0384\"\/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 2: Anpassen des Ribbons im Optionen-Dialog von Outlook<\/span><\/b><\/p>\n<h2>Ribbondefinition anpassen<\/h2>\n<p>Welche M&ouml;glichkeiten haben wir, das Ribbon von Outlook und seiner Explorer wie beispielsweise zum Erstellen von E-Mails anzupassen, wenn wir nicht die Benutzeroberfl&auml;che nutzen wollen?<\/p>\n<p>Die einzige M&ouml;glichkeit ist die Programmierung eines COM-Add-Ins. Zum Gl&uuml;ck kennen wir mit twinBASIC ein praktisches Tool, um COM-Add-Ins zu programmieren. Im Artikel <b>COM-Add-Ins mit twinBASIC <\/b>(<b>www.vbentwickler.de\/311<\/b>) haben wir uns bereits die Grundlagen der Erstellung von COM-Add-Ins mit twinBASIC angesehen. Darauf bauen wir auf und erstellen mit twinBASIC ein neues COM-Add-In auf Basis der Vorlage <b>Samples|MyCOMAddin<\/b>.  Dieses passen wir wie nachfolgend beschrieben an, um einen ersten eigenen Ribbon-Eintrag in Outlook zu erzeugen.<\/p>\n<h2>Projekteinstellungen anpassen<\/h2>\n<p>Nach dem Erstellen des Projekts &auml;ndern wir die Projekteinstellungen und f&uuml;gen einen Verweis auf die Outlook-Bibliothek hinzu. Dazu klicken wir im <b>Project Explorer <\/b>auf den Eintrag <b>Settings<\/b>. Hier tragen wir f&uuml;r <b>Project: Name<\/b>, <b>Project: Description <\/b>und <b>Project: Application Title <\/b>jeweils den Wert <b>OutlookRibbonAnpassen <\/b>ein (siehe Bild 3).<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2023_03\/pic_376_004.png\" alt=\"Anpassen der Projekteinstellungen\" width=\"649,627\" height=\"416,4707\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 3: Anpassen der Projekteinstellungen<\/span><\/b><\/p>\n<p>Danach f&uuml;gen wir im gleichen Bereich weiter unten unter <b>COM Type Library \/ ActiveX References <\/b>den Verweis <b>Microsoft Outlook 16.0 Object Library <\/b>hinzu.<\/p>\n<p>Danach passen wir die Klasse <b>MyCOMAddin<\/b> an, indem wir diese in <b>OutlookRibbonAnpassen <\/b>umbenennen. Entsprechend &auml;ndern wir auch den Namen der Klasse im Code. Der allgemeine Teil des Codes der Klasse sieht nun wie folgt aus. Hier sehen wir die <b>ClassId<\/b>, mit der das COM-Add-In in der Registry einigetragen wird. Darunter folgt die eigentliche Definition der Klasse, die zwei Schnittstellen implementiert. <b>IDTExtensibility2 <\/b>enth&auml;lt die Elemente, die f&uuml;r das Laden des COM-Add-Ins notwendig sind. <b>IRibbonExtensibility <\/b>liefert die Elemente, die f&uuml;r das Anwenden von Anpassungen der Ribbondefinition n&ouml;tig sind. Au&szlig;erdem definieren wir hier eine Objektvariable namens <b>objOutlook <\/b>mit dem Typ <b>Outlook.Application<\/b>. Diese f&uuml;llen wir gleich im Anschluss mit einem Verweis auf die Outlook-Instanz, welche das COM-Add-In l&auml;dt:<\/p>\n<pre>[ ClassId (\"2933A563-3C51-4120-AC8A-BA10CC656CA7\") ]\r\n<span style=\"color:blue;\">Class<\/span> OutlookRibbonAnpassen\r\n     Implements IDTExtensibility2\r\n     [ WithDispatchForwarding ]\r\n     Implements IRibbonExtensibility\r\n        \r\n     <span style=\"color:blue;\">Private <\/span>objOutlook<span style=\"color:blue;\"> As <\/span>Outlook.Application\r\n     ...\r\n<span style=\"color:blue;\">End Class<\/span><\/pre>\n<p>F&uuml;r die Schnittstelle <b>IDTExtensitility2 <\/b>m&uuml;ssen wir die folgenden f&uuml;nf Ereignisprozeduren implementieren, von denen wir nur die erste mit einer Anweisung f&uuml;llen. Das Ereignis <b>OnConnection <\/b>wird beim Verbinden der Anwendung mit dem COM-Add-In ausgel&ouml;st und liefert unter anderem mit dem Parameter <b>Application <\/b>einen Verweis auf die aufrufende Anwendung, in diesem Fall Outlook. Den Inhalt dieses Parameters weisen wir der Variablen <b>objOutlook <\/b>zu. Diese und die &uuml;brigen Ereignisprozeduren sehen wir in Listing 1.<\/p>\n<pre><span style=\"color:blue;\">Sub <\/span>OnConnection(ByVal Application<span style=\"color:blue;\"> As Object<\/span>, ByVal ConnectMode<span style=\"color:blue;\"> As <\/span>ext_ConnectMode, ByVal AddInInst<span style=\"color:blue;\"> As Object<\/span>, _\r\n         ByRef custom<span style=\"color:blue;\"> As Variant<\/span>()) Implements IDTExtensibility2.OnConnection\r\n     <span style=\"color:blue;\">Set<\/span> objOutlook = Application\r\n<span style=\"color:blue;\">End Sub<\/span>\r\n&nbsp;&nbsp;&nbsp;&nbsp;\r\n<span style=\"color:blue;\">Sub <\/span>OnDisconnection(ByVal RemoveMode<span style=\"color:blue;\"> As <\/span>ext_DisconnectMode, ByRef custom<span style=\"color:blue;\"> As Variant<\/span>()) _\r\n         Implements IDTExtensibility2.OnDisconnection\r\n<span style=\"color:blue;\">End Sub<\/span>\r\n&nbsp;&nbsp;&nbsp;&nbsp;\r\n<span style=\"color:blue;\">Sub <\/span>OnAddInsUpdate(ByRef custom<span style=\"color:blue;\"> As Variant<\/span>()) Implements IDTExtensibility2.OnAddInsUpdate\r\n<span style=\"color:blue;\">End Sub<\/span>\r\n&nbsp;&nbsp;&nbsp;&nbsp;\r\n<span style=\"color:blue;\">Sub <\/span>OnStartupComplete(ByRef custom<span style=\"color:blue;\"> As Variant<\/span>()) Implements IDTExtensibility2.OnStartupComplete\r\n<span style=\"color:blue;\">End Sub<\/span>\r\n&nbsp;&nbsp;&nbsp;&nbsp;\r\n<span style=\"color:blue;\">Sub <\/span>OnBeginShutdown(ByRef custom<span style=\"color:blue;\"> As Variant<\/span>()) Implements IDTExtensibility2.OnBeginShutdown\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 1: Implementierung der Schnittstelle IDTExtensibility2<\/span><\/b><\/p>\n<h2>Ribbondefinition anpassen<\/h2>\n<p>Zum Anpassen der Ribbondefinition beginnen wir mit dem Hinzuf&uuml;gen eines Icons, das wir im Ribbon f&uuml;r eine neu zu erstellende Schaltfl&auml;che anzeigen wollen. Dieses f&uuml;gen wir zum Projekt hinzu, indem wir im Bereich Ressources des Projektexplorers mit der rechten Maustaste auf den Eintrag <b>ICON <\/b>klicken und <b>Add|Import File&#8230; <\/b>ausw&auml;hlen. Im nun erscheinenden Dialog w&auml;hlen wir die gew&uuml;nschte <b>.ico<\/b>-Datei aus. Diese wird anschlie&szlig;end wie in Bild 4 angezeigt.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2023_03\/pic_376_005.png\" alt=\"Ein neues Icon im Projektexplorer\" width=\"424,6267\" height=\"326,9902\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 4: Ein neues Icon im Projektexplorer<\/span><\/b><\/p>\n<p>Damit kommen wir zu der Funktion, die durch die Schnittstelle <b>IRibbonExtensibility <\/b>beim Laden des COM-Add-Ins ausgel&ouml;st wird. Diese hei&szlig;t <b>GetCustomUI <\/b>und enth&auml;lt einen Parameter namens <b>RibbonID<\/b>. Dieser wird gleich noch eine entscheidende Rolle spielen. Erst einmal gehen wir so vor, wie wir es auch bei COM-Add-Ins f&uuml;r die &uuml;brigen Office-Anwendungen getan haben. Dazu legen wir die Funktion <b>GetCustomUI <\/b>wie in Listing 2 an. Die Funktion stellt den Code der Ribbondefinition zusammen und gibt diesen als Funktionsergebnis zur&uuml;ck. Die Ribbondefinition enth&auml;lt zun&auml;chst nur ein <b>tab<\/b>-Element mit einem <b>group<\/b>-Element und einem <b>button<\/b>-Element. F&uuml;r das &uuml;bergeordnete <b>customUI<\/b>-Element haben wir das Attribut <b>loadImage <\/b>mit dem Wert <b>LoadImage <\/b>hinterlegt. Diese Callbackprozedur hinterlegen wir ebenfalls in der Klasse:<\/p>\n<pre><span style=\"color:blue;\">Private Function <\/span>GetCustomUI(ByVal RibbonID<span style=\"color:blue;\"> As String<\/span>)<span style=\"color:blue;\"> As String<\/span> Implements IRibbonExtensibility.GetCustomUI\r\n     <span style=\"color:blue;\">Dim <\/span>strXML<span style=\"color:blue;\"> As String<\/span>\r\n     strXML &= \"&lt;customUI xmlns=\"\"http:\/\/schemas.microsoft.com\/office\/2009\/07\/customui\"\" loadImage=\"\"LoadImage\"\"&gt;\" _\r\n         & <span style=\"color:blue;\">vbCrLf<\/span>\r\n     strXML &= \"  &lt;ribbon&gt;\" & <span style=\"color:blue;\">vbCrLf<\/span>\r\n     strXML &= \"    &lt;tabs&gt;\" & <span style=\"color:blue;\">vbCrLf<\/span>\r\n     strXML &= \"      &lt;tab id=\"\"tab\"\" label=\"\"Beispieltab\"\"&gt;\" & <span style=\"color:blue;\">vbCrLf<\/span>\r\n     strXML &= \"        &lt;group id=\"\"grp\"\" label=\"\"Beispielgruppe\"\"&gt;\" & <span style=\"color:blue;\">vbCrLf<\/span>\r\n     strXML &= \"          &lt;button id=\"\"btn\"\" label=\"\"Beispielbutton\"\" onAction=\"\"onAction\"\" image=\"\"mail.ico\"\" \" _\r\n         & \"size=\"\"large\"\"\/&gt;\" & <span style=\"color:blue;\">vbCrLf<\/span>\r\n     strXML &= \"        &lt;\/group&gt;\" & <span style=\"color:blue;\">vbCrLf<\/span>\r\n     strXML &= \"      &lt;\/tab&gt;\" & <span style=\"color:blue;\">vbCrLf<\/span>\r\n     strXML &= \"    &lt;\/tabs&gt;\" & <span style=\"color:blue;\">vbCrLf<\/span>\r\n     strXML &= \"  &lt;\/ribbon&gt;\" & <span style=\"color:blue;\">vbCrLf<\/span>\r\n     strXML &= \"&lt;\/customUI&gt;\" & <span style=\"color:blue;\">vbCrLf<\/span>\r\n     Return strXML\r\n<span style=\"color:blue;\">End Function<\/span><\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 2: Implementierung der Schnittstelle IRibbonExtensibility<\/span><\/b><\/p>\n<pre><span style=\"color:blue;\">Function <\/span>LoadImage(imageId<span style=\"color:blue;\"> As String<\/span>)<span style=\"color:blue;\"> As <\/span>IPictureDisp\r\n     Return LoadResPicture(imageId, _\r\n         vbResBitmapFromIcon, 32, 32)\r\n<span style=\"color:blue;\">End Function<\/span><\/pre>\n<div class=\"rcp_restricted\"><p><span style=\"color: #ff0000;\">M&ouml;chten Sie weiterlesen? Dann l&ouml;sen Sie Ihr Ticket!<\/span><br \/>\n<span style=\"color: #ff0000;\">Hier geht es zur Bestellung des Jahresabonnements des Magazins <strong>Visual Basic Entwickler<\/strong>:<\/span><br \/>\n<span style=\"color: #ff0000;\"><a style=\"color: #ff0000;\" href=\"https:\/\/shop.minhorst.com\/magazine\/363\/visual-basic-entwickler-jahresabonnement?c=77\">Zur Bestellung ...<\/a><\/span><br \/>\n<span style=\"color: #ff0000;\">Danach greifen Sie sofort auf <strong>alle rund 200 Artikel<\/strong> unseres Angebots zu - auch auf diesen hier!<\/span><br \/>\n<span style=\"color: #000000;\">Oder haben Sie bereits Zugangsdaten? Dann loggen Sie sich gleich hier ein:<\/span><\/p>\n<\/div>\n\n\t\n\t<form id=\"rcp_login_form\"  class=\"rcp_form\" method=\"POST\" action=\"https:\/\/vbentwickler.de\/data\/wp\/v2\/posts\/55000376\/\">\n\n\t\t\n\t\t<fieldset class=\"rcp_login_data\">\n\t\t\t<p>\n\t\t\t\t<label for=\"rcp_user_login\">Username or Email<\/label>\n\t\t\t\t<input name=\"rcp_user_login\" id=\"rcp_user_login\" class=\"required\" type=\"text\"\/>\n\t\t\t<\/p>\n\t\t\t<p>\n\t\t\t\t<label for=\"rcp_user_pass\">Password<\/label>\n\t\t\t\t<input name=\"rcp_user_pass\" id=\"rcp_user_pass\" class=\"required\" type=\"password\"\/>\n\t\t\t<\/p>\n\t\t\t\t\t\t<p>\n\t\t\t\t<input type=\"checkbox\" name=\"rcp_user_remember\" id=\"rcp_user_remember\" value=\"1\"\/>\n\t\t\t\t<label for=\"rcp_user_remember\">Remember me<\/label>\n\t\t\t<\/p>\n\t\t\t<p class=\"rcp_lost_password\"><a href=\"\/data\/wp\/v2\/posts\/55000376?rcp_action=lostpassword\"><\/a><\/p>\n\t\t\t<p>\n\t\t\t\t<input type=\"hidden\" name=\"rcp_action\" value=\"login\"\/>\n\t\t\t\t<input type=\"hidden\" name=\"rcp_redirect\" value=\"https:\/\/vbentwickler.de\/data\/wp\/v2\/posts\/55000376\/\"\/>\n\t\t\t\t<input type=\"hidden\" name=\"rcp_login_nonce\" value=\"0c38ab74e4\"\/>\n\t\t\t\t<input id=\"rcp_login_submit\" class=\"rcp-button\" type=\"submit\" value=\"Login\"\/>\n\t\t\t<\/p>\n\t\t\t\t\t<\/fieldset>\n\n\t\t\n\t<\/form>\n<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Wenn wir Outlook um eigene Funktionen erweitern wollen, stellt sich eine Frage: Wie wollen wir diese ausl&ouml;sen? Es gibt einige Ereignisse, die wir bereits im Artikel Outlook: Explorer automatisieren (www.vbentwickler.de\/307) erl&auml;utert haben. Diese werden beispielsweise durch Benutzeraktionen wie das Verschieben einer E-Mail in einen anderen Ordner ausgel&ouml;st. Aber wie k&ouml;nnen wir eigene Funktionen &uuml;ber die Benutzeroberfl&auml;che starten? Dazu bietet sich das Ribbon an. Hier k&ouml;nnen wir eigene Bereiche definieren, in denen wir unsere Funktionsaufrufe unterbringen. Der vorliegende Artikel erl&auml;utert, wie wir das Ribbon unter Outlook anpassen. Dabei sind einige Dinge zu ber&uuml;cksichtigen &#8211; zum Beispiel, dass es nicht wie bei den &uuml;brigen Office-Anwendungen nur ein Fenster gibt, das eine eigene Ribbondefinition verwendet.<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"om_disable_all_campaigns":false,"_monsterinsights_skip_tracking":false,"_monsterinsights_sitenote_active":false,"_monsterinsights_sitenote_note":"","_monsterinsights_sitenote_category":0,"_uf_show_specific_survey":0,"_uf_disable_surveys":false,"footnotes":""},"categories":[662023,66032023,44000026,44000023],"tags":[],"yst_prominent_words":[],"class_list":["post-55000376","post","type-post","status-publish","format-standard","hentry","category-662023","category-66032023","category-Outlook_programmieren","category-PowerApps"],"aioseo_notices":[],"_links":{"self":[{"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/posts\/55000376","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/comments?post=55000376"}],"version-history":[{"count":0,"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/posts\/55000376\/revisions"}],"wp:attachment":[{"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/media?parent=55000376"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/categories?post=55000376"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/tags?post=55000376"},{"taxonomy":"yst_prominent_words","embeddable":true,"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/yst_prominent_words?post=55000376"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}