{"id":55000986,"date":"2015-06-01T00:00:00","date_gmt":"2020-05-22T21:01:01","guid":{"rendered":"http:\/\/access-im-unternehmen.aix-dev.de\/aiu\/?p=986"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-30T00:00:00","slug":"OutlookTextbausteine_mit_Access","status":"publish","type":"post","link":"https:\/\/access-im-unternehmen.de\/OutlookTextbausteine_mit_Access\/","title":{"rendered":"Outlook-Textbausteine mit Access"},"content":{"rendered":"<p><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/vg07.met.vgwort.de\/na\/0bec3594d75c48aab43a6feebc9f94f5\" width=\"1\" height=\"1\" alt=\"\"><\/p>\n<p><b>W&auml;re es nicht toll, wenn Sie eine Kundenanfrage, die keine individuelle Antwort erfordert, per Textbaustein beantworten k&ouml;nnten, der dennoch etwas Individualit&auml;t aufweist Dazu w&uuml;rde es ja beispielsweise reichen, wenn Sie den Kunden ordentlich anreden, beispielsweise mit &#8222;Sehr geehrter Herr M&uuml;ller&#8220;. Das Ganze sollte dann auch noch mit m&ouml;glichst wenig Handgriffen geschehen, also beispielsweise &uuml;ber einen Klick auf einen Ribbon-Eintrag der zu beantwortenden Mail oder einen Kontextmen&uuml;-Eintrag. Wie dies gelingt und wie Sie Ihre Kundendatenbank einbeziehen, um Anrede und Name zur E-Mail-Adresse des Absenders zu ermitteln, zeigt dieser Beitrag.<\/b><\/p>\n<p><b>Textbausteine f&uuml;r Outlook-Mails<\/b><\/p>\n<p>Textbausteine etwa im Antworttext auf Support-Anfragen sind ja im Allgemeinen verp&ouml;nt. Allerdings muss man auch sagen, dass es erm&uuml;dend sein kann, wenn man als Support-Mitarbeiter immer wieder die gleichen Anfragen mit &auml;hnlichen Antworten zur&uuml;cksendet. Entscheidend ist also vielleicht gar nicht einmal, dass man &uuml;berhaupt Textbausteine verwendet, sondern dass man diese sinnvoll einsetzt &euro;&#8220; der Kunde darf auch durchaus erkennen, dass er eine Standardantwort auf seine Anfrage erh&auml;lt. Das gilt allerdings nur, wenn er dadurch auch die Antwort erh&auml;lt, die sein Problem l&ouml;st.<\/p>\n<p>Wir wollen uns erstmal von diesen kommunikativen Problemen l&ouml;sen und uns der technischen Umsetzung zuwenden. Auch wenn es ein Leichtes ist, den Posteingang und somit auch die Kundenanfragen etwa in die Kundendatenbank umzuleiten und von dort aus zu antworten, so ist der eine oder andere doch so sehr den Umgang mit Outlook gew&ouml;hnt, dass er sich ungern davon lossagen m&ouml;chte. Also verlegen wir den Schwerpunkt der L&ouml;sung dieses Kapitels einmal nicht in die Access-Anwendung, sondern direkt nach Outlook.<\/p>\n<p>Die L&ouml;sung soll es erm&ouml;glichen, auf eine Kunden-Anfrage zu antworten und dabei Textbausteine aus der Datenbank abzurufen. Nun k&ouml;nnten Sie nat&uuml;rlich einfach ein paar unpers&ouml;nliche Textbausteine verwenden, aber daf&uuml;r m&uuml;ssten Sie beispielsweise die Anrede in der E-Mail (je nach Umgang <b>Sehr geehrter Herr M&uuml;ller<\/b>, <b>Hallo Herr M&uuml;ller <\/b>oder auch <b>Lieber Herr M&uuml;ller<\/b>) von Hand formulieren. Es w&auml;re also praktisch, wenn die L&ouml;sung auch dies &uuml;bernehmen k&ouml;nnte. Das w&uuml;rde erfordern, dass wir anhand der Absenderadresse der Anfrage-E-Mail erkennen, um welchen Kunden es sich handelt. Dazu m&uuml;ssten wir mit der E-Mail-Adresse auf die Kundendatenbank zugreifen und erstens herausfinden, ob der Kunde &uuml;berhaupt ermittelt werden kann und zweitens Anrede, Vorname und\/oder Nachname ermitteln. Daraus bauen wir dann die E-Mail-Anrede zusammen.<\/p>\n<p>Fehlt nur noch der eigentliche Text. Wir gehen davon aus, dass diese L&ouml;sung einfache Anfragen beantworten soll, also beispielsweise danach, wo der Leser eines Access-Magazins seine Zugangsdaten f&uuml;r das Online-Archiv findet. Die verschiedenen Antworttexte sollen dabei einfach &uuml;ber das Kontextmen&uuml; in der Antwort-E-Mail ausw&auml;hlbar sein. Ein Klick soll den Text dann, versehen mit der personalisierten Anrede, in die Mail &uuml;bertragen.<\/p>\n<p>Soweit zur Aufgabenstellung &euro;&#8220; fangen wir an!<\/p>\n<p><b>Technik: Outlook-Add-In<\/b><\/p>\n<p>Zu meinem Befremden hat Microsoft die M&ouml;glichkeit, Kontextmen&uuml;s in Outlook-Fenstern &uuml;ber die <b>CommandBars<\/b>-Auflistung auszulesen und anzupassen, komplett gestrichen. Das w&auml;re auch zu einfach gewesen: Wir h&auml;tten die komplette Funktion dann einfach in das VBA-Projekt von Outlook integrieren k&ouml;nnen. Stattdessen m&uuml;ssen (oder d&uuml;rfen) wir uns nun mit der Programmierung eines COM-Add-Ins mittels Visual Studio 2013 besch&auml;ftigen. D&uuml;rfen deshalb, weil dies doch sehr interessante M&ouml;glichkeiten er&ouml;ffnet. Die Grundlagen zur Erstellung eines COM-Add-Ins sowie zu seiner Weitergabe haben Sie bereits im Beitrag <b>COM-Add-Ins mit Visual Studio Community 2013 <\/b>(<b>www.access-im-unternehmen.de\/982<\/b>) kennengelernt, und wie Sie ein solches Add-In mit einem geeigneten Setup-Projekt weitergeben, erfahren Sie unter dem Titel <b>COM-Add-Ins: Setup erstellen <\/b>(<b>www.access-im-unternehmen.de\/983<\/b>). Also steigen wir gleich in die Materie ein.<\/p>\n<p><b>COM-Add-In erstellen<\/b><\/p>\n<p>Starten Sie zun&auml;chst Visual Studio. Dann w&auml;hlen Sie den Men&uuml;befehl <b>Datei|Neu|Projekt&#8230; <\/b>aus. Im nun erscheinenden Dialog entscheiden wir uns f&uuml;r ein Projekt mit der Vorlage <b>Outlook 2010-Add-In <\/b>und legen den Projektnamen <b>Textbausteine2010 <\/b>fest (s. Bild 1).<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2015_03\/pic_986_001.png\" alt=\"Neues Add-In f&uuml;r Outlook 2010 anlegen\" width=\"650\" height=\"385,9375\"\/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 1: Neues Add-In f&uuml;r Outlook 2010 anlegen<\/span><\/b><\/p>\n<p>Warum Outlook 2010 Nun: Auf dem Rechner mit Visual Studio ist nur Office 2010 installiert.  Daher ist es praktisch, zun&auml;chst f&uuml;r Outlook 2010 zu entwickeln &euro;&#8220; so kann man den aktuellen Stand immer mal wieder zum Debuggen testen. Sp&auml;ter schauen wir uns dann an, wie Sie das Projekt f&uuml;r Outlook 2013 bereitstellen. <\/p>\n<p>Visual Studio erstellt nun das Projekt und zeigt das Klassenmodul <b>ThisAddIn <\/b>mit den beiden Standard-Ereignisprozeduren der hier vorgesehenen Schnittstelle an. Hier m&uuml;ssen wir nun Code unterbringen, der daf&uuml;r sorgt, dass die entsprechenden Kontextmen&uuml;-Eintr&auml;ge zum Kontextmen&uuml; des E-Mail-Entwurfs hinzugef&uuml;gt werden.<\/p>\n<p><b>Erster Test<\/b><\/p>\n<p>Schauen wir uns gleich mal an, ob die mit einem einfachen Meldungsfenster ausgestattete Er-eig-nis-prozedur beim Debuggen mit Outlook funktioniert. Die Prozedur sieht nun so aus:<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>ThisAddIn_Startup() Handles Me.Startup\r\n     <span style=\"color:blue;\">MsgBox<\/span>(\"Startup\")\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p>Klicken Sie dann auf die Schaltfl&auml;che mit dem Pfeil nach rechts und dem Text <b>Starten<\/b>, auf den Men&uuml;eintrag <b>Debuggen|Debugging starten <\/b>oder auf die Taste <b>F5<\/b>. Dies &ouml;ffnet Outlook und die frisch angelegte <b>MsgBox <\/b>erscheint.<\/p>\n<p><b>Kontextmen&uuml;-Erweiterung hinzuf&uuml;gen<\/b><\/p>\n<p>Nun f&uuml;gen wir zun&auml;chst die reine Kontextmen&uuml;-Erweiterung hinzu &euro;&#8220; zun&auml;chst in Form eines einzigen Eintrags. Dazu sind mehrere Schritte n&ouml;tig, die dem Access-Entwickler ungewohnt vorkommen d&uuml;rften. Dieser f&uuml;gt ja der Anwendung eine Tabelle namens <b>USysRibbons <\/b>hinzu, welche die Ribbon-Definition enth&auml;lt, und gibt dann f&uuml;r die Eigenschaften der Anwendung und der Formulare an, welches Ribbon mit welchem Fenster angezeigt werden soll.<\/p>\n<p><b>Grundstruktur zum Projekt hinzuf&uuml;gen<\/b><\/p>\n<p>Hier ben&ouml;tigen Sie zun&auml;chst eine neue Klasse, welche die grundlegende Struktur f&uuml;r den Aufbau einer individuellen Ribbon-Definition liefert. Diese f&uuml;gen Sie &uuml;ber den Men&uuml;eintrag <b>Projekt|Neues Element hinzuf&uuml;gen&#8230; <\/b>von Visual Studio zum Projekt hinzu (s. Bild 2).<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2015_03\/pic_986_003.png\" alt=\"Hinzuf&uuml;gen eines neuen Elements\" width=\"500\" height=\"346,6454\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 2: Hinzuf&uuml;gen eines neuen Elements<\/span><\/b><\/p>\n<p>Dies zeigt den Dialog <b>Neues Element hinzuf&uuml;gen <\/b>aus Bild 3 an. Hier finden Sie eine ganze Reihe m&ouml;glicher Elemente vor, die nach Kategorien sortiert sind. W&auml;hlen Sie hier den Eintrag <b>Men&uuml;band (XML) <\/b>aus. Geben Sie als Bezeichnung f&uuml;r die zu erstellende Klasse den Wert <b>Ribbon_Mail.vb <\/b>ein und klicken Sie auf <b>Hinzuf&uuml;gen<\/b>.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2015_03\/pic_986_002.png\" alt=\"Auswahl des Elements Men&uuml;band (XML) namens Ribbon_Mail\" width=\"650\" height=\"391,3495\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 3: Auswahl des Elements Men&uuml;band (XML) namens Ribbon_Mail<\/span><\/b><\/p>\n<p>Anschlie&szlig;end erscheint die automatisch generierte Klasse in Visual Studio (s. Bild 4).  Die Klasse enth&auml;lt die Implementierung der Schnittstelle <b>IRibbonExtensibility<\/b>. Deren wichtigstes Element ist die Funktion <b>GetCustomUI<\/b>. Diese wird beim Laden des Add-Ins ausgel&ouml;st und kann mit der anzuwendenden Ribbon-Definition gef&uuml;llt werden.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2015_03\/pic_986_004.png\" alt=\"Die neu hinzugef&uuml;gte Klasse\" width=\"650\" height=\"470,6168\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 4: Die neu hinzugef&uuml;gte Klasse<\/span><\/b><\/p>\n<p>Diese Funktion sieht aktuell wie folgt aus:<\/p>\n<pre><span style=\"color:blue;\">Public Function <\/span>GetCustomUI(ByVal ribbonID<span style=\"color:blue;\"> As String<\/span>) _\r\n        <span style=\"color:blue;\"> As String<\/span> Implements _\r\n         Office.IRibbonExtensibility.GetCustomUI\r\n     Return GetResourceText( _\r\n         \"Textbausteine2010.Ribbon_Mail.xml\")\r\n<span style=\"color:blue;\">End Function<\/span><\/pre>\n<p>Mit <b>Return <\/b>&uuml;bergibt sie das Ergebnis der Funktion <b>GetResourceText<\/b>, welche den Inhalt einer im Projekt eingebundenen XML-Datei einliest &euro;&#8220; in diesem Fall namens <b>Ribbon_Mail.xml<\/b>. Diese Datei finden Sie auch im Projektmappen-Explorer, s. Bild 5.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2015_03\/pic_986_005.png\" alt=\"Der Projektmappen-Explorer mit der Ressourcen-Datei\" width=\"422,5\" height=\"301,3636\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 5: Der Projektmappen-Explorer mit der Ressourcen-Datei<\/span><\/b><\/p>\n<p>Schauen wir uns diese Ressourcen-Datei einmal an:<\/p>\n<pre>&lt;xml version=\"1.0\" encoding=\"UTF-8\"&gt;\r\n&lt;customUI ... onLoad=\"Ribbon_Load\"&gt;\r\n   &lt;ribbon&gt;\r\n     &lt;tabs&gt;\r\n       &lt;tab idMso=\"TabAddIns\"&gt;\r\n         &lt;group id=\"MyGroup\" label=\"My Group\"&gt;\r\n         &lt;\/group&gt;\r\n       &lt;\/tab&gt;\r\n     &lt;\/tabs&gt;\r\n   &lt;\/ribbon&gt;\r\n&lt;\/customUI&gt;<\/pre>\n<p>Dies kommt dem Access-Entwickler nun doch wieder sehr bekannt vor &euro;&#8220; zumindest wenn er bereits einmal mit Access 2007 oder neuer gearbeitet hat.<\/p>\n<p><b>Erster Test<\/b><\/p>\n<p>Wollen wir einmal schauen, ob diese Erweiterung bereits angezeigt wird, und starten das Debugging mit <b>F5<\/b>. Outlook wird ge&ouml;ffnet, unsere <b>MsgBox<\/b>-Anweisung zeigt ihre Meldung an, aber am Ribbon &auml;ndert sich nichts.<\/p>\n<p>Nun: Vielleicht ist ein Fehler aufgetreten, den wir nicht sehen, weil die entsprechende Option nicht aktiviert ist. Diese Einstellung finden Sie im Optionen-Dialog von Outlook im Bereich <b>Erweitert|Entwickler <\/b>(s. Bild 6). Aktivieren Sie dort die Option <b>Add-In-Benutzeroberfl&auml;chenfehler anzeigen <\/b>und schlie&szlig;en Sie die Optionen wieder.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2015_03\/pic_986_018.png\" alt=\"Aktivieren der Anzeige von Ribbon-Fehlern\" width=\"650\" height=\"286,524\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 6: Aktivieren der Anzeige von Ribbon-Fehlern<\/span><\/b><\/p>\n<p>Nun beenden wir das Debugging, indem wir Outlook schlie&szlig;en, und starten erneut mit <b>F5<\/b>.<\/p>\n<p>Es geschieht immer noch nichts. Um zu pr&uuml;fen, ob die Prozedur <b>GetCustom-UI <\/b>&uuml;berhaupt aufgerufen wird, f&uuml;gen wir dort eine <b>MsgBox<\/b>-Anweisung ein. Allerdings ohne Erfolg. Dann zeigt sich, dass Lesen immer weiterhilft: Oben im automatisch erstellten Klassenmodul steht n&auml;mlich der Hinweis, dass man die folgende Prozedur in die Klasse <b>ThisAddIn <\/b>kopieren soll:<\/p>\n<pre>Protected Overrides Function _\r\n         CreateRibbonExtensibilityObject()<span style=\"color:blue;\"> As <\/span>_\r\n         Microsoft.Office.Core.IRibbonExtensibility\r\n     Return <span style=\"color:blue;\">New<\/span> Ribbon_Mail()\r\n<span style=\"color:blue;\">End Function<\/span><\/pre>\n<p>Bingo! Nach dem erneuten Start des Debuggers &ouml;ffnet sich Outlook und zeigt das <b>Tab<\/b>-Element namens <b>Add-Ins <\/b>mit dem <b>Group<\/b>-Element <b>MyGroup <\/b>an (s. Bild 7).<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2015_03\/pic_986_007.png\" alt=\"Die erste Ribbon-Anpassung\" width=\"422,5\" height=\"197,0554\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 7: Die erste Ribbon-Anpassung<\/span><\/b><\/p>\n<p><b>Ribbon im Mail-Fenster<\/b><\/p>\n<p>Nun wollen wir allerdings nicht das Ribbon des Hauptfensters von Outlook anpassen, sondern ein Kontextmen&uuml; des Mail-Fensters. Nun bietet die Funktion <b>GetCustomUI <\/b>ja den Parameter <b>ribbonID <\/b>an. Dieser enth&auml;lt den Namen des Objekts, von dem aus die Funktion aufgerufen wurde. Zu Testzwecken erweitern wir <b>GetCustomUI <\/b>zun&auml;chst um ein Meldungsfenster, das den Inhalt von <b>ribbonID <\/b>ausgibt (s. Listing 1).<\/p>\n<pre><span style=\"color:blue;\">Public Function <\/span>GetCustomUI(ByVal ribbonID<span style=\"color:blue;\"> As String<\/span>)<span style=\"color:blue;\"> As String<\/span> Implements Office.IRibbonExtensibility.GetCustomUI\r\n     <span style=\"color:blue;\">MsgBox<\/span>(ribbonID)\r\n     Return GetResourceText(\"Textbausteine2010.Ribbon_Mail.xml\")\r\n<span style=\"color:blue;\">End Function<\/span><\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 1: Ausgabe der ribbonID des aktuell aufgerufenen Ribbons<\/span><\/b><\/p>\n<p>Wenn Sie nun erneut debuggen, erscheint beim Start von Outlook zun&auml;chst ein Meldungsfenster mit dem Inhalt <b>Microsoft.Outlook.Explorer<\/b>. Dies ist also anscheinend die Bezeichnung des Hauptfensters von Outlook. &Atilde;\u0192-ffnen Sie nun ein neues E-Mail-Fenster, erscheint die Meldung aus Bild 8. Dieser Abbildung entnehmen wir erstens, dass das Mail-Fenster <b>Microsoft.Outlook.Mail.Compose <\/b>hei&szlig;t, und zweitens, dass das Ribbon dieses Fensters sich zum Zeitpunkt des Aufrufs von <b>GetCustomUI <\/b>offensichtlich noch im Aufbau befindet. Wenn Sie eine bereits vorhandene Mail &ouml;ffnen, hei&szlig;t das Fenster &uuml;brigens <b>Microsoft.Outlook.Mail.Read<\/b>. Wir m&uuml;ssen also nun zun&auml;chst eine Pr&uuml;fung auf den Wert von <b>ribbonID <\/b>in die Funktion <b>Get-Cus-tomUI <\/b>einbauen, die nur im Falle des Wertes <b>Microsoft.Outlook.Mail.Compose <\/b>eine neue Ribbon-Definition zur&uuml;ckgibt. Dazu verwenden wir eine <b>Select Case<\/b>-Anweisung, die so aussieht:<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2015_03\/pic_986_008.png\" alt=\"Die Funktion GetCustomUI wird auch beim &Atilde;\u0192-ffnen eines E-Mail-Fensters aufgerufen.\" width=\"422,5\" height=\"295,2305\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 8: Die Funktion GetCustomUI wird auch beim &Atilde;\u0192-ffnen eines E-Mail-Fensters aufgerufen.<\/span><\/b><\/p>\n<pre>Select Case ribbonID\r\n     <span style=\"color:blue;\">Case <\/span>\"Microsoft.Outlook.Mail.Compose\"\r\n         Return GetResourceText( _\r\n             \"Textbausteine2010.Ribbon_Mail.xml\")\r\n<span style=\"color:blue;\">End Select<\/span><\/pre>\n<p>Diese &auml;nderung allein f&uuml;hrt nun dazu, dass die bereits bekannte Ribbon-Definition nun auf das Fenster zum Erstellen einer neuen E-Mail angewendet wird (s. Bild 9). Wo wir schon einmal soweit sind: Eigentlich k&ouml;nnen wir die Bezeichnungen der Textbausteine ja auch &uuml;ber das Ribbon verf&uuml;gbar machen. Damit m&uuml;sste der Benutzer zwar erst die Stelle im Text markieren, an welcher der Textbaustein eingef&uuml;gt werden soll, aber immerhin w&auml;re dieser Befehl dann immer sichtbar. Die Erfahrung zeigt, dass Benutzer nicht unbedingt immer das Kontextmen&uuml; auf der Suche nach n&uuml;tzlichen Befehlen durchsuchen. F&uuml;gen wir also zun&auml;chst Steuerelemente zum Ribbon hinzu, die vorerst einige statische Texte in die Mail einf&uuml;gen.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2015_03\/pic_986_009.png\" alt=\"Ribbon-Definition im Mail-Fenster\" width=\"600\" height=\"284,8855\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 9: Ribbon-Definition im Mail-Fenster<\/span><\/b><\/p>\n<p><b>Textbaustein-Auswahlmen&uuml; zum Ribbon hinzuf&uuml;gen<\/b><\/p>\n<p>Die Textbausteine sollen per <b>Menu<\/b>-Steuerelement ausw&auml;hlbar sein. Wo auf den verschiedenen Tabs des Ribbons der neuen E-Mail platzieren wir dieses Ein eigenes Tab w&auml;re wohl &uuml;bertrieben. Wenn Sie die Funktion zum Einsetzen von Textbausteinen oft nutzen m&ouml;chten, k&ouml;nnen Sie diese direkt auf dem Ribbon-Tab namens <b>Nachricht <\/b>anzeigen, das direkt beim &Atilde;\u0192-ffnen der neuen Mail erscheint. Besser geeignet scheint jedoch das Tab <b>Einf&uuml;gen<\/b>. Also wollen wir dort ein Menu-Element mit vorerst vier Eintr&auml;gen unterbringen, die jeweils die Bezeichnung <b>Textbaustein 1<\/b>, <b>Textbaustein 2<\/b>, <b>Textbaustein 3 <\/b>und <b>Textbaustein 4 <\/b>enthalten.<\/p>\n<p><b>Grundlegender XML-Code f&uuml;r die Ribbon-Anpassung<\/b><\/p>\n<p>Der dazu ben&ouml;tigte XML-Code sieht wie in Listing 2 aus.<\/p>\n<pre>&lt;xml version=\"1.0\" encoding=\"UTF-8\"&gt;\r\n&lt;customUI xmlns=\"http:\/\/schemas.microsoft.com\/office\/2009\/07\/customui\" loadImage=\"loadImage\"&gt;\r\n     &lt;ribbon&gt;\r\n         &lt;tabs&gt;\r\n             &lt;tab idMso=\"TabInsert\"&gt;\r\n                 &lt;group id=\"grpEinfuegen\" label=\"Textbausteine\" insertAfterMso=\"GroupInclude\"&gt;\r\n                     &lt;menu label=\"Textbaustein ausw&auml;hlen\" id=\"mnuTextbausteine\" size=\"large\" image=\"text_32\"&gt;\r\n                         &lt;button label=\"Textbaustein 1\" id=\"btnTextbaustein1\" onAction=\"onAction\" image=\"text_16\"\/&gt;\r\n                         &lt;button label=\"Textbaustein 2\" id=\"btnTextbaustein2\" onAction=\"onAction\" image=\"text_16\"\/&gt;\r\n                         &lt;button label=\"Textbaustein 3\" id=\"btnTextbaustein3\" onAction=\"onAction\" image=\"text_16\"\/&gt;\r\n                         &lt;button label=\"Textbaustein 4\" id=\"btnTextbaustein4\" onAction=\"\"nAction\"\"image=\"text_16\"\/&gt;\r\n                     &lt;\/menu&gt;\r\n                 &lt;\/group&gt;\r\n             &lt;\/tab&gt;\r\n         &lt;\/tabs&gt;\r\n     &lt;\/ribbon&gt;\r\n&lt;\/customUI&gt;<\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 2: Ribbon-Definition mit einem Men&uuml; und vier Unterpunkten<\/span><\/b><\/p>\n<p>In dieser Definition stecken eine Reihe Elemente, die wir erl&auml;utern m&uuml;ssen &euro;&#8220; gerade f&uuml;r Ribbon-Neulinge, aber auch f&uuml;r Entwickler, die schon einmal mit Ribbons entwickelt haben. Die Ribbon-Definition beschreibt die Struktur der Ribbon-Steuerelemente.<\/p>\n<p>Das <b>customUI<\/b>-Element ist das Hauptelement. Darunter finden wir das <b>ribbon<\/b>-Element, das alle Elemente enth&auml;lt, welche das Aussehen der Ribbon-Leiste oben in der Anwendung beschreiben. Es gibt noch andere Elemente wie etwa Kontextmen&uuml;s, aber dazu kommen wir ja gleich.<\/p>\n<p>Unterhalb des <b>ribbon<\/b>-Elements folgt ein zusammenfassendes <b>tabs<\/b>-Element, das die einzelnen <b>tab<\/b>-Elemente einfasst. Die <b>tab<\/b>-Elemente enthalten beispielsweise ein Attribut namens <b>label<\/b>, mit dem Sie die Beschriftung eines benutzerdefinierten <b>tab<\/b>-Elements festlegen. In diesem Fall wollen wir aber kein <b>tab<\/b>-Element hinzuf&uuml;gen, sondern ein <b>group<\/b>-Element zu einem eingebauten <b>tab<\/b>-Element hinzuf&uuml;gen. Dazu m&uuml;ssen wir den Namen dieses <b>tab<\/b>-Elements ermitteln und diesen f&uuml;r die Eigenschaft <b>idMso <\/b>des <b>tab<\/b>-Elements angeben.<\/p>\n<p><b>idMso f&uuml;r eingebaute Ribbon-Elemente ermitteln<\/b><\/p>\n<p>Aber woher erfahren wir den Namen dieses Elements Dies ist insbesondere unter Outlook eine Herausforderung, denn hier gibt es nicht nur ein Ribbon, sondern eines f&uuml;r die Hauptanwendung und je ein weiteres f&uuml;r die vielen weiteren Fenster &euro;&#8220; etwa zum Verfassen einer Mail, zum Anzeigen einer Mail, zum Anzeigen eines Termins, zum Anzeigen eines Kontakts und viele mehr. Microsoft hat eine Reihe von Excel-Dateien bereitgestellt, die jeweils eine Liste aller Elemente eines Ribbons enthalten. Sie finden diese zum Download unter  und . In Bild 10 haben wir beispielsweise die Dateien f&uuml;r Office 2013 dargestellt, die von uns ben&ouml;tigte ist markiert.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2015_03\/pic_986_196.png\" alt=\"Liste aller Dateien mit Ribbon-Elementen f&uuml;r die verschiedenen Anwendungen und Outlook-Inspektoren\" width=\"475\" height=\"676,493\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 10: Liste aller Dateien mit Ribbon-Elementen f&uuml;r die verschiedenen Anwendungen und Outlook-Inspektoren<\/span><\/b><\/p>\n<p>Wir m&ouml;chten nun beispielsweise wissen, wie das <b>tab<\/b>-Element hei&szlig;t, dem wir unser <b>group<\/b>-Element hinzuf&uuml;gen m&ouml;chten. Wir wissen lediglich, dass die deutsche Fassung <b>Einf&uuml;gen <\/b>hei&szlig;t. Und so &ouml;ffnen wir die Datei <b>outlookmailitemcontrols.xlsx <\/b>und schauen, ob wir einen Eintrag finden, der in der Spalte <b>Control Type <\/b>den Wert <b>Tab<\/b> besitzt und der &uuml;bersetzt etwas mit <b>Einf&uuml;gen <\/b>zu tun hat. Diesen finden wir recht schnell, wie Bild 11 zeigt.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2015_03\/pic_986_197.png\" alt=\"Ermitteln des Namens eines tab-Elements\" width=\"650\" height=\"784,699\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 11: Ermitteln des Namens eines tab-Elements<\/span><\/b><\/p>\n<p>Somit erhalten wir den Wert <b>TabInsert <\/b>f&uuml;r das Attribut <b>idMso<\/b>. Nun haben wir also einen Bezug zum Einf&uuml;gen-Tab hergestellt. Wir m&ouml;chten nun ein neues <b>group<\/b>-Element namens <b>Textbausteine <\/b>einf&uuml;gen.<\/p>\n<p>Das ist kein Problem, wird aber zumindest interessanter, wenn wir es nicht einfach ganz hinten, sondern an einer bestimmten Position einf&uuml;gen m&ouml;chten &euro;&#8220; in unserem Fall gleich neben der wichtigsten Gruppe <b>Einschlie&szlig;en<\/b>, die sich ganz links befindet (s. Bild 12). In der Abbildung sehen Sie auch schon den zu erstellenden Eintrag.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2015_03\/pic_986_198.png\" alt=\"Hier m&ouml;chten wir landen.\" width=\"550\" height=\"221,028\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 12: Hier m&ouml;chten wir landen.<\/span><\/b><\/p>\n<p>Der Name dieses <b>group<\/b>-Elements ist in der Excel-Tabelle <b>outlookmailitemcontrols.xlsx<\/b> nun nicht mehr schwer zu finden &euro;&#8220; es folgt hinter dem soeben bereits ermittelten <b>tab<\/b>-Element <b>TabInsert <\/b>und hei&szlig;t <b>GroupInclude<\/b>. Damit unsere Gruppe direkt hinter dieser Gruppe landet, f&uuml;gen wir diesem Element das Attribut <b>insertAfterMso <\/b>den Namen der Gruppe als Wert hinzu.<\/p>\n<p>Nun folgt das eigentliche Steuerelement, n&auml;mlich ein <b>menu<\/b>-Element mit der Beschriftung <b>Text-bau-stein <\/b>ausw&auml;hlen, dessen Gr&ouml;&szlig;e mit dem Attribut <b>size <\/b>auf <b>large <\/b>eingestellt ist und dem wir mit dem <b>image<\/b>-Attribut ein Bild mit der Referenzbezeichnung <b>text_32 <\/b>zuweisen:<\/p>\n<pre>&lt;menu label=\"Textbaustein ausw&auml;hlen\" id=\"mnuTextbausteine\" size=\"large\" image=\"text_32\"&gt;<\/pre>\n<p>Wie wir diese Bilder holen, erfahren Sie gleich im Anschluss. Erst werfen wir noch einen Blick auf einen der Men&uuml;eintr&auml;ge, die etwa so definiert werden:<\/p>\n<pre>&lt;button label=\"Textbaustein 1\" id=\"btnTextbaustein1\" onAction=\"onAction\" image=\"text_16\"\/&gt;<\/pre>\n<p>Die Men&uuml;eintr&auml;ge werden als <b>button<\/b>-Elemente definiert, die zun&auml;chst eine Bezeichnung (<b>label<\/b>) und die eindeutige Kennzeichnung (<b>id<\/b>) aufweisen. Dann folgt das Attribut <b>onAction<\/b>, mit dem wir den Namen der Visual-Basic-Callback-Funktion angeben, die beim Anklicken dieses Elements ausgel&ouml;st werden soll. Und schlie&szlig;lich haben wir auch dem Men&uuml;-Eintrag wieder eine Bildreferenz zugewiesen, die diesmal <b>text_16 <\/b>hei&szlig;t.<\/p>\n<p><b>Bei Mausklick &#8230;<\/b><\/p>\n<p>Zun&auml;chst kommen wir zum <b>onAction<\/b>-Attribut. Die dort angegebene Funktion <b>onAction <\/b>legen Sie wie in Listing 3 im Klassenmodul <b>Ribbon_Mail.vb <\/b>an.<\/p>\n<pre>    Sub OnAction(control<span style=\"color:blue;\"> As <\/span>Office.IRibbonControl)\r\n         <span style=\"color:blue;\">Dim <\/span>objMail<span style=\"color:blue;\"> As <\/span>Outlook.MailItem\r\n         Select Case control.Id\r\n             <span style=\"color:blue;\">Case <\/span>\"btnTextbaustein1\"\r\n                 objMail = Globals.ThisAddIn.Application.ActiveInspector().CurrentItem()\r\n                 objMail.Body = \"Dies ist der Textbaustein mit der Nummer 1.\" & objMail.Body\r\n             <span style=\"color:blue;\">Case <\/span>\"btnTextbaustein2\"\r\n                 objMail = Globals.ThisAddIn.Application.ActiveInspector().CurrentItem()\r\n                 objMail.Body = \"Dies ist der Textbaustein mit der Nummer 2.\" & objMail.Body\r\n             <span style=\"color:blue;\">Case <\/span>\"btnTextbaustein3\"\r\n                 objMail = Globals.ThisAddIn.Application.ActiveInspector().CurrentItem()\r\n                 objMail.Body = \"Dies ist der Textbaustein mit der Nummer 3.\" & objMail.Body\r\n             <span style=\"color:blue;\">Case <\/span>\"btnTextbaustein4\"\r\n                 objMail = Globals.ThisAddIn.Application.ActiveInspector().CurrentItem()\r\n                 objMail.Body = \"Dies ist der Textbaustein mit der Nummer 4.\" & objMail.Body\r\n         <span style=\"color:blue;\">End Select<\/span>\r\n     End Sub<\/pre>\n<p><!--30percent--><\/p>\n<p><b><span style=\"color:darkgrey;\">Listing 3: Prozedur, die durch das Ereignis onAction einer der Schaltfl&auml;chen ausgel&ouml;st wird<\/span><\/b><\/p>\n<p>Diese Prozedur nimmt mit dem Parameter <b>control <\/b>einen Verweis auf das aufrufende Steuer-element aus dem Ribbon entgegen, hier also etwa die Schaltfl&auml;che <b>btnTextbaustein1<\/b>. Die Eigen-schaft <b>id <\/b>dieses Objekts des Typs <b>IRibbonControl <\/b>liefert den Namen des Steuerelements, den die Prozedur dann in einer <b>Select Case<\/b>-Bedingung auswertet. Hier legen wir jeweils zwei An-wei-sungen an: Die erste ermittelt das aktuelle Mail-Objekt. Dazu ermittelt sie aus der Klasse <b>Glo-bals<\/b>, die viele wichtige Informationen liefert, einen Verweis auf die Klasse <b>ThisAddIn<\/b>, deren Eigen-schaft <b>Application <\/b>wiederum einen Verweis auf die aktuelle Anwendung liefert, in diesem Fall also Outlook. Die Eigenschaft <b>ActiveInspector <\/b>liefert wiederum einen Verweis auf das aktuelle Fenster mit der frisch erzeugen E-Mail.<\/p>\n<p>Das <b>MailItem<\/b>-Objekt weist die Prozedur dabei der Variablen <b>objMail <\/b>zu. Wir wollen den Inhalt der E-Mail anpassen, also m&uuml;ssen wir auf die <b>Body<\/b>-Eigenschaft zugreifen. Dieser f&uuml;gen wir vorn einen Beispieltext an, den Rest der E-Mail behalten wir bei. Wie es funktioniert, schauen wir uns weiter unten an.<\/p>\n<p><b>Benutzerdefinierte Bilder in die Ribbon-Steuerelemente einf&uuml;gen<\/b><\/p>\n<p>Interessant ist das Einf&uuml;gen benutzerdefinierter Bilder in das Ribbon beziehungsweise in die von uns hinzugef&uuml;gten Steuerelemente. Wir beginnen damit, dass wir die gew&uuml;nschten Bild-Dateien mit dem Datentyp <b>.png <\/b>als Ressource zum VB-Projekt hinzuf&uuml;gen. Dazu klicken Sie den Eintrag <b>Projekt|Testbausteine2010-Eigenschaften&#8230; <\/b>an (s. Bild 13).<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2015_03\/pic_986_010.png\" alt=\"Aufrufen der Projekt-Eigenschaften\" width=\"600\" height=\"428,5714\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 13: Aufrufen der Projekt-Eigenschaften<\/span><\/b><\/p>\n<p>Damit &ouml;ffnen Sie die Projekteigenschaften. Hier wechseln Sie zum Bereich <b>Ressourcen<\/b>. Dieser ist noch vollst&auml;ndig leer, was wir aber nun &auml;ndern: Ziehen Sie per Drag and Drop die <b>.png<\/b>-Dateien, die Sie im Ribbon anzeigen m&ouml;chten, in den leeren Bereich. Dieser sieht dann etwa wie in Bild 14 aus. Zus&auml;tzlich finden Sie die Ressourcen rechts im Projektmappen-Explorer im Verzeichnis <b>Ressourcen<\/b>. <\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2015_03\/pic_986_011.png\" alt=\"Die Ressourcen des Projekts\" width=\"700\" height=\"355,7003\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 14: Die Ressourcen des Projekts<\/span><\/b><\/p>\n<p>Nun m&uuml;ssen wir die Bilder noch im Ribbon anzeigen. Den ersten Schritt erledigen wir, indem wir dem <b>customUI<\/b>-Element das Attribut <b>loadImage<\/b> zuweisen, das auf die gleichnamige Callback-Funktion verweist:<\/p>\n<pre>&lt;customUI ... loadImage=\"loadImage\"&gt;<\/pre>\n<p>Diese Callback-Funktion legen Sie wie folgt im Klassenmodul <b>Ribbon_Mail.vb <\/b>an:<\/p>\n<pre><span style=\"color:blue;\">Public Function <\/span>LoadImage(imageId<span style=\"color:blue;\"> As String<\/span>)<span style=\"color:blue;\"> As <\/span>Bitmap\r\n     <span style=\"color:blue;\">Dim <\/span>objResourceManager<span style=\"color:blue;\"> As <\/span>Resources.ResourceManager\r\n     <span style=\"color:blue;\">Dim <\/span>objImage<span style=\"color:blue;\"> As <\/span>Image\r\n     objResourceManager = My.Resources.ResourceManager\r\n     objImage = objResourceManager.GetObject(imageId)\r\n     Return <span style=\"color:blue;\">New<\/span> Bitmap(objImage)\r\n<span style=\"color:blue;\">End Function<\/span><\/pre>\n<p>Au&szlig;erdem ben&ouml;tigen wir noch eine Anweisung, welche die Bibliothek <b>System.Drawing <\/b>verf&uuml;gbar macht:<\/p>\n<pre>Imports System.Drawing<\/pre>\n<p>Die Prozedur <b>LoadImage <\/b>wird nun, da Sie mit dem <b>loadImage<\/b>-Attribut des <b>customUI<\/b>-Elements angegeben wurde, f&uuml;r jedes Steuerelement mit dem Attribut <b>image <\/b>je einmal aufgerufen, wenn das Element sichtbar wird.<\/p>\n<p>Die Prozedur erwartet mit dem Wert <b>imageID <\/b>den Wert des Attributs <b>image <\/b>f&uuml;r das Steuer-element, f&uuml;r das sie aufgerufen wurde. Sie f&uuml;llt eine Variable namens <b>objResourceManager <\/b>mit einem Verweis auf das <b>ResourceManager<\/b>-Objekt des aktuellen Projekts. Dieses bietet mit der Funktion <b>GetObject <\/b>die M&ouml;glichkeit, das Ressourcen-Element mit dem als Parameter &uuml;bermittelten Namen zur&uuml;ckzugeben.<\/p>\n<p>Dies machen wir uns zunutze und weisen die Ressource der Variablen <b>objImage <\/b>zu. Dieses wird schlie&szlig;lich noch in ein Bitmap umgewandelt und als Ergebnis der Funktion zur&uuml;ckgegeben.<\/p>\n<p>Auf diese Weise landen die beiden Bilddateien an der richtigen Stelle im Ribbon (s. Bild 15).<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2015_03\/pic_986_012.png\" alt=\"Neues Ribbon-Element samt schicker Icons\" width=\"500\" height=\"276,0792\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 15: Neues Ribbon-Element samt schicker Icons<\/span><\/b><\/p>\n<p><b>Textbaustein per Mausklick<\/b><\/p>\n<p>Schauen wir uns nun an, wie das Einf&uuml;gen der provisorischen Textbausteine funktioniert. Starten Sie dazu den Debugger (Men&uuml;eintrag <b>Debuggen|Debugging starten<\/b>). Dies startet Outlook und zeigt, sofern Sie diese <b>MsgBox<\/b>-Anweisung noch nicht entfernt haben, die Meldung aus der Prozedur <b>ThisAddIn_Startup <\/b>an. Klicken Sie auf die Schaltfl&auml;che <b>Start|Neue E-Mail-Nachricht <\/b>im Ribbon von Outlook. Es erscheint eine neue, leere E-Mail (gegebenenfalls nat&uuml;rlich mit einer Signatur gef&uuml;llt). Dieser f&uuml;gen Sie nun mit einem Klick auf den Ribbon-Eintrag <b>Textbaustein ausw&auml;hlen|Textbaustein 2 <\/b>einen Textbaustein hinzu. Und es funktioniert, wie Bild 16 zeigt.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2015_03\/pic_986_013.png\" alt=\"Einf&uuml;gen eines Textbausteins per Ribbon-Befehl\" width=\"500\" height=\"319,1489\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 16: Einf&uuml;gen eines Textbausteins per Ribbon-Befehl<\/span><\/b><\/p>\n<p>Ob die Funktion die Textbausteine vor einen bestehenden Text setzt, also etwa vor eine Signatur oder den zitierten Text der E-Mail, auf die Sie antworten, pr&uuml;fen wir auch gleich, indem wir direkt noch einen der Eintr&auml;ge des Men&uuml;s aufrufen. Und auch dies gelingt.<\/p>\n<p>Nun kommt der Praxistest: Wir antworten auf eine beliebige Mail im Posteingang. Auch dies gelingt: Das <b>menu<\/b>-Element <b>Textbaustein ausw&auml;hlen <\/b>erscheint und der Text wird eingef&uuml;gt. Wenn die beantwortete Mail jedoch im HTML-Format vorliegt, gibt es ein Problem. Bevor wir den Textbaustein einf&uuml;gen, sieht die E-Mail wie in Bild 17 aus.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2015_03\/pic_986_014.png\" alt=\"E-Mail im HTML-Format vor dem Einf&uuml;gen eines Textbausteins ...\" width=\"588,06\" height=\"550,431\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 17: E-Mail im HTML-Format vor dem Einf&uuml;gen eines Textbausteins &#8230;<\/span><\/b><\/p>\n<p>Danach &auml;ndert sich das Aussehen jedoch radikal: Die Formatierungen und Bilder verschwinden, weil Outlook den Inhalt der Antwort in reinen Text umgewandelt hat (s. Bild 18). Wenn Sie die urspr&uuml;ngliche Mail des Kunden so verhunzen, brauchen Sie sich nicht zu wundern, wenn dieser etwas ungehalten reagiert &#8230;<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2015_03\/pic_986_015.png\" alt=\"... und nach dem Einf&uuml;gen.\" width=\"588,06\" height=\"550,431\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 18: &#8230; und nach dem Einf&uuml;gen.<\/span><\/b><\/p>\n<p>Also m&uuml;ssen wir wohl vor dem Einf&uuml;gen der Antwort pr&uuml;fen, ob es sich um eine HTML-E-Mail oder um Plain Text handelt, und entsprechend reagieren.<\/p>\n<p>Da wir dazu etwas mit den Eigenschaften des <b>MailItem<\/b>-Objekts experimentieren m&uuml;ssen, nutzen wir einmal die Debugging-Funktionen von Visual Studio und setzen dort vor dem n&auml;chsten Start einen Haltepunkt in der Prozedur <b>OnAction<\/b>. Wenn Sie nun den Debugger starten, in Outlook auf eine E-Mail im HTML-Format antworten und dann auf einen der Men&uuml;eintr&auml;ge zum Hinzuf&uuml;gen eines Textbausteins klicken, erhalten Sie etwa das Bild aus Bild 19.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2015_03\/pic_986_016.png\" alt=\"Debuggen beim Beantworten einer E-Mail\" width=\"588,06\" height=\"544,8995\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 19: Debuggen beim Beantworten einer E-Mail<\/span><\/b><\/p>\n<p>Hier schauen wir uns unten im Bereich <b>Lokal <\/b>(zu aktivieren mit <b>Strg+Alt+V, L <\/b>&euro;&#8220; also erst <b>Strg+Alt+V <\/b>und dann <b>L<\/b>) das Objekt <b>objMail <\/b>an und suchen die Eigenschaft, die Aufschluss &uuml;ber das verwendete Format gibt. Dabei handelt es sich um die Eigenschaft <b>BodyFormat<\/b>, das hier den Wert <b>2 <\/b>aufweist.<\/p>\n<p>Wenn Sie solche Werte wie im VBA-Editor per Direktfenster abfragen wollen, bet&auml;tigen Sie die Tastenkombination <b>Strg+Alt+I <\/b>und geben dort die gew&uuml;nschten Ausdr&uuml;cke ein &euro;&#8220; zum Beispiel diesen:<\/p>\n<pre>  objMail.BodyFormat<\/pre>\n<p>Interessant ist auch die Ermittlung des bei der Erstellung der Mail verwendeten E-Mail-Editors. Diesen ermitteln Sie mit der Eigenschaft <b>EditorType <\/b>des <b>Inspector<\/b>-Objekts (wie Sie diesen referenzieren, erl&auml;utern wir gleich):<\/p>\n<pre>  objInspector.EditorType<\/pre>\n<p>Bei einigen Experimenten stellte sich schnell heraus, dass dies immer den Wert <b>4 <\/b>(<b>olEditorWord<\/b>) zur&uuml;ckgibt. Es scheint also gar keine Rolle zu spielen, welchen Wert Sie in den Outlook-Optionen aus Bild 20 f&uuml;r das Nachrichtenformat eingestellt haben. In unserem Fall war als Format <b>Nur-Text <\/b>eingestellt. Beim Erstellen einer neuen Nachricht legen Sie zwar reine Textnachrichten an, aber dies geschieht dennoch im Word-Editor. Und wenn Sie auf eine Nachricht im HTML- oder Rich-Text-Format antworten, geschieht dies zwar im entsprechenden Format &euro;&#8220; den Word-Editor verwenden Sie aber dennoch.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2015_03\/pic_986_017.png\" alt=\"Einstellung des Formats beim Verfassen von E-Mails\" width=\"650\" height=\"229,8982\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 20: Einstellung des Formats beim Verfassen von E-Mails<\/span><\/b><\/p>\n<p>Dies machen wir uns zunutze: W&auml;hrend wir bei Antworten auf Nur-Text-Mails einfach die Antwort als Wert der Eigenschaft <b>objMail.Body <\/b>einf&uuml;gen k&ouml;nnen, ist das etwa f&uuml;r HTML-Nachrichten nicht so einfach m&ouml;glich. Dort enth&auml;lt die <b>HTMLBody<\/b>-Eigenschaft ja auch noch die ganzen HTML-Auszeichnungen. Wenn wir dort, wie oben geschehen, einfach einen Text vorn anf&uuml;gen, verwirft Outlook das jeweilige Format und zeigt alles im Nur-Text-Format an.<\/p>\n<p>Aber wenn wir schon den Word-Editor nutzen, k&ouml;nnen wir uns doch gleich das in den vorherigen Kapiteln erworbene Wissen &uuml;ber das Objektmodell von Word und den Zugriff auf die Inhalte eines Word-Dokuments zunutze machen!<\/p>\n<p>Also f&uuml;gen wir zun&auml;chst einen Verweis auf die Word-Bibliothek zum Projekt hinzu. Dazu w&auml;hlen Sie den Men&uuml;eintrag <b>Projekt|Verweis hinzuf&uuml;gen&#8230; <\/b>aus. Hier wechseln Sie zum Bereich <b>COM <\/b>und geben dann rechts oben den Suchbegriff <b>Word <\/b>ein. Damit ist die Menge der Suchergebnisse so weit eingeschr&auml;nkt, dass wir den Eintrag <b>Microsoft Word 14.0 Object Library <\/b>leicht finden und hinzuf&uuml;gen k&ouml;nnen.<\/p>\n<p>Mit der Word-Bibliothek f&uuml;gt Visual Studio gegebenenfalls auch gleich die Office-Bibliothek mit hinzu (beim ersten Erstellen der Beispiele war dies der Fall, beim zweiten Versuch nicht mehr). Dies f&uuml;hrt allerdings zu einigen Fehlermeldungen, wie Bild 21 zeigt.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2015_03\/pic_986_212.png\" alt=\"Die automatisch hinzugef&uuml;gte Office-Bibliothek sorgt f&uuml;r Fehlermeldungen.\" width=\"645\" height=\"528,856\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 21: Die automatisch hinzugef&uuml;gte Office-Bibliothek sorgt f&uuml;r Fehlermeldungen.<\/span><\/b><\/p>\n<p>Also entfernen Sie den Verweis auf die Bibliothek <b>Microsoft Office x.0 Object Library <\/b>gleich wieder. Dies k&ouml;nnen Sie gleich in der &uuml;bersicht der Verweise erledigen, indem Sie den zu entfernenden Eintrag markieren und dann auf <b>Entfernen <\/b>klicken. Im gleichen Zuge sollten auch die Fehlermeldungen wieder verschwinden.<\/p>\n<p>Nun k&ouml;nnen wir etwa &uuml;ber den Ausdruck <b>Microsoft.Office.Interop.Word.Document <\/b>auf ein <b>Document<\/b>-Objekt zugreifen. Dies verk&uuml;rzen wir etwas, indem wir der Klasse oben die folgende Anweisung hinzuf&uuml;gen:<\/p>\n<pre>Imports Word = Microsoft.Office.Interop.Word<\/pre>\n<p>Damit k&ouml;nnen wir nun vereinfacht etwa &uuml;ber <b>Word.Document <\/b>auf ein <b>Document<\/b>-Objekt zugreifen. Und damit schlagen wir gleich mehrere Fliegen mit einer Klappe: Dies gelingt n&auml;mlich auch mit reinen Textnachrichten. Also brauchen wir gar nicht erst eine Fallunterscheidung nach Editor und\/oder Nachrichtenformat zu integrieren, sondern greifen direkt auf die Nachricht &uuml;ber den Word-Editor zu. Die neue Version der Prozedur <b>onAction<\/b> haben wir drastisch gek&uuml;rzt:<\/p>\n<pre>    Sub OnAction(control<span style=\"color:blue;\"> As <\/span>Office.IRibbonControl)\r\n         TextbausteinEinfuegen(control.Id)\r\n     End Sub<\/pre>\n<p>Sie ruft nur noch die folgende Prozedur aus Listing 4 auf und &uuml;bergibt den Namen des Ribbon-Steuerelements.<\/p>\n<pre><span style=\"color:blue;\">Sub <\/span>TextbausteinEinfuegen(strEintrag<span style=\"color:blue;\"> As String<\/span>)\r\n     <span style=\"color:blue;\">Dim <\/span>objInspector<span style=\"color:blue;\"> As <\/span>Outlook.Inspector\r\n     <span style=\"color:blue;\">Dim <\/span>objDocument<span style=\"color:blue;\"> As <\/span>Word.Document\r\n     <span style=\"color:blue;\">Dim <\/span>objSelection<span style=\"color:blue;\"> As <\/span>Word.Selection\r\n     <span style=\"color:blue;\">Dim <\/span>strTextbaustein<span style=\"color:blue;\"> As String<\/span> = \"\"\r\n     Select Case strEintrag\r\n         <span style=\"color:blue;\">Case <\/span>\"btnTextbaustein1\"\r\n             strTextbaustein = \"Dies ist der Textbaustein mit der Nummer 1.\"\r\n         <span style=\"color:blue;\">Case <\/span>\"btnTextbaustein2\"\r\n             strTextbaustein = \"Dies ist der Textbaustein mit der Nummer 2.\"\r\n         <span style=\"color:blue;\">Case <\/span>\"btnTextbaustein3\"\r\n             strTextbaustein = \"Dies ist der Textbaustein mit der Nummer 3.\"\r\n         <span style=\"color:blue;\">Case <\/span>\"btnTextbaustein4\"\r\n             strTextbaustein = \"Dies ist der Textbaustein mit der Nummer 4.\"\r\n     <span style=\"color:blue;\">End Select<\/span>\r\n     objInspector = Globals.ThisAddIn.Application.ActiveInspector()\r\n     objDocument = objInspector.WordEditor\r\n     objSelection = objDocument.Application.Selection\r\n     objSelection.InsertBefore(strTextbaustein)\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 4: Neue Prozedur zum Einf&uuml;gen des Textbausteins<\/span><\/b><\/p>\n<p>Die Prozedur ermittelt wieder per <b>Select Case<\/b>-Bedingung den einzusetzenden Textbaustein. Dann ermittelt sie einen Verweis auf das aktuelle <b>Inspector<\/b>-Fenster und referenziert das darin angezeigte Word-Dokument &uuml;ber die <b>WordEditor<\/b>-Eigenschaft.<\/p>\n<p>Schlie&szlig;lich f&uuml;gt sie den Textbaustein aus <b>strTextbaustein<\/b> vorn in der Nachricht ein. Wie Bild 22 zeigt, funktioniert dies reibungslos.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2015_03\/pic_986_019.png\" alt=\"Erfolgreiches Einf&uuml;gen eines einfachen Textes in eine Antwort auf eine HTML-E-Mail\" width=\"500\" height=\"468,006\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 22: Erfolgreiches Einf&uuml;gen eines einfachen Textes in eine Antwort auf eine HTML-E-Mail<\/span><\/b><\/p>\n<p><b>Kontextmen&uuml; per Ribbon-Definition &auml;ndern<\/b><\/p>\n<p>Nun wollen wir aber nicht das Ribbon, sondern das Kontextmen&uuml; dieses Elements &auml;ndern &euro;&#8220; und zwar jenes, das beim Klick mit der rechten Maustaste in den Mailtext angezeigt wird.<\/p>\n<p>Wird beim Anzeigen eines Kontextmen&uuml;s auch immer das Ereignis <b>GetCustomUI <\/b>ausgel&ouml;st Ein kurzer Test belegt, dass dies nicht der Fall ist. Wir m&uuml;ssen das Kontextmen&uuml; also wohl schon beim &Atilde;\u0192-ffnen des Mail-Fensters definieren, was aber auch kein Problem ist.<\/p>\n<p>Wir wissen nur noch nicht, welche Elemente zur Umgestaltung des Kontextmen&uuml;s n&ouml;tig sind. Das ist auch nicht so einfach zu ermitteln, denn die <b>idMso<\/b>-Werte f&uuml;r die Kontextmen&uuml;s finden sich nicht in den Excel-Tabellen, die alle anderen Ribbon-Elemente auflisten.<\/p>\n<p>Also haben wir etwas im Internet gest&ouml;bert und haben schlie&szlig;lich herausgefunden, dass die <b>idMso <\/b>f&uuml;r das Kontextmen&uuml; des Fensters zum Bearbeiten von Mails <b>ContextMenuText <\/b>hei&szlig;t. Damit l&auml;sst sich unsere Ribbon-Definition wie in Listing 5 erweitern.<\/p>\n<pre>&lt;xml version=\"1.0\" encoding=\"UTF-8\"&gt;\r\n   &lt;customUI xmlns=\"http:\/\/schemas.microsoft.com\/office\/2009\/07\/customui\" onLoad=\"Ribbon_Load\" loadImage=\"loadImage\"&gt;\r\n     &lt;ribbon&gt;\r\n       ...\r\n     &lt;\/ribbon&gt;\r\n     &lt;contextMenus&gt;\r\n         &lt;contextMenu idMso=\"ContextMenuText\"&gt;\r\n             &lt;menu image=\"text_16\" label=\"Textbausteine\" id=\"ctxmnuTextbausteine\"&gt;\r\n                 &lt;button label=\"Textbaustein 1\" id=\"ctxbtnTextbaustein1\" \r\n                     onAction=\"onAction\" image=\"text_16_add\"\/&gt;\r\n                 &lt;button label=\"Textbaustein 2\" id=\"ctxbtnTextbaustein2\" \r\n                     onAction=\"onAction\" image=\"text_16_add\"\/&gt;\r\n                 &lt;button label=\"Textbaustein 3\" id=\"ctxbtnTextbaustein3\" \r\n                     onAction=\"onAction\" image=\"text_16_add\"\/&gt;\r\n                 &lt;button label=\"Textbaustein 4\" id=\"ctxbtnTextbaustein4\" \r\n                     onAction=\"onAction\" image=\"text_16_add\"\/&gt;\r\n              &lt;\/menu&gt;\r\n         &lt;\/contextMenu&gt;\r\n     &lt;\/contextMenus&gt;\r\n&lt;\/customUI&gt;<\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 5: Ribbon-Definition mit Kontextmen&uuml;<\/span><\/b><\/p>\n<p>Die Ribbon-Definition kann verschiedene Kontextmen&uuml;s aufnehmen, daher finden Sie hier noch ein Element namens <b>contextMenus <\/b>vor. Dieses enth&auml;lt f&uuml;r jedes Kontextmen&uuml; ein <b>contextMenu<\/b>-Element. Darunter haben wir ein <b>menu<\/b>-Element angelegt, da es ja durchaus einmal mehrere Eintr&auml;ge f&uuml;r die einzelnen Textbausteine werden k&ouml;nnen. Darunter folgenden dann die eigentlichen Eintr&auml;ge in Form von <b>button<\/b>-Elementen. Wir haben also grunds&auml;tzlich den gleichen Aufbau wie im Ribbon. Der Unterschied ist, dass wir die Eigenschaft <b>id <\/b>der Elemente jeweils um das Pr&auml;fix <b>ctx <\/b>(f&uuml;r <b>ContextMenu<\/b>) erg&auml;nzt haben.<\/p>\n<p>Deshalb brauchten wir auch die Prozedur <b>TextbausteinEinfuegen<\/b>, welche die Textbausteine entsprechend der &uuml;bergebenen Steuerelement-ID einf&uuml;gt, nur um je einen Parameter in den <b>Case<\/b>-Zweigen der <b>Select Case<\/b>-Bedingung zu erweitern:<\/p>\n<pre>    Sub TextbausteinEinfuegen(strEintrag<span style=\"color:blue;\"> As String<\/span>)\r\n         ...\r\n         Select Case strEintrag\r\n             <span style=\"color:blue;\">Case <\/span>\"btnTextbaustein1\", \"ctxbtnTextbaustein1\"\r\n                 strTextbaustein = _\r\n                 \"Dies ist der Textbaustein mit der Nummer 1.\"\r\n             ...\r\n         <span style=\"color:blue;\">End Select<\/span>\r\n         ...\r\n     End Sub<\/pre>\n<p>Das Kontextmen&uuml; sieht nun wie in Bild 23 aus.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2015_03\/pic_986_020.png\" alt=\"Einf&uuml;gen eines Textbausteins per Kontextmen&uuml;\" width=\"422,5\" height=\"527,0055\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 23: Einf&uuml;gen eines Textbausteins per Kontextmen&uuml;<\/span><\/b><\/p>\n<p><b>Kundennamen und Textbausteine aus der Datenbank einlesen<\/b><\/p>\n<p>Nun wird es Zeit, die Textbausteine dynamisch aus der Kundendatenbank einzulesen und beim Einf&uuml;gen eines Textbausteins eventuelle Platzhalter wie <b>[Vorname] <\/b>oder <b>[Nachname] <\/b>durch die Kundendaten aus der Datenbank zu ersetzen &euro;&#8220; und dies alles aufgrund der E-Mail-Adresse des Absenders der E-Mail.<\/p>\n<p>Beginnen wir mit der Datenbank. Diese soll drei Tabellen enthalten:<\/p>\n<ul>\n<li><b>tblKunden<\/b>: Enth&auml;lt die Kundendaten mit dem Prim&auml;rschl&uuml;sselfeld <b>KundeID <\/b>und den Feldern <b>AnredeID<\/b>, <b>Vorname<\/b>, <b>Nachname <\/b>und <b>EMail<\/b>.<\/li>\n<li><b>tblAnreden<\/b>: Enth&auml;lt die Anreden mit dem Prim&auml;rschl&uuml;sselfeld <b>AnredeID <\/b>und dem Feld <b>An-re-de<\/b>, aber auch noch eine weitere Anredefloskel wie etwa <b>Sehr geehrter Herr<\/b>.<\/li>\n<li><b>tblTextbausteine<\/b>: Enth&auml;lt die Textbausteine. Das Prim&auml;rschl&uuml;sselfeld hei&szlig;t <b>TextbausteinID<\/b>, die Bezeichnung landet im Feld <b>Bezeichnung <\/b>und der eigentliche Textbaustein im Feld <b>Inhalt<\/b>.<\/li>\n<\/ul>\n<p><b>Aufbau der Tabellen<\/b><\/p>\n<p>Bild 24 zeigt die beiden Tabellen <b>tblKunden <\/b>und <b>tblAnreden <\/b>mit ein paar Beispiel-da-ten-s&auml;tzen.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2015_03\/pic_986_021.png\" alt=\"Die beiden Tabellen mit den Kundendaten\" width=\"500\" height=\"188,7186\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 24: Die beiden Tabellen mit den Kundendaten<\/span><\/b><\/p>\n<p>Die Tabelle mit den Textbausteinen sieht etwa so wie in Bild 25 aus. Das Feld <b>Textbaustein <\/b>enth&auml;lt in diesem Fall komplette E-Mail-Texte. Sie k&ouml;nnen nat&uuml;rlich auch einzelne Abs&auml;tze in den Datens&auml;tzen der Tabelle speichern.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2015_03\/pic_986_022.png\" alt=\"Tabelle mit Textbausteinen\" width=\"500\" height=\"340,1254\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 25: Tabelle mit Textbausteinen<\/span><\/b><\/p>\n<p><b>Datenzugriff vorbereiten<\/b><\/p>\n<p>Der Datenzugriff erfolgt nicht, wie f&uuml;r einen Access-Entwickler gewohnt, &uuml;ber die Elemente der DAO-Bibliothek, sondern &uuml;ber die entsprechenden Elemente von Visual Basic. In diesem Fall ben&ouml;tigen wir die folgende Bibliothek, die wir per <b>Imports<\/b>-Anweisung einfach verf&uuml;gbar machen:<\/p>\n<pre>Imports System.Data.OleDb<\/pre>\n<p><b>Zusammenstellen der Ribbon- und Kontextmen&uuml;-Eintr&auml;ge aus der Datenbank<\/b><\/p>\n<p>Nachdem wir bisher eine XML-Datei genutzt haben, die als Element des Projekts in einem eigenen Element namens <b>Ribbon_Mail.xml<\/b> gespeichert war, wollen wir die Ribbon-Definition nun dynamisch zusammenstellen. Das hei&szlig;t, dass wir zwar einen groben statischen Kern haben, aber auch ein paar Elemente, die wir aufgrund der Daten in der Tabelle <b>tblTextbausteine <\/b>in der Datenbank <b>Textbausteine.accdb <\/b>angelegt haben.<\/p>\n<p>Deshalb bohren wir die Prozedur <b>GetCustomUI<\/b> nun komplett auf. Da diese etwas umfangreicher ist, haben wir einige Markierungen im Quellcode untergebracht, auf die wir in den folgenden Abschnitten verweisen. Die Prozedur wird wie zuvor aufgerufen und deklariert dann einige Variablen (s. Listing 6).<\/p>\n<pre><span style=\"color:blue;\">Public Function <\/span>GetCustomUI(ByVal ribbonID<span style=\"color:blue;\"> As String<\/span>)<span style=\"color:blue;\"> As String<\/span> Implements Office.IRibbonExtensibility.GetCustomUI\r\n     <span style=\"color:blue;\">Dim <\/span>strRibbon<span style=\"color:blue;\"> As String<\/span> = \"\", strConnection<span style=\"color:blue;\"> As String<\/span> = \"\"\r\n     <span style=\"color:blue;\">Dim <\/span>objConnection<span style=\"color:blue;\"> As <\/span>OleDbConnection, objDataReader<span style=\"color:blue;\"> As <\/span>OleDbDataReader, objOleDbCommand<span style=\"color:blue;\"> As <\/span>OleDbCommand\r\n     <span style=\"color:blue;\">Dim <\/span>strSQL<span style=\"color:blue;\"> As String<\/span> = \"\", strButtons<span style=\"color:blue;\"> As String<\/span> = \"\", strContextbuttons<span style=\"color:blue;\"> As String<\/span> = \"\"\r\n     Select Case ribbonID\r\n    Case \"Microsoft.Outlook.Mail.Compose\"\r\n         strConnection = \"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=&lt;Datenbankpfad&gt;\\Kundendatenbank.accdb\"\r\n         objConnection = <span style=\"color:blue;\">New<\/span> OleDbConnection\r\n             objConnection.ConnectionString = strConnection\r\n             objConnection.Open()\r\n         strSQL = \"SELECT * FROM tblTextbausteine\"\r\n             objOleDbCommand = <span style=\"color:blue;\">New<\/span> OleDbCommand(strSQL, objConnection)\r\n             objDataReader = objOleDbCommand.ExecuteReader\r\n         While objDataReader.Read()\r\n             strButtons = strButtons & \"                        &lt;button label=\"\"\" & objDataReader(\"Bezeichnung\") _\r\n                     & \"\"\" id=\"\"btnTextbaustein\" & objDataReader(\"TextbausteinID\") & \"\"\" onAction=\"\"onAction\"\" \" _\r\n                     & \"image=\"\"text_16_add\"\" tag=\"\"\" & objDataReader(\"TextbausteinID\") & \"\"\"\/&gt;\"\r\n             strContextbuttons = strContextbuttons & \"                        &lt;button label=\"\"\" _\r\n                     & objDataReader(\"Bezeichnung\") & \"\"\" id=\"\"ctxbtnTextbaustein\" & objDataReader(\"TextbausteinID\") _\r\n                     & \"\"\" onAction=\"\"onAction\"\" image=\"\"text_16_add\"\" tag=\"\"\" _\r\n                     & objDataReader(\"TextbausteinID\") & \"\"\"\/&gt;\"\r\n             End While\r\n         strRibbon = \"&lt;xml version=\"\"1.0\"\" encoding=\"\"UTF-8\"\"&gt;\"\r\n             strRibbon = strRibbon & \"&lt;customUI xmlns=\"\"http:\/\/schemas.microsoft.com\/office\/2009\/07\/customui\"\"\" _\r\n                 & \" onLoad=\"\"Ribbon_Load\"\" loadImage=\"\"loadImage\"\"&gt;\"\r\n             strRibbon = strRibbon & \"    &lt;ribbon&gt;\"\r\n             strRibbon = strRibbon & \"        &lt;tabs&gt;\"\r\n             strRibbon = strRibbon & \"            &lt;tab idMso=\"\"TabInsert\"\"&gt;\"\r\n             strRibbon = strRibbon & \"                &lt;group id=\"\"grpEinfuegen\"\" \" _\r\n                 & \"label=\"\"Textbausteine\"\" insertAfterMso=\"\"GroupInclude\"\"&gt;\"\r\n             strRibbon = strRibbon & \"                    &lt;menu label=\"\"Textbaustein \" _\r\n                 & \"ausw&auml;hlen\"\" id=\"\"mnuTextbausteine\"\" size=\"\"large\"\" image=\"\"text_32\"\"&gt;\"\r\n             strRibbon = strRibbon & strButtons\r\n             strRibbon = strRibbon & \"                    &lt;\/menu&gt;\"\r\n             strRibbon = strRibbon & \"                &lt;\/group&gt;\"\r\n             strRibbon = strRibbon & \"            &lt;\/tab&gt;\"\r\n             strRibbon = strRibbon & \"        &lt;\/tabs&gt;\"\r\n             strRibbon = strRibbon & \"    &lt;\/ribbon&gt;\"\r\n             strRibbon = strRibbon & \"    &lt;contextMenus&gt;\"\r\n             strRibbon = strRibbon & \"        &lt;contextMenu idMso=\"\"ContextMenuText\"\"&gt;\"\r\n             strRibbon = strRibbon & \"            &lt;menu image=\"\"text_16\"\" \" _\r\n                 & \"label=\"\"Textbausteine\"\" id=\"\"ctxmnuTextbausteine\"\"&gt;\"\r\n             strRibbon = strRibbon & strContextbuttons\r\n             strRibbon = strRibbon & \"             &lt;\/menu&gt;\"\r\n             strRibbon = strRibbon & \"        &lt;\/contextMenu&gt;\"\r\n             strRibbon = strRibbon & \"    &lt;\/contextMenus&gt;\"\r\n             strRibbon = strRibbon & \"&lt;\/customUI&gt;\"\r\n         Return strRibbon\r\n         <span style=\"color:blue;\">Case Else<\/span>\r\n             Return \"\"\r\n     <span style=\"color:blue;\">End Select<\/span>\r\n<span style=\"color:blue;\">End Function<\/span><\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 6: Neue Funktion zum Anzeigen der Ribbon-Men&uuml;s<\/span><\/b><\/p>\n<p>Gleich zu Beginn pr&uuml;ft die Prozedur, welches Fenster gerade &uuml;berhaupt ge&ouml;ffnet ist. Der erste Case-Zweig der Select Case-Bedingung wird nur angesteuert, wenn es sich um das Fenster zum Erstellen einer neuen Mail handelt [1].<\/p>\n<p>Die Variable <b>strConnection <\/b>legt dann die Verbindungszeichenfolge fest, in diesem Fall f&uuml;r die Datenbank, die am angegebenen Speicherort untergebracht ist. Den Platzhalter <b><Dateipfad><br \/>\n<\/b> m&uuml;ssen Sie durch Ihren eigenen Pfad ersetzen. Man k&ouml;nnte diesen auch dynamisch gestalten, wenn etwa sichergestellt w&auml;re, dass die Datenbank immer in einem bestimmten Verzeichnis liegt &euro;&#8220; etwa im Verzeichnis der DLL mit dem COM-Add-In oder im Verzeichnis von Outlook. Gegebenenfalls f&uuml;gen wir auch noch die M&ouml;glichkeit hinzu, dass der Benutzer diese per Back-stage-Eintrag einstellen kann [2].<\/p>\n<p>Dann folgen einige Elemente, die f&uuml;r Access-Entwickler neu sein d&uuml;rften: Dem <b>OleDbConnection<\/b>-Objekt namens <b>objConnection <\/b>weisen Sie die Verbindungszeichenfolge zu und &ouml;ffnen die Verbindung dann mit der <b>Open<\/b>-Methode [3].<\/p>\n<p>Dann stellen wir die SQL-Abfrage f&uuml;r die Textbausteine zusammen. Damit f&uuml;ttern wir ein frisch angelegtes <b>Ole-DbCommand<\/b>-Objekt, das au&szlig;erdem die Connection aus <b>objConnection <\/b>erwartet. Dieses Objekt bietet die <b>ExecuteReader<\/b>-Funktion an, die ein Objekt des Typs <b>DateReader <\/b>zur&uuml;ckliefert. Dies ist eine Art Recordset, das mit dem Parameter <b>dbOpenForwardOnly <\/b>ge&ouml;ffnet wird [4].<\/p>\n<p>Das <b>DataReader<\/b>-Objekt enth&auml;lt genau wie ein Recordset Datens&auml;tze. Den ersten und danach jeden folgenden Datensatz liest die <b>Read<\/b>-Methode ein. Danach k&ouml;nnen wir auf die Inhalte der Felder des Datensatzes zugreifen, und zwar durch die einfache Angabe des Feldnamens in Klammern &euro;&#8220; also etwa <b>objDataReader(&#8222;Bezeichnung&#8220;)<\/b>. Die <b>Read<\/b>-Methode liefert den Wert <b>True <\/b>zur&uuml;ck, sodass wir in einer <b>While<\/b>-Schleife so lange den soeben eingelesenen Datensatz der Tabelle <b>tblTextbausteine <\/b>verarbeiten, bis <b>Read <\/b>keinen Datensatz mehr findet und somit den Wert <b>False <\/b>zur&uuml;ckliefert und die Schleife beendet [5].<\/p>\n<p>Innerhalb dieser Schleife erledigen wir zwei Dinge. Erstens stellen wir eine Zeichenkette mit allen <b>button<\/b>-Elementen f&uuml;r das Ribbon an, wobei das Attribut <b>label <\/b>mit dem Wert des Feldes <b>Bezeichnung <\/b>gef&uuml;llt wird, das Attribut <b>id <\/b>mit dem Text <b>btnTextbaustein <\/b>und dem Wert des Pri-m&auml;r-schl&uuml;sselfelds sowie das Attribut <b>tag <\/b>mit dem Prim&auml;rschl&uuml;sselfeld allein.<\/p>\n<p>Das Ergebnis lautet dann etwa <b>&lt;button label=&#8220;AiU-Login gesucht&#8220; id=&#8220;btnTextbaustein1&#8243; onAction=&#8220;onAction&#8220; image=&#8220;text_16_add&#8220; tag=&#8220;1&#8243;\/&gt;<\/b>. Die passende Anweisung liefert [6].<\/p>\n<p>Wichtig ist hier, dass wir auch das Attribut <b>tag <\/b>f&uuml;llen, und zwar mit dem Prim&auml;rschl&uuml;sselwert des  aktuellen Datensatzes der Tabelle <b>tblTextbausteine<\/b>. Diesen ben&ouml;tigen wir sp&auml;ter, wenn der Benutzer diesen Eintrag anklickt und der richtige Textbaustein aus der Datenbank eingelesen werden soll. Auf &auml;hnliche Weise f&uuml;gen wir der Variablen <b>strContextbuttons <\/b>mit jedem Schleifendurchlauf ein <b>button<\/b>-Element hinzu [7].<\/p>\n<p>Nach dem Beenden der Schleife stellt die Prozedur den Rahmen des XML-Dokuments zusammen und f&uuml;gt an den entsprechenden Stellen die Inhalte der beiden Variablen <b>strButtons <\/b>und <b>strContextButtons <\/b>ein [8].<\/p>\n<p>Schlie&szlig;lich gibt die Funktion die Definition des Ribbons an die aufrufende Instanz zur&uuml;ck [9].<\/p>\n<p>Damit ist der erste Teil bereits erledigt. Das Mail-Inspector-Fenster zeigt im Ribbon nun bereits die auf Basis der Tabelle <b>tblTextbausteine <\/b>erstellten Eintr&auml;ge an (s. Bild 26).<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2015_03\/pic_986_023.png\" alt=\"Dynamische Men&uuml;erstellung im Ribbon\" width=\"422,5\" height=\"244,3152\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 26: Dynamische Men&uuml;erstellung im Ribbon<\/span><\/b><\/p>\n<p>Auch das Kontextmen&uuml; zeigt nun bereits die Eintr&auml;ge aus <b>tblTextbausteine <\/b>an (s. Bild 27).<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2015_03\/pic_986_024.png\" alt=\"Dynamische Eintr&auml;ge im Kontextmen&uuml;\" width=\"300\" height=\"368,1818\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 27: Dynamische Eintr&auml;ge im Kontextmen&uuml;<\/span><\/b><\/p>\n<p>Grunds&auml;tzlich k&ouml;nnten wir statt des <b>menu<\/b>-Elements auch noch das <b>dynamicMenu<\/b>-Element einsetzen. Auf diese Weise w&uuml;rden die Men&uuml;-Eintr&auml;ge erst beim Anzeigen des Men&uuml;s aus der Datenbank eingelesen. Dies ist jedoch hier nicht unbedingt n&ouml;tig.<\/p>\n<p><b>Einf&uuml;gen der Textbausteine<\/b><\/p>\n<p>Die Callback-Prozedur <b>OnAction <\/b>strukturieren wir auch ein wenig um. Dies bezieht sich vor allem darauf, dass wir der Prozedur <b>TextbausteinEinfuegen<\/b>, die wir auch noch &auml;ndern, nicht mehr den in der Eigenschaft <b>id <\/b>gespeicherten Namen des <b>control<\/b>-Elements &uuml;bergeben, sondern den in der <b>tag<\/b>-Eigenschaft gespeicherten Wert.<\/p>\n<p>Dort haben wir ja weiter oben den Prim&auml;rschl&uuml;sselwert aus der Tabelle <b>tblTextbausteine <\/b>festgelegt:<\/p>\n<pre><span style=\"color:blue;\">Sub <\/span>OnAction(control<span style=\"color:blue;\"> As <\/span>Office.IRibbonControl)\r\n     TextbausteinEinfuegen(control.Tag)\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p>Damit kommen wir zur Prozedur <b>TextbausteineEinfue-gen<\/b> (s. Listing 7). Diese nimmt, wie bereits erw&auml;hnt, den Prim&auml;rschl&uuml;sselwert f&uuml;r den zum gew&auml;hlten Eintrag geh&ouml;renden Textbaustein entgegen. Danach folgen einige Deklarationsanweisungen.<\/p>\n<pre><span style=\"color:blue;\">Sub <\/span>TextbausteinEinfuegen(lngTextbausteinID<span style=\"color:blue;\"> As Long<\/span>)\r\n     <span style=\"color:blue;\">Dim <\/span>objInspector<span style=\"color:blue;\"> As <\/span>Outlook.Inspector\r\n     <span style=\"color:blue;\">Dim <\/span>objDocument<span style=\"color:blue;\"> As <\/span>Word.Document\r\n     <span style=\"color:blue;\">Dim <\/span>objSelection<span style=\"color:blue;\"> As <\/span>Word.Selection\r\n     <span style=\"color:blue;\">Dim <\/span>strTextbaustein<span style=\"color:blue;\"> As String<\/span> = \"\"\r\n     <span style=\"color:blue;\">Dim <\/span>strRibbon<span style=\"color:blue;\"> As String<\/span> = \"\"\r\n     <span style=\"color:blue;\">Dim <\/span>strConnection<span style=\"color:blue;\"> As String<\/span> = \"\"\r\n     <span style=\"color:blue;\">Dim <\/span>objConnection<span style=\"color:blue;\"> As <\/span>OleDbConnection\r\n     <span style=\"color:blue;\">Dim <\/span>objDataReader<span style=\"color:blue;\"> As <\/span>OleDbDataReader\r\n     <span style=\"color:blue;\">Dim <\/span>objOleDbCommand<span style=\"color:blue;\"> As <\/span>OleDbCommand\r\n     <span style=\"color:blue;\">Dim <\/span>strSQLKunde<span style=\"color:blue;\"> As String<\/span> = \"\"\r\n     <span style=\"color:blue;\">Dim <\/span>objMail<span style=\"color:blue;\"> As <\/span>Outlook.MailItem\r\n     <span style=\"color:blue;\">Dim <\/span>strButtons<span style=\"color:blue;\"> As String<\/span> = \"\"\r\n     <span style=\"color:blue;\">Dim <\/span>strContextbuttons<span style=\"color:blue;\"> As String<\/span> = \"\"\r\n     <span style=\"color:blue;\">Dim <\/span>strEMail<span style=\"color:blue;\"> As String<\/span> = \"\"\r\n     <span style=\"color:blue;\">Dim <\/span>i<span style=\"color:blue;\"> As Integer<\/span>\r\n strTextbaustein = TextbausteinHolen(lngTextbausteinID)\r\n strConnection = \"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=c:\\Textbausteine\\Kundendatenbank.accdb\"\r\n objConnection = <span style=\"color:blue;\">New<\/span> OleDbConnection\r\n     objConnection.ConnectionString = strConnection\r\n     objConnection.Open()\r\n objInspector = Globals.ThisAddIn.Application.ActiveInspector()\r\n     objMail = objInspector.CurrentItem\r\n If objMail.Recipients.Count &gt; 0 Then\r\n         strEMail = objMail.Recipients(1).Address\r\n     strSQLKunde = \"SELECT t1.Vorname, t1.Nachname, t2.Anrede, t2.AnspracheHoeflich, t2.AnspracheLieb \" _\r\n             & \"FROM tblKunden AS t1 INNER JOIN tblAnreden AS t2 ON t1.AnredeID = t2.AnredeID WHERE EMail = ''''\" _\r\n             & strEMail & \"''''\"\r\n     objOleDbCommand = <span style=\"color:blue;\">New<\/span> OleDbCommand(strSQLKunde, objConnection)\r\n         objDataReader = objOleDbCommand.ExecuteReader\r\n     If objDataReader.Read() Then\r\n             For i = 0 To objDataReader.FieldCount - 1\r\n                 strTextbaustein = <span style=\"color:blue;\">Replace<\/span>(strTextbaustein, \"[\" _\r\n                     & objDataReader.GetName(i) & \"]\", objDataReader.GetValue(i))\r\n             <span style=\"color:blue;\">Next<\/span>\r\n         <span style=\"color:blue;\">Else<\/span>\r\n             <span style=\"color:blue;\">MsgBox<\/span>(\"Kunde mit der E-Mail-Adresse ''''\" & strEMail & \"'''' nicht gefunden.\")\r\n         <span style=\"color:blue;\">End If<\/span>\r\n     <span style=\"color:blue;\">Else<\/span>\r\n         <span style=\"color:blue;\">MsgBox<\/span>(\"Kein Empf&auml;nger eingegeben, daher eventuelle Platzhalter nicht ersetzt.\")\r\n     <span style=\"color:blue;\">End If<\/span>\r\n objDocument = objInspector.WordEditor\r\n     objSelection = objDocument.Application.Selection\r\n     objSelection.InsertBefore(strTextbaustein)\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 7: Einf&uuml;gen eines Textbausteins aus der Datenbank<\/span><\/b><\/p>\n<p>Direkt zu Beginn ruft die Prozedur eine weitere Funktion namens <b>TextbausteinHolen <\/b>auf. Diese soll den Textbaustein zu dem in <b>lngTextbausteinID <\/b>enthaltenen Prim&auml;rschl&uuml;sselwert ermitteln (siehe weiter unten) .<\/p>\n<p>Danach baut die Prozedur wieder eine Verbindung zur Datenbank <b>Textbausteine.accdb <\/b>auf .<\/p>\n<p>Die Datei erstellt wieder eine Connection und &ouml;ffnet diese .<\/p>\n<p>Nun holt sie sich Verweise auf das Mail-Fenster und das angezeigte <b>MailItem<\/b>-Objekt und speichert beide in entsprechenden Variablen .<\/p>\n<p>Aus <b>objMail <\/b>ermittelt sie dann zun&auml;chst die Anzahl der Empf&auml;ngeradressen. Ist keine vorhanden, fallen die folgenden Anweisungen, mit denen die Platzhalter in den Textbausteinen ersetzt werden sollen, unter den Tisch und die Prozedur f&auml;hrt hinter der <b>If&#8230;Then<\/b>-Bedingung fort. Ist mindestens ein E-Mail-Empf&auml;nger vorhanden, liest sie die E-Mail-Adresse des ersten Empf&auml;ngers aus .<\/p>\n<p>Damit stellt die Prozedur nun die Abfrage zusammen, die den Kundendatensatz zu dieser E-Mail-Adresse samt Anrede-Daten ermittelt .<\/p>\n<p>Damit erzeugt sie nun das <b>DataReader<\/b>-Objekt mit den gefundenen Daten .<\/p>\n<p>Danach folgt das Ersetzen der Platzhalter im Textbaustein, sofern vorhanden. Die Platzhalter m&uuml;ssen genau nach folgendem Schema aufgebaut sein: <b>[<Feldname>]<\/b>, wobei <b><Feldname> <\/b>durch eines der Felder des DataReaders ersetzt werden muss (hier also <b>Vorname<\/b>, <b>Nachname<\/b>, <b>Anrede <\/b>oder <b>AnredeHoeflich<\/b>). Die <b>If&#8230;Then<\/b>-Bedingung pr&uuml;ft, ob <b>objDataReader <\/b>&uuml;berhaupt einen Datensatz liefert. Die <b>Read<\/b>-Methode gibt n&auml;mlich den Wert <b>False <\/b>zur&uuml;ck, wenn kein Datensatz (mehr) gefunden werden konnte. Konnte kein Datensatz gefunden werden, erscheint eine Meldung, dass die Platzhalter, sofern vorhanden, nicht ersetzt werden konnten.<\/p>\n<p>Die <b>For&#8230;Next<\/b>-Schleife ermittelt dann die Anzahl der Fel-der von <b>obj-Data-Reader <\/b>und durchl&auml;uft diese. Innerhalb der Schleife verwendet die Prozedur die <b>Replace<\/b>-Funktion, um die Platzhalter der in <b>strTextbaustein <\/b>enthaltenen Zeichenkette durch den tats&auml;chlich ermittelten Wert zu ersetzen. Dabei holt Sie den Namen des aktuellen Feldes mit der <b>GetName<\/b>-Funktion und den Wert mit <b>GetValue<\/b> .<\/p>\n<p>Schlie&szlig;lich ermittelt die Prozedur einen Verweis auf das aktuelle Dokument und f&uuml;gt den aktuellen Inhalt der Variablen <b>strTextbaustein <\/b>an der entsprechenden Stelle ein .<\/p>\n<p><b>Textbaustein aus der Datenbank einlesen<\/b><\/p>\n<p>Die weiter oben erw&auml;hnte und zu Beginn der Prozedur <b>TextbausteinEinfuegen <\/b>aufgerufene Funktion <b>TextbausteinHolen <\/b>ermittelt den Textbaustein zu dem mit <b>lngTextbausteinID <\/b>&uuml;bermittelten Prim&auml;rschl&uuml;sselwert aus der Tabelle <b>tblTextbausteine<\/b> (s. Listing 8).<\/p>\n<pre><span style=\"color:blue;\">Private Function <\/span>TextbausteinHolen(lngTextbausteinID<span style=\"color:blue;\"> As Long<\/span>)<span style=\"color:blue;\"> As String<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>strConnection<span style=\"color:blue;\"> As String<\/span> = \"\"\r\n     <span style=\"color:blue;\">Dim <\/span>objConnection<span style=\"color:blue;\"> As <\/span>OleDbConnection\r\n     <span style=\"color:blue;\">Dim <\/span>objDataReader<span style=\"color:blue;\"> As <\/span>OleDbDataReader\r\n     <span style=\"color:blue;\">Dim <\/span>objOleDbCommand<span style=\"color:blue;\"> As <\/span>OleDbCommand\r\n     <span style=\"color:blue;\">Dim <\/span>strSQLTextbausteine<span style=\"color:blue;\"> As String<\/span> = \"\"\r\n     <span style=\"color:blue;\">Dim <\/span>strTextbaustein<span style=\"color:blue;\"> As String<\/span> = \"\"\r\n  strSQLTextbausteine = \"SELECT Inhalt FROM tblTextbausteine WHERE TextbausteinID = \" _\r\n         & lngTextbausteinID\r\n strConnection = \"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=c:\\Textbausteine\\Kundendatenbank.accdb\"\r\n     objConnection = <span style=\"color:blue;\">New<\/span> OleDbConnection\r\n     objConnection.ConnectionString = strConnection\r\n     objConnection.Open()\r\n     objOleDbCommand = <span style=\"color:blue;\">New<\/span> OleDbCommand(strSQLTextbausteine, objConnection)\r\n     objDataReader = objOleDbCommand.ExecuteReader\r\n objDataReader.Read()\r\n     strTextbaustein = objDataReader(\"Inhalt\").ToString\r\n     Return strTextbaustein\r\n<span style=\"color:blue;\">End Function<\/span><\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 8: Einlesen des Textbausteins aus der Tabelle tblTextbausteine<\/span><\/b><\/p>\n<p>Die erste Anweisung nach dem Deklarationsbereich erstellt die zu verwendende SQL-Abfrage. Diese soll den Wert des Feldes <b>Inhalt <\/b>des Datensatzes liefern, dessen Prim&auml;rschl&uuml;sselfeld den Wert aus <b>lngTextbaustein <\/b>enth&auml;lt .<\/p>\n<p>Nach dem Zusammenstellen der Verbindungszeichenfolge erstellt die Funktion einen <b>DataReader <\/b>und f&uuml;llt diesen mit den gefundenen Daten .<\/p>\n<p>Den zu erwartenden Datensatz liest die Prozedur dann mit der <b>Read<\/b>-Methode ein und liefert mit <b>objDataReader(&#8222;Inhalt&#8220;).ToString <\/b>den Wert des Feldes <b>Inhalt<\/b>. Dieser wird dann als Funktionsergebnis an die aufrufende Datei zur&uuml;ckgegeben .<\/p>\n<p><b>Zusammenfassung und Ausblick<\/b><\/p>\n<p>Ein kleines Problem haben wir noch: Wenn Sie den Speicherort der Datenbank einmal &auml;ndern, liefert das COM-Add-In beim Versuch, auf diese zuzugreifen, eine Fehlermeldung. Dummerweise kann der Benutzer den Pfad der Datenbank in der aktuellen Version des Add-Ins noch nicht einmal &auml;ndern. Darum werden wir uns in einem sp&auml;teren Beitrag in Access im Unternehmen k&uuml;mmern.<\/p>\n<p>Davon abgesehen haben Sie in diesem Beitrag eine Menge gelernt: Wir haben dem Mail-Fenster von Outlook eine Ribbon-Gruppe hinzuf&uuml;gt sowie Eintr&auml;ge zum Kontextmen&uuml;, die dynamisch aus der Datenbank gef&uuml;llt werden.<\/p>\n<p>Au&szlig;erdem haben Sie am Beispiel des Einlesens von Textbausteinen erfahren, wie Sie von einem COM-Add-In auf Basis von Visual Basic 2013 Daten aus einer Access-Datenbank einlesen.<\/p>\n<p>In weiteren Beitr&auml;gen werden wir weitere M&ouml;glichkeiten f&uuml;r COM-Add-Ins mit konkreten Beispielen vorstellen.<\/p>\n<p><b>Links<\/b><\/p>\n<p> Office 2010 Help Files: Office Fluent User Interface Control Identifiers : <b>http:\/\/www.microsoft.com\/en-us\/download\/details.aspxid=6627<\/b><\/p>\n<p> Office 2013 Help Files: Office Fluent User Interface Control Identifiers: <b>http:\/\/www.microsoft.com\/en-us\/download\/details.aspxid=36798<\/b><\/p>\n<p> Multifunktionsseiten-XML: <b>http:\/\/msdn.microsoft.com\/de-de\/library\/aa942866.aspx<\/b><\/p>\n<p> Using Custom Images in Ribbon UI Solutions: <b>http:\/\/xldennis.wordpress.com\/2009\/03\/02\/using-custom-images-in-ribbon-ui-solutions\/<\/b><\/p>\n<h3>Downloads zu diesem Beitrag<\/h3>\n<p>Enthaltene Beispieldateien:<\/p>\n<p>Textbausteine2013.zip<\/p>\n<p><a href=\"..\/fileadmin\/beispiele\/{53CC0F44-7F48-4472-8032-85926222F4F8}\/aiu_986.zip\">Download<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>W&auml;re es nicht toll, wenn Sie eine Kundenanfrage, die keine individuelle Antwort erfordert, per Textbaustein beantworten k&ouml;nnten, der dennoch etwas Individualit&auml;t aufweist Dazu w&uuml;rde es ja beispielsweise reichen, wenn Sie den Kunden ordentlich anreden, beispielsweise mit &#8222;Sehr geehrter Herr M&uuml;ller&#8220;. Das Ganze sollte dann auch noch mit m&ouml;glichst wenig Handgriffen geschehen, also beispielsweise &uuml;ber einen Klick auf einen Ribbon-Eintrag der zu beantwortenden Mail oder einen Kontextmen&uuml;-Eintrag. Wie dies gelingt und wie Sie Ihre Kundendatenbank einbeziehen, um Anrede und Name zur E-Mail-Adresse des Absenders zu ermitteln, zeigt dieser Beitrag.<\/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":[662015,66032015,44000027],"tags":[],"class_list":["post-55000986","post","type-post","status-publish","format-standard","hentry","category-662015","category-66032015","category-Loesungen"],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v20.9 (Yoast SEO v27.4) - https:\/\/yoast.com\/product\/yoast-seo-premium-wordpress\/ -->\n<title>Outlook-Textbausteine mit Access - Access im Unternehmen<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/access-im-unternehmen.de\/OutlookTextbausteine_mit_Access\/\" \/>\n<meta property=\"og:locale\" content=\"de_DE\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Outlook-Textbausteine mit Access\" \/>\n<meta property=\"og:description\" content=\"W&auml;re es nicht toll, wenn Sie eine Kundenanfrage, die keine individuelle Antwort erfordert, per Textbaustein beantworten k&ouml;nnten, der dennoch etwas Individualit&auml;t aufweist Dazu w&uuml;rde es ja beispielsweise reichen, wenn Sie den Kunden ordentlich anreden, beispielsweise mit &quot;Sehr geehrter Herr M&uuml;ller&quot;. Das Ganze sollte dann auch noch mit m&ouml;glichst wenig Handgriffen geschehen, also beispielsweise &uuml;ber einen Klick auf einen Ribbon-Eintrag der zu beantwortenden Mail oder einen Kontextmen&uuml;-Eintrag. Wie dies gelingt und wie Sie Ihre Kundendatenbank einbeziehen, um Anrede und Name zur E-Mail-Adresse des Absenders zu ermitteln, zeigt dieser Beitrag.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/access-im-unternehmen.de\/OutlookTextbausteine_mit_Access\/\" \/>\n<meta property=\"og:site_name\" content=\"Access im Unternehmen\" \/>\n<meta property=\"article:published_time\" content=\"2020-05-22T21:01:01+00:00\" \/>\n<meta property=\"og:image\" content=\"http:\/\/vg07.met.vgwort.de\/na\/0bec3594d75c48aab43a6feebc9f94f5\" \/>\n<meta name=\"author\" content=\"Andr\u00e9 Minhorst\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Verfasst von\" \/>\n\t<meta name=\"twitter:data1\" content=\"Andr\u00e9 Minhorst\" \/>\n\t<meta name=\"twitter:label2\" content=\"Gesch\u00e4tzte Lesezeit\" \/>\n\t<meta name=\"twitter:data2\" content=\"38\u00a0Minuten\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/OutlookTextbausteine_mit_Access\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/OutlookTextbausteine_mit_Access\\\/\"},\"author\":{\"name\":\"Andr\u00e9 Minhorst\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#\\\/schema\\\/person\\\/13395c4bcd7d7963efe33be9c584d93f\"},\"headline\":\"Outlook-Textbausteine mit Access\",\"datePublished\":\"2020-05-22T21:01:01+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/OutlookTextbausteine_mit_Access\\\/\"},\"wordCount\":6356,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#organization\"},\"image\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/OutlookTextbausteine_mit_Access\\\/#primaryimage\"},\"thumbnailUrl\":\"http:\\\/\\\/vg07.met.vgwort.de\\\/na\\\/0bec3594d75c48aab43a6feebc9f94f5\",\"articleSection\":[\"2015\",\"3\\\/2015\",\"L\u00f6sungen\"],\"inLanguage\":\"de\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/access-im-unternehmen.de\\\/OutlookTextbausteine_mit_Access\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/OutlookTextbausteine_mit_Access\\\/\",\"url\":\"https:\\\/\\\/access-im-unternehmen.de\\\/OutlookTextbausteine_mit_Access\\\/\",\"name\":\"Outlook-Textbausteine mit Access - Access im Unternehmen\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/OutlookTextbausteine_mit_Access\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/OutlookTextbausteine_mit_Access\\\/#primaryimage\"},\"thumbnailUrl\":\"http:\\\/\\\/vg07.met.vgwort.de\\\/na\\\/0bec3594d75c48aab43a6feebc9f94f5\",\"datePublished\":\"2020-05-22T21:01:01+00:00\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/OutlookTextbausteine_mit_Access\\\/#breadcrumb\"},\"inLanguage\":\"de\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/access-im-unternehmen.de\\\/OutlookTextbausteine_mit_Access\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"de\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/OutlookTextbausteine_mit_Access\\\/#primaryimage\",\"url\":\"http:\\\/\\\/vg07.met.vgwort.de\\\/na\\\/0bec3594d75c48aab43a6feebc9f94f5\",\"contentUrl\":\"http:\\\/\\\/vg07.met.vgwort.de\\\/na\\\/0bec3594d75c48aab43a6feebc9f94f5\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/OutlookTextbausteine_mit_Access\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/access-im-unternehmen.de\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Outlook-Textbausteine mit Access\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#website\",\"url\":\"https:\\\/\\\/access-im-unternehmen.de\\\/\",\"name\":\"Access im Unternehmen\",\"description\":\"Das Magazin f\u00fcr Datenbankentwickler auf Basis von Microsoft Access\",\"publisher\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/access-im-unternehmen.de\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"de\"},{\"@type\":\"Organization\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#organization\",\"name\":\"Andr\u00e9 Minhorst Verlag\",\"url\":\"https:\\\/\\\/access-im-unternehmen.de\\\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"de\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#\\\/schema\\\/logo\\\/image\\\/\",\"url\":\"https:\\\/\\\/access-im-unternehmen.de\\\/wp-content\\\/uploads\\\/2019\\\/09\\\/aiu_wp.png\",\"contentUrl\":\"https:\\\/\\\/access-im-unternehmen.de\\\/wp-content\\\/uploads\\\/2019\\\/09\\\/aiu_wp.png\",\"width\":370,\"height\":111,\"caption\":\"Andr\u00e9 Minhorst Verlag\"},\"image\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#\\\/schema\\\/logo\\\/image\\\/\"}},{\"@type\":\"Person\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#\\\/schema\\\/person\\\/13395c4bcd7d7963efe33be9c584d93f\",\"name\":\"Andr\u00e9 Minhorst\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"de\",\"@id\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/1b9d010cf1716692cb9c34f21554e07d17d461acaea5b61b8cb21cbec678d48a?s=96&d=mm&r=g\",\"url\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/1b9d010cf1716692cb9c34f21554e07d17d461acaea5b61b8cb21cbec678d48a?s=96&d=mm&r=g\",\"contentUrl\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/1b9d010cf1716692cb9c34f21554e07d17d461acaea5b61b8cb21cbec678d48a?s=96&d=mm&r=g\",\"caption\":\"Andr\u00e9 Minhorst\"}}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Outlook-Textbausteine mit Access - Access im Unternehmen","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/access-im-unternehmen.de\/OutlookTextbausteine_mit_Access\/","og_locale":"de_DE","og_type":"article","og_title":"Outlook-Textbausteine mit Access","og_description":"W&auml;re es nicht toll, wenn Sie eine Kundenanfrage, die keine individuelle Antwort erfordert, per Textbaustein beantworten k&ouml;nnten, der dennoch etwas Individualit&auml;t aufweist Dazu w&uuml;rde es ja beispielsweise reichen, wenn Sie den Kunden ordentlich anreden, beispielsweise mit \"Sehr geehrter Herr M&uuml;ller\". Das Ganze sollte dann auch noch mit m&ouml;glichst wenig Handgriffen geschehen, also beispielsweise &uuml;ber einen Klick auf einen Ribbon-Eintrag der zu beantwortenden Mail oder einen Kontextmen&uuml;-Eintrag. Wie dies gelingt und wie Sie Ihre Kundendatenbank einbeziehen, um Anrede und Name zur E-Mail-Adresse des Absenders zu ermitteln, zeigt dieser Beitrag.","og_url":"https:\/\/access-im-unternehmen.de\/OutlookTextbausteine_mit_Access\/","og_site_name":"Access im Unternehmen","article_published_time":"2020-05-22T21:01:01+00:00","og_image":[{"url":"http:\/\/vg07.met.vgwort.de\/na\/0bec3594d75c48aab43a6feebc9f94f5","type":"","width":"","height":""}],"author":"Andr\u00e9 Minhorst","twitter_card":"summary_large_image","twitter_misc":{"Verfasst von":"Andr\u00e9 Minhorst","Gesch\u00e4tzte Lesezeit":"38\u00a0Minuten"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/access-im-unternehmen.de\/OutlookTextbausteine_mit_Access\/#article","isPartOf":{"@id":"https:\/\/access-im-unternehmen.de\/OutlookTextbausteine_mit_Access\/"},"author":{"name":"Andr\u00e9 Minhorst","@id":"https:\/\/access-im-unternehmen.de\/#\/schema\/person\/13395c4bcd7d7963efe33be9c584d93f"},"headline":"Outlook-Textbausteine mit Access","datePublished":"2020-05-22T21:01:01+00:00","mainEntityOfPage":{"@id":"https:\/\/access-im-unternehmen.de\/OutlookTextbausteine_mit_Access\/"},"wordCount":6356,"commentCount":0,"publisher":{"@id":"https:\/\/access-im-unternehmen.de\/#organization"},"image":{"@id":"https:\/\/access-im-unternehmen.de\/OutlookTextbausteine_mit_Access\/#primaryimage"},"thumbnailUrl":"http:\/\/vg07.met.vgwort.de\/na\/0bec3594d75c48aab43a6feebc9f94f5","articleSection":["2015","3\/2015","L\u00f6sungen"],"inLanguage":"de","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/access-im-unternehmen.de\/OutlookTextbausteine_mit_Access\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/access-im-unternehmen.de\/OutlookTextbausteine_mit_Access\/","url":"https:\/\/access-im-unternehmen.de\/OutlookTextbausteine_mit_Access\/","name":"Outlook-Textbausteine mit Access - Access im Unternehmen","isPartOf":{"@id":"https:\/\/access-im-unternehmen.de\/#website"},"primaryImageOfPage":{"@id":"https:\/\/access-im-unternehmen.de\/OutlookTextbausteine_mit_Access\/#primaryimage"},"image":{"@id":"https:\/\/access-im-unternehmen.de\/OutlookTextbausteine_mit_Access\/#primaryimage"},"thumbnailUrl":"http:\/\/vg07.met.vgwort.de\/na\/0bec3594d75c48aab43a6feebc9f94f5","datePublished":"2020-05-22T21:01:01+00:00","breadcrumb":{"@id":"https:\/\/access-im-unternehmen.de\/OutlookTextbausteine_mit_Access\/#breadcrumb"},"inLanguage":"de","potentialAction":[{"@type":"ReadAction","target":["https:\/\/access-im-unternehmen.de\/OutlookTextbausteine_mit_Access\/"]}]},{"@type":"ImageObject","inLanguage":"de","@id":"https:\/\/access-im-unternehmen.de\/OutlookTextbausteine_mit_Access\/#primaryimage","url":"http:\/\/vg07.met.vgwort.de\/na\/0bec3594d75c48aab43a6feebc9f94f5","contentUrl":"http:\/\/vg07.met.vgwort.de\/na\/0bec3594d75c48aab43a6feebc9f94f5"},{"@type":"BreadcrumbList","@id":"https:\/\/access-im-unternehmen.de\/OutlookTextbausteine_mit_Access\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/access-im-unternehmen.de\/"},{"@type":"ListItem","position":2,"name":"Outlook-Textbausteine mit Access"}]},{"@type":"WebSite","@id":"https:\/\/access-im-unternehmen.de\/#website","url":"https:\/\/access-im-unternehmen.de\/","name":"Access im Unternehmen","description":"Das Magazin f\u00fcr Datenbankentwickler auf Basis von Microsoft Access","publisher":{"@id":"https:\/\/access-im-unternehmen.de\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/access-im-unternehmen.de\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"de"},{"@type":"Organization","@id":"https:\/\/access-im-unternehmen.de\/#organization","name":"Andr\u00e9 Minhorst Verlag","url":"https:\/\/access-im-unternehmen.de\/","logo":{"@type":"ImageObject","inLanguage":"de","@id":"https:\/\/access-im-unternehmen.de\/#\/schema\/logo\/image\/","url":"https:\/\/access-im-unternehmen.de\/wp-content\/uploads\/2019\/09\/aiu_wp.png","contentUrl":"https:\/\/access-im-unternehmen.de\/wp-content\/uploads\/2019\/09\/aiu_wp.png","width":370,"height":111,"caption":"Andr\u00e9 Minhorst Verlag"},"image":{"@id":"https:\/\/access-im-unternehmen.de\/#\/schema\/logo\/image\/"}},{"@type":"Person","@id":"https:\/\/access-im-unternehmen.de\/#\/schema\/person\/13395c4bcd7d7963efe33be9c584d93f","name":"Andr\u00e9 Minhorst","image":{"@type":"ImageObject","inLanguage":"de","@id":"https:\/\/secure.gravatar.com\/avatar\/1b9d010cf1716692cb9c34f21554e07d17d461acaea5b61b8cb21cbec678d48a?s=96&d=mm&r=g","url":"https:\/\/secure.gravatar.com\/avatar\/1b9d010cf1716692cb9c34f21554e07d17d461acaea5b61b8cb21cbec678d48a?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/1b9d010cf1716692cb9c34f21554e07d17d461acaea5b61b8cb21cbec678d48a?s=96&d=mm&r=g","caption":"Andr\u00e9 Minhorst"}}]}},"_links":{"self":[{"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/posts\/55000986","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/comments?post=55000986"}],"version-history":[{"count":0,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/posts\/55000986\/revisions"}],"wp:attachment":[{"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/media?parent=55000986"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/categories?post=55000986"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/tags?post=55000986"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}