{"id":55001177,"date":"2019-02-01T00:00:00","date_gmt":"2020-05-13T21:06:00","guid":{"rendered":"http:\/\/access-im-unternehmen.aix-dev.de\/aiu\/?p=1177"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-30T00:00:00","slug":"Menues_fuer_das_COMAddIn_fuer_den_VBAEditor_","status":"publish","type":"post","link":"https:\/\/access-im-unternehmen.de\/Menues_fuer_das_COMAddIn_fuer_den_VBAEditor_\/","title":{"rendered":"Men&uuml;s f&uuml;r das COM-Add-In f&uuml;r den VBA-Editor"},"content":{"rendered":"<p><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/vg06.met.vgwort.de\/na\/94980585493a435aa3a7db68dd5e2af9\" width=\"1\" height=\"1\" alt=\"\"><\/p>\n<p><b>Im Beitrag &#8222;COM-Add-In f&uuml;r den VBA-Editor&#8220; haben wir uns zun&auml;chst darum gek&uuml;mmert, &uuml;berhaupt eine COM-DLL zu programmieren und diese so in die Registry einzutragen, dass sie beim Starten des VBA-Editors geladen wird und die dort angelegten Ereignisprozeduren ausgel&ouml;st wurden. Damit sind wir noch lange nicht fertig. Im vorliegenden Artikel schauen wir uns an, wie Sie dem VBA-Editor Men&uuml;eintr&auml;ge f&uuml;r den Aufruf der im COM-Add-In enthaltenen Funktionen hinzuf&uuml;gen &#8211; und zwar f&uuml;r die Men&uuml;leiste, die Symbolleiste sowie f&uuml;r Kontextmen&uuml;s.<\/b><\/p>\n<h2>Vorbereitung<\/h2>\n<p>Als Vorbereitung f&uuml;r die Beispiele dieses Artikels f&uuml;hren Sie die Schritte aus dem Artikel <b>COM-Add-In f&uuml;r den VBA-Editor <\/b>oder verwenden das dort enthaltene Beispielprojekt als Ausgangspunkt. Wir haben das Projekt einfach neu erstellt, und zwar unter dem Namen <b>COMAddInMenues<\/b>, und eine neue Registrierungsdatei namens <b>COMAddInMenues.reg <\/b>und eine neue GUID erzeugt, die wir an den entsprechenden Stellen eingef&uuml;gt haben (also in der <b>.reg<\/b>-Datei und &uuml;ber der <b>Connect<\/b>-Klasse). Achten Sie auch darauf, den Namen <b>COMAddInMenues<\/b> an den entsprechenden Stellen der <b>.reg<\/b>-Datei einzuf&uuml;gen. Die Datei sieht f&uuml;r das neue Add-In wie in Listing 1 aus.<\/p>\n<pre>Windows Registry Editor Version 5.00\r\n[HKEY_CURRENT_USER\\Software\\Microsoft\\VBA\\VBE\\6.0\\Addins\\COMAddInMenues.Connect]\r\n\"CommandLineSafe\"=dword:00000000\r\n\"Description\"=\"Grundger&uuml;st f&uuml;r ein COM-Add-In f&uuml;r den VBA-Editor\"\r\n\"LoadBehavior\"=dword:00000003\r\n\"FriendlyName\"=\"COMAddInMenues\"\r\n[HKEY_CLASSES_ROOT\\WOW6432Node\\CLSID\\{ABA0B519-CB8C-4A03-9815-D99DFE3312C9}]\r\n@=\"COMAddInMenues.Connect\"\r\n[HKEY_CLASSES_ROOT\\WOW6432Node\\CLSID\\{ABA0B519-CB8C-4A03-9815-D99DFE3312C9}\\Implemented Categories]\r\n[HKEY_CLASSES_ROOT\\WOW6432Node\\CLSID\\{ABA0B519-CB8C-4A03-9815-D99DFE3312C9}\\InprocServer32]\r\n@=\"mscoree.dll\"\r\n\"ThreadingModel\"=\"Both\"\r\n\"Class\"=\"COMAddInMenues.Connect\"\r\n\"Assembly\"=\"COMAddInMenues\"\r\n\"RuntimeVersion\"=\"v2.0.50727\"\r\n\"CodeBase\"=\"file:\/\/\/C:\\...\\COMAddInMenues.dll\"\r\n[HKEY_CLASSES_ROOT\\WOW6432Node\\CLSID\\{ABA0B519-CB8C-4A03-9815-D99DFE3312C9}\\ProgId]\r\n@=\"COMAddInMenues.Connect\"<\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 1: Inhalt der Datei f&uuml;r die Registry<\/span><\/b><\/p>\n<p>Das Ladeverhalten stellen wir gleich auf den Wert <b>3 <\/b>ein, damit das Add-In beim Starten des VBA-Editors aufgerufen wird und wir das Ladeverhalten nicht erst noch im Add-In-Manager anpassen m&uuml;ssen.<\/p>\n<p>Die &uuml;brigen Schritte wie das Hinzuf&uuml;gen der Verweise und die ben&ouml;tigten Einstellungen haben wir im Artikel <b>COM-Add-In f&uuml;r den VBA-Editor <\/b>beschrieben.<\/p>\n<p>Denken Sie vor dem Erstellen des Projekts immer daran, Visual Studio im Administrator-Modus zu &ouml;ffnen, da das COM-Add-In sonst nicht erstellt werden kann.<\/p>\n<h2>Zugriff auf die eingebauten Men&uuml;s<\/h2>\n<p>Bevor wir eigene Men&uuml;punkte anlegen k&ouml;nnen, wollen wir uns zun&auml;chst ansehen, wie wir &uuml;berhaupt auf die Men&uuml;s des VBA-Editors zugreifen k&ouml;nnen.<\/p>\n<p>Die Men&uuml;s und die f&uuml;r den Zugriff ben&ouml;tigten Objekte wie die <b>CommandBars<\/b>-Auflistung und das <b>CommandBar<\/b>-Objekt sowie deren untergeordnete Elemente und Eigenschaften sind Bestandteil der Office-Bibliothek. Diese f&uuml;gen Sie &uuml;ber den Verweis-Manager hinzu, indem Sie nach dem Schl&uuml;sselwort <b>Office <\/b>suchen und dann den Eintrag aus Bild 1 ausw&auml;hlen.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2019_01\/pic_1177_001.png\" alt=\"Hinzuf&uuml;gen eines Verweises auf die Office-Bibliothek\" width=\"649,559\" height=\"331,3907\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 1: Hinzuf&uuml;gen eines Verweises auf die Office-Bibliothek<\/span><\/b><\/p>\n<p>Au&szlig;erdem importieren wir den passenden Namespace in die Klasse <b>Connect.vb<\/b>:<\/p>\n<pre>Imports Microsoft.Office.Core<\/pre>\n<p>Die Befehle, die sich beim Start des COM-Add-Ins mit den Men&uuml;eintr&auml;gen befassen, wollen wir gleich in eine eigene Prozedur auslagen. Diese rufen wir gleich beim Start des COM-Add-Ins in der Methode <b>OnConnection <\/b>auf:<\/p>\n<pre><span style=\"color:blue;\">Public Sub <\/span>OnConnection(Application<span style=\"color:blue;\"> As Object<\/span>, _\r\n         ConnectMode<span style=\"color:blue;\"> As <\/span>ext_ConnectMode, _\r\n         AddInInst<span style=\"color:blue;\"> As Object<\/span>, _\r\n         ByRef custom<span style=\"color:blue;\"> As <\/span>Array) _\r\n         Implements IDTExtensibility2.OnConnection\r\n     _VBE = DirectCast(Application, VBE)\r\n     _AddIn = DirectCast(AddInInst, AddIn)\r\n     Select Case ConnectMode\r\n         <span style=\"color:blue;\">Case <\/span>Extensibility.ext_ConnectMode.ext_cm_Startup\r\n             CommandBarsAusgeben()\r\n     <span style=\"color:blue;\">End Select<\/span>\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p>Als Erstes wollen wir einfach die Auflistung der <b>CommandBar<\/b>-Elemente durchlaufen und diese in Meldungsfenstern ausgeben. Dazu f&uuml;llen wir die Prozedur <b>CommandBarsAusgeben <\/b>wie folgt:<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>CommandBarsAusgeben()\r\n     <span style=\"color:blue;\">Dim <\/span>cbrs<span style=\"color:blue;\"> As <\/span>CommandBars\r\n     <span style=\"color:blue;\">Dim <\/span>cbr<span style=\"color:blue;\"> As <\/span>CommandBar\r\n     cbrs = _VBE.CommandBars\r\n     For Each cbr In cbrs\r\n         MessageBox.Show(cbr.Name)\r\n     <span style=\"color:blue;\">Next<\/span>\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p>Diese Prozedur verwendet die bereits beim Laden des COM-Add-Ins mit einem Verweis auf das Objekt <b>VBE <\/b>gef&uuml;llte Member-Variablen <b>_VBE<\/b>. <b>VBE <\/b>steht stellvertretend f&uuml;r das Objektmodell des VBA-Editors.<\/p>\n<p>Diese stellt unter anderem die Auflistung <b>CommandBars <\/b>bereit, die alle <b>CommandBar<\/b>-Elemente des VBA-Editors enth&auml;lt. Die Variable <b>cbrs <\/b>mit dem Typ <b>CommandBars <\/b>f&uuml;llen wir mit einem Verweis auf die <b>CommandBars<\/b>-Auflistung des <b>VBE<\/b>-Objekts. In einer <b>For Each<\/b>-Schleife durchlaufen wir dann alle Elemente dieser Auflistung und geben den Namen des aktuellen Elements in einer Meldung aus.<\/p>\n<h2>Debuggen des Add-Ins<\/h2>\n<p>Das ist allerdings nicht wirklich komfortabel &#8211; immerhin gibt es einige Men&uuml;s in der Auflistung <b>CommandBars<\/b>. Wir wollen diese lieber in Visual Studio ausgeben, statt f&uuml;r jedes Men&uuml; ein neues Meldungsfenster zu &ouml;ffnen. Wenn wir in Visual Studio den Men&uuml;eintrag <b>Debuggen|Debugging starten&#8230; <\/b>w&auml;hlen, f&uuml;hrt dies allerdings zur Meldung aus Bild 2.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2019_01\/pic_1177_002.png\" alt=\"Fehlermeldung beim Versuch, das Projekt zu debuggen\" width=\"424,7115\" height=\"219,1055\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 2: Fehlermeldung beim Versuch, das Projekt zu debuggen<\/span><\/b><\/p>\n<p>Um dies zu &auml;ndern, m&uuml;ssen wir in den Eigenschaften des Projekts eine Anwendung festlegen, die zusammen mit dem Add-In gestartet wird. Das Add-In selbst ist n&auml;mlich keine ausf&uuml;hrbare Datei. Wir wollen das Add-In mit dem VBA-Editor unter Access testen, also legen wir Access als Startanwendung fest.<\/p>\n<p>Dazu &ouml;ffnen Sie die Eigenschaften des Projekts und wechseln dort zum Bereich <b>Debuggen<\/b>. Hier w&auml;hlen Sie unter <b>Projekt starten <\/b>die Option <b>Externes Programm starten <\/b>aus und w&auml;hlen &uuml;ber den mit der Schaltfl&auml;che <b>Durchsuchen&#8230; <\/b>zu &ouml;ffnenden Dialog die Datei <b>MSAccess.Exe <\/b>aus (siehe Bild 3).<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2019_01\/pic_1177_003.png\" alt=\"Startanwendung festlegen\" width=\"649,559\" height=\"377,953\"\/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 3: Startanwendung festlegen<\/span><\/b><\/p>\n<p>Danach k&ouml;nnen Sie mit dem Men&uuml;befehl <b>Debuggen|Debugging starten <\/b>das Debuggen beginnen. Visual Studio startet dann Microsoft Access und wird, wenn Sie den VBA-Editor von Access aus aufrufen, die f&uuml;r das Laden des Add-Ins bestimmten Ereignisse ausl&ouml;sen. Sie k&ouml;nnen nun also beispielsweise Haltepunkte im Code platzieren und den Code so schrittweise durchlaufen. Beenden Sie das Debugging von Visual Studio aus, wird die gestartete Instanz von Visual Studio ebenfalls beendet.<\/p>\n<p>Gegebenenfalls sto&szlig;en Sie dabei auf eine Fehlermeldung, dass die DLL nicht erzeugt werden konnte. Dies kann der Fall sein, wenn Sie bereits zuvor den VBA-Editor f&uuml;r eine Anwendung ge&ouml;ffnet haben und diese die bestehende DLL referenziert hat. Visual Studio kann diese dann nicht neu erstellen.<\/p>\n<p>Wenn wir den Befehl in der Schleife wie folgt &auml;ndern, erhalten wir die Liste aller Men&uuml;s des VBA-Editors wie in Bild 4:<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2019_01\/pic_1177_004.png\" alt=\"Ausgabe der Men&uuml;s des VBA-Editors\" width=\"424,7115\" height=\"925,069\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 4: Ausgabe der Men&uuml;s des VBA-Editors<\/span><\/b><\/p>\n<pre>For Each cbr In cbrs\r\n     <span style=\"color:blue;\">Debug.Print<\/span>(cbr.Name)\r\n<span style=\"color:blue;\">Next<\/span><\/pre>\n<p>Nun erweitern wir die Schleife so, dass auch noch die Steuer-elemente eines jeden Men&uuml;s ausgeben werden. Dazu deklarieren wir eine Variable f&uuml;r die Steuer-elemente mit dem Typ <b>CommandBarControl<\/b>:<\/p>\n<pre><span style=\"color:blue;\">Dim <\/span>cbc<span style=\"color:blue;\"> As <\/span>CommandBarControl<\/pre>\n<p>In der Schleife f&uuml;gen wir eine weitere Schleife &uuml;ber alle Elemente der <b>Controls<\/b>-Auflistung hinzu und geben die enthaltenen Elemente ebenfalls im Direktbereich von Visual Studio aus:<\/p>\n<pre>For Each cbr In cbrs\r\n     <span style=\"color:blue;\">Debug.Print<\/span>(cbr.Name)\r\n     For Each cbc In cbr.Controls\r\n         <span style=\"color:blue;\">Debug.Print<\/span>(\"  \" + cbc.Caption)\r\n     <span style=\"color:blue;\">Next<\/span>\r\n<span style=\"color:blue;\">Next<\/span><\/pre>\n<p>F&uuml;r den Eintrag <b>Men&uuml;leiste <\/b>sieht das Ergebnis etwa wie folgt aus:<\/p>\n<pre>Men&uuml;leiste\r\n   &Datei\r\n   &Bearbeiten\r\n   ...\r\n   Add-&Ins\r\n   &Fenster\r\n   &<\/pre>\n<p>Genau genommen handelt es sich hierbei gar nicht um Schaltfl&auml;chen, sondern um Untermen&uuml;s, die wiederum Control-Elemente enthalten &#8211; hier finden sich dann die eigentlichen Befehle.<\/p>\n<p>Eine weitere Schleife wollen wir nun nicht mehr unterbringen, das System sollte nun verst&auml;ndlich sein.<\/p>\n<h2>Men&uuml; hinzuf&uuml;gen oder nur Steuerelemente<\/h2>\n<p>Wir k&ouml;nnen nun eigenen Men&uuml;s hinzuf&uuml;gen, bestehenden Men&uuml;s neue Untermen&uuml;s zuweisen oder auch bestehenden und neuen Men&uuml;s neue Steuer-elemente zuweisen. In der Regel werden wir jedoch neue Steuer-elemente zu bestehenden Men&uuml;s hinzuf&uuml;gen, um diese um die Funktionen des COM-Add-Ins zu erweitern.<\/p>\n<h2>Steuerelement hinzuf&uuml;gen<\/h2>\n<p>Dazu m&uuml;ssen wir zun&auml;chst einmal herausfinden, welchem Men&uuml; wir unseren Befehl hinzuf&uuml;gen wollen. In diesem Fall wollen wir, da wir ja noch keinen konkreten Anwendungszweck haben, einfach einmal einen Befehl zum Men&uuml;punkt <b>Add-Ins <\/b>hinzuf&uuml;gen.<\/p>\n<p>Damit es nicht zu leicht wird, soll dieses Men&uuml; noch ein Untermen&uuml; erhalten, dem wir dann unsere Schaltfl&auml;che hinzuf&uuml;gen. Gerade beim Auflisten des eingebauten Men&uuml;s namens <b>Men&uuml;leiste <\/b>haben wir ja bereits den Namen ermittelt.<\/p>\n<p>Diesen k&ouml;nnen wir nun zum Referenzieren des entsprechenden <b>CommandBar<\/b>-Elements verwenden. Darunter finden wir das Untermen&uuml; namens <b>Add-&#038;Ins<\/b>, das wir ebenfalls referenzieren. Schlie&szlig;lich legen wir darin mit der <b>Add<\/b>-Methode der <b>Controls<\/b>-Auflistung ein neues Unterelement des Typs <b>msoControlPopup<\/b> an, was dem Untermen&uuml; entspricht, und weisen diesem die Beschriftung <b>Mein Add-In <\/b>zu.<\/p>\n<p>Au&szlig;erdem soll vor diesem Untermen&uuml; ein Trennstrich eingef&uuml;gt werden, was wir mit dem Wert <b>True <\/b>f&uuml;r die Eigenschaft <b>BeginGroup <\/b>erreichen:<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>SteuerelementHinzufuegen()\r\n     <span style=\"color:blue;\">Dim <\/span>cbr<span style=\"color:blue;\"> As <\/span>CommandBar\r\n     <span style=\"color:blue;\">Dim <\/span>cbrAddIns<span style=\"color:blue;\"> As <\/span>CommandBarPopup = Nothing\r\n     <span style=\"color:blue;\">Dim <\/span>cbrSub<span style=\"color:blue;\"> As <\/span>CommandBarPopup = Nothing\r\n     cbr = _VBE.CommandBars(\"Men&uuml;leiste\")\r\n     cbrAddIns = cbr.Controls.Item(\"Add-&Ins\")\r\n     cbrSub = cbrAddIns.Controls.Add(MsoControlType. msoControlPopup)\r\n     <span style=\"color:blue;\">With<\/span> cbrSub\r\n         .Caption = \"Mein Add-In\"\r\n         .BeginGroup = <span style=\"color:blue;\">True<\/span>\r\n     End <span style=\"color:blue;\">With<\/span>\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p><!--30percent--><\/p>\n<p>Den Aufruf dieser Methode f&uuml;gen wir schlie&szlig;lich noch der Ereignismethode <b>OnStartupComplete <\/b>zu:<\/p>\n<pre><span style=\"color:blue;\">Public Sub <\/span>OnStartupComplete(ByRef custom<span style=\"color:blue;\"> As <\/span>Array)  Implements IDTExtensibility2.OnStartupComplete\r\n     SteuerelementHinzufuegen()\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p>Danach starten wir das Projekt, was automatisch Access &ouml;ffnet, und laden dann eine Datenbank, f&uuml;r die wir den VBA-Editor &ouml;ffnen. Das Add-Ins-Men&uuml; sieht dann nach dem Aufklappen wie in Bild 5 aus. Dieses zeigt dann nat&uuml;rlich noch keine Befehle an, da wir noch keine hinzugef&uuml;gt haben.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2019_01\/pic_1177_005.png\" alt=\"Unser neues Untermen&uuml;\" width=\"599,593\" height=\"149,0417\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 5: Unser neues Untermen&uuml;<\/span><\/b><\/p>\n<h2>Schaltfl&auml;che zum Untermen&uuml; hinzuf&uuml;gen<\/h2>\n<p>Die Schaltfl&auml;che zum Ausf&uuml;hren eines benutzerdefinierten Befehls f&uuml;gen wir nun hinzu. Dazu deklarieren wir zun&auml;chst eine Variable namens <b>cbc <\/b>mit dem Typ <b>CommandBarButton <\/b>in der Methode <b>SteuerelementHinzufuegen<\/b>. Diese f&uuml;gen wir &uuml;ber die <b>Add<\/b>-Methode der <b>Controls<\/b>-Auflistung des soeben erstellten Untermen&uuml;s aus <b>cbrSub <\/b>hinzu und legen dabei den Typ des Steuerelements auf <b>msoControlButton <\/b>fest. Schlie&szlig;lich f&uuml;llen wir die Eigenschaft <b>Caption <\/b>mit dem Wert <b>Meine Schaltfl&auml;che<\/b>:<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>SteuerelementHinzufuegen()\r\n     ...\r\n     <span style=\"color:blue;\">Dim <\/span>cbc<span style=\"color:blue;\"> As <\/span>CommandBarButton = Nothing\r\n     ...\r\n     <span style=\"color:blue;\">With<\/span> cbrSub\r\n         ...\r\n         cbc = .Controls.Add(MsoControlType.msoControlButton)\r\n         <span style=\"color:blue;\">With<\/span> cbc\r\n             .Caption = \"Meine Schaltfl&auml;che\"\r\n         End <span style=\"color:blue;\">With<\/span>\r\n     End <span style=\"color:blue;\">With<\/span>\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p>Die Schaltfl&auml;che erscheint nun so wie in Bild 6.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2019_01\/pic_1177_006.png\" alt=\"Neue Schaltfl&auml;che im Untermen&uuml;\" width=\"424,7115\" height=\"114,4688\"\/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 6: Neue Schaltfl&auml;che im Untermen&uuml;<\/span><\/b><\/p>\n<h2>Schaltfl&auml;che mit Funktion versehen<\/h2>\n<p>Nun soll die Schaltfl&auml;che auch noch eine Aufgaben ausf&uuml;hren &#8211; in diesem Fall beispielsweise einfach das Anzeigen eines Meldungsfensters. Dazu m&uuml;ssen wir irgendwie festlegen, dass wir f&uuml;r das mit <b>cbc <\/b>deklarierte Element Ereignisse implementieren k&ouml;nnen.<\/p>\n<p>Dazu versehen wir die Deklaration der Variablen mit dem zus&auml;tzlichen Schl&uuml;sselwort <b>WithEvents<\/b>.<\/p>\n<p>Eine solche Deklaration ist allerdings innerhalb einer Methode unzul&auml;ssig, die Variable muss daher unabh&auml;ngig von der Methode deklariert werden. Wir verschieben die folgende Zeile daher in den allgemeinen Teil der Klasse:<\/p>\n<pre><span style=\"color:blue;\">Dim <\/span>WithEvents cbc<span style=\"color:blue;\"> As <\/span>CommandBarButton = Nothing<\/pre>\n<p>Das Anlegen der Ereignisprozedur, die beim Anklicken des Men&uuml;eintrags ausgel&ouml;st wird, legen wir nun auch auf einfache Weise an.<\/p>\n<p>Dazu w&auml;hlen Sie im mittleren Kombinationsfeld oben im Codefenster den Eintrag <b>cbc<\/b> aus und selektieren dann im rechten Kombinationsfeld den Eintrag f&uuml;r die gew&uuml;nschte Ereignismethode &#8211; in diesem Fall gibt es nur eine einzige Auswahlm&ouml;glichkeit, n&auml;mlich <b>Click <\/b>(siehe Bild 7).<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2019_01\/pic_1177_009.png\" alt=\"Anlegen der neuen Ereignisprozedur\" width=\"700\" height=\"287,3433\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 7: Anlegen der neuen Ereignisprozedur<\/span><\/b><\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>cbc_Click(Ctrl<span style=\"color:blue;\"> As <\/span>CommandBarButton,  ByRef CancelDefault<span style=\"color:blue;\"> As Boolean<\/span>) Handles cbc.Click\r\n     MessageBox.Show(\"Klick auf meinen Men&uuml;befehl\")\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p>Wenn Sie das Add-In nun neu starten und im VBA-Editor die Schaltfl&auml;che bet&auml;tigen, erscheint die gew&uuml;nschte Meldung.<\/p>\n<h2>Symbolleisten<\/h2>\n<p>Im ersten Beispiel haben wir das Hauptmen&uuml; des VBA-Editors erweitert. Sie k&ouml;nnen aber auch die Symbolleisten, die in Zusammenhang mit den verschiedenen Elementen des VBA-Editors eingeblendet werden, erweitern. Hier ist es dann unter anderem sinnvoll, eine entsprechende Icon-Datei bereitzustellen, denn in Symbolleisten wird &#8211; wie der Name schon sagt &#8211; ein Symbol statt eines Textes dargestellt.<\/p>\n<p>Dummerweise ist es relativ kompliziert, das mit benutzerdefinierten Icon-Dateien zu erledigen, denn das <b>CommandBarButton<\/b>-Element weist gleich zwei Eigenschaften zum Festlegen des Bildes auf: Die erste hei&szlig;t <b>Picture<\/b>, die zweite <b>Mask<\/b>. Die erste enth&auml;lt das Bild, die zweite eine Maske, die festlegt, welche Teile aus <b>Picture <\/b>transparent angezeigt werden. Praktischerweise k&ouml;nnen wir uns mit ein paar Codezeilen die notwendigen Werkzeuge bauen, die wir f&uuml;r das Erstellen des <b>Picture<\/b>&#8211; und des <b>Mask<\/b>-Elements aus einer handels&uuml;blichen <b>.png<\/b>-Datei ben&ouml;tigen.<\/p>\n<p>Dazu f&uuml;gen wir zun&auml;chst noch weitere Verweise zum Projekt hinzu, und zwar die folgenden:<\/p>\n<ul>\n<li><b>System.Drawing<\/b><\/li>\n<li><b>stdole<\/b><\/li>\n<\/ul>\n<p>Danach f&uuml;gen Sie dem Projekt eine neue Klasse namens <b>IconConverter<\/b> hinzu, die wie folgt aussehen soll:<\/p>\n<pre>Imports System.Windows.Forms\r\n<span style=\"color:blue;\">Public Class<\/span> IconConverter\r\n     Inherits AxHost\r\n     <span style=\"color:blue;\">Private <\/span>Sub New()\r\n         MyBase.New(String.Empty)\r\n     End Sub\r\n     <span style=\"color:blue;\">Public <\/span>Shared Function GetIPictureDispFromImage(ByVal  image<span style=\"color:blue;\"> As <\/span>System.Drawing.Image)<span style=\"color:blue;\"> As <\/span>stdole.IPictureDisp\r\n         Return CType(GetIPictureDispFromPicture(image),  stdole.IPictureDisp)\r\n     End Function\r\n<span style=\"color:blue;\">End Class<\/span><\/pre>\n<p>Au&szlig;erdem ben&ouml;tigen wir die folgende Methode, die wir zur Klasse <b>Connect.vb <\/b>hinzuf&uuml;gen k&ouml;nnen:<\/p>\n<pre><span style=\"color:blue;\">Private Function <\/span>GetPictureMask(ByVal img<span style=\"color:blue;\"> As <\/span>Bitmap) <span style=\"color:blue;\"> As <\/span>stdole.IPictureDisp\r\n     <span style=\"color:blue;\">Dim <\/span>c<span style=\"color:blue;\"> As <\/span>Color\r\n     For y<span style=\"color:blue;\"> As Integer<\/span> = 0 To img.Height - 1\r\n         For x<span style=\"color:blue;\"> As Integer<\/span> = 0 To img.Width - 1\r\n             c = img.GetPixel(x, y)\r\n             <span style=\"color:blue;\">Dim <\/span>m<span style=\"color:blue;\"> As <\/span>Color = Color.Empty\r\n             <span style=\"color:blue;\">If <\/span>c.B = 0 AndAlso c.R = 0 AndAlso c.G = 0<span style=\"color:blue;\"> Then<\/span>\r\n                 m = Color.White\r\n             <span style=\"color:blue;\">Else<\/span>\r\n                 m = Color.Black\r\n             <span style=\"color:blue;\">End If<\/span>\r\n             img.SetPixel(x, y, Color.FromArgb(c.A, m.R,  m.G, m.B))\r\n         <span style=\"color:blue;\">Next<\/span>\r\n     <span style=\"color:blue;\">Next<\/span>\r\n     Return IconConverter.GetIPictureDispFromImage(img)\r\n<span style=\"color:blue;\">End Function<\/span><\/pre>\n<p>Diese liefert die Maske zu einer Bilddatei, die wir mit dem Parameter <b>img <\/b>&uuml;bergeben.<\/p>\n<p>Die Bilddatei fehlt noch. Um diese hinzuzuf&uuml;gen, &ouml;ffnen wir in den Eigenschaften des Projekts den Bereich <b>Ressourcen<\/b>.<\/p>\n<p>Hier klicken Sie auf die Schaltfl&auml;che mit dem Pfeil nach unten rechts neben der Schaltfl&auml;che <b>Ressource hinzuf&uuml;gen <\/b>und &ouml;ffnen so ein Men&uuml;, in dem Sie den Befehl <b>Vorhandene Datei hinzuf&uuml;gen&#8230; <\/b>ausw&auml;hlen (siehe Bild 8).<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2019_01\/pic_1177_007.png\" alt=\"Hinzuf&uuml;gen einer vorhandenen Datei\" width=\"700\" height=\"244,2749\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 8: Hinzuf&uuml;gen einer vorhandenen Datei<\/span><\/b><\/p>\n<p>W&auml;hlen Sie dann die gew&uuml;nschte Bilddatei aus &#8211; beispielsweise eine <b>.png<\/b>-Datei mit einer Gr&ouml;&szlig;e von 16&#215;16. Diese erscheint nach dem Hinzuf&uuml;gen wie in Bild 9 im Ressourcen-Editor.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2019_01\/pic_1177_010.png\" alt=\"Die neue Bilddatei\" width=\"424,7115\" height=\"253,5747\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 9: Die neue Bilddatei<\/span><\/b><\/p>\n<p>Bevor wir eine Schaltfl&auml;che zu einer der Symbolleisten hinzuf&uuml;gen, wollen wir das Bild der bereits erstellten Schaltfl&auml;che im Untermen&uuml; des Eintrags <b>Add-Ins <\/b>des Hauptmen&uuml;s hinzuf&uuml;gen.<\/p>\n<p>Dazu erweitern wir die Methode <b>SteuerelementHinzufuegen <\/b>wie folgt. Dazu legen wir eine neue Variable namens <b>objBitmap <\/b>mit dem Datentyp <b>Bitmap <\/b>an. In der Definition des Steuerelements in der Variablen <b>cbc <\/b>ermitteln wir dann mit der Methode <b>GetObject <\/b>und dem Parameter <b>add <\/b>das Bild, das in der Ressourcendatei <b>Images <\/b>gespeichert ist. Dann ermitteln wir mit der Methode <b>GetIPictureDispFromImage <\/b>der Klasse <b>IconConverter <\/b>ein Objekt des Typs <b>IPictureDisp <\/b>&#8211; dies ist das Format, das die beiden Eigenschaften <b>Picture <\/b>und <b>Mask <\/b>erwarten &#8211; und weisen es der Eigenschaft <b>Picture <\/b>zu.<\/p>\n<p>Das <b>IPictureDisp<\/b>-Objekt f&uuml;r die Eigenschaft <b>Mask <\/b>ermitteln wir mit der Funktion <b>GetPictureMask<\/b> (siehe Listing 2).<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>SteuerelementHinzufuegen()\r\n     <span style=\"color:blue;\">Dim <\/span>icon<span style=\"color:blue;\"> As <\/span>Bitmap\r\n     ...\r\n     <span style=\"color:blue;\">With<\/span> cbrSub\r\n         ...\r\n         cbc = .Controls.Add(MsoControlType.msoControlButton)\r\n         <span style=\"color:blue;\">With<\/span> cbc\r\n             .Caption = \"&Meine Schaltfl&auml;che\"\r\n                 icon = My.Resources.Images.ResourceManager.GetObject(\"add\")\r\n                 .Picture = IconConverter.GetIPictureDispFromImage(icon)\r\n                 .Mask = GetPictureMask(icon)\r\n         End <span style=\"color:blue;\">With<\/span>\r\n     End <span style=\"color:blue;\">With<\/span>\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 2: Prozedur zum Hinzuf&uuml;gen eines Steuerelements<\/span><\/b><\/p>\n<p>Damit wollen wir nun auch noch eine Schaltfl&auml;che zu einer der Symbolleisten hinzuf&uuml;gen. Dazu lassen wir uns zuerst einmal alle Namen der Symbolleisten ausgeben. Dazu passen wir die Methode <b>CommandBarsAusgeben <\/b>so an, dass diese nur die Namen der Symbolleisten ausgibt. Diese haben den Typ <b>msoBarTypeNormal<\/b>:<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>CommandBarsAusgeben()\r\n     <span style=\"color:blue;\">Dim <\/span>cbrs<span style=\"color:blue;\"> As <\/span>CommandBars\r\n     <span style=\"color:blue;\">Dim <\/span>cbr<span style=\"color:blue;\"> As <\/span>CommandBar\r\n     cbrs = _VBE.CommandBars\r\n     For Each cbr In cbrs\r\n         <span style=\"color:blue;\">If <\/span>cbr.Type = MsoBarType.msoBarTypeNormal<span style=\"color:blue;\"> Then<\/span>\r\n             <span style=\"color:blue;\">Debug.Print<\/span>(cbr.Name)\r\n         <span style=\"color:blue;\">End If<\/span>\r\n     <span style=\"color:blue;\">Next<\/span>\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p>Dies liefert die folgenden Elemente:<\/p>\n<pre>Voreinstellung\r\nBearbeiten\r\nDebuggen\r\nUserForm\r\nClipboard<\/pre>\n<p>Wir wollen einen Eintrag zur Symbolleiste <b>Bearbeiten <\/b>hinzuf&uuml;gen. Dazu definieren wir zun&auml;chst wieder eine Variable f&uuml;r die zu erstellende Schaltfl&auml;che:<\/p>\n<pre><span style=\"color:blue;\">Dim <\/span>WithEvents cbcSymbolleiste<span style=\"color:blue;\"> As <\/span>CommandBarButton<\/pre>\n<p>Leider m&uuml;ssen wir f&uuml;r jede Schaltfl&auml;che eine neue Objektvariable mit dem Schl&uuml;sselwort <b>WithEvents <\/b>erstellen, da wir sonst nicht f&uuml;r jede Schaltfl&auml;che eine eigene Ereignisprozedur anlegen k&ouml;nnen. Die Methode, mit der wir die Schaltfl&auml;che zur Symbolleiste hinzuf&uuml;gen, sieht wie in Listing 3 aus.<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>SteuerelementHinzufuegenSymbolleiste()\r\n     <span style=\"color:blue;\">Dim <\/span>cbr<span style=\"color:blue;\"> As <\/span>CommandBar\r\n     <span style=\"color:blue;\">Dim <\/span>objBitmap<span style=\"color:blue;\"> As <\/span>Bitmap\r\n     cbr = _VBE.CommandBars(\"Voreinstellung\")\r\n     cbcSymbolleiste = cbr.Controls.Add(MsoControlType.msoControlButton)\r\n     <span style=\"color:blue;\">With<\/span> cbcSymbolleiste\r\n         objBitmap = My.Resources.ResourceManager.GetObject(\"add\")\r\n         .Picture = IconConverter.GetIPictureDispFromImage(objBitmap)\r\n         .Mask = GetPictureMask(objBitmap)\r\n     End <span style=\"color:blue;\">With<\/span>\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 3: Prozedur zum Hinzuf&uuml;gen eines Steuerelements zu einer Symbolleiste<\/span><\/b><\/p>\n<p>Nach dem Ausf&uuml;hren des Add-Ins sieht das Ergebnis im VBA-Editor wie in Bild 10 aus. Damit wollen wir uns noch nicht zufriedengeben, denn die Schaltfl&auml;che wirkt dort hinten doch etwas verloren. Also wollen wir diese weiter links positionieren, beispielsweise zwischen den Schaltfl&auml;chen f&uuml;r Entwurfsmodus und Projekt-Explorer. Aber mit welcher Eigenschaft k&ouml;nnen wir dies einstellen Genau genommen gelingt dies nicht per Eigenschaft, sondern Sie geben die Position als Parameter der <b>Add<\/b>-Methode der <b>Controls<\/b>-Auflistung mit auf den Weg.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2019_01\/pic_1177_011.png\" alt=\"Neue Schaltfl&auml;che in der Symbolleiste\" width=\"649,559\" height=\"110,6589\"\/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 10: Neue Schaltfl&auml;che in der Symbolleiste<\/span><\/b><\/p>\n<p>Der Parameter hei&szlig;t <b>Before<\/b> und erwartet den Index des Steuer-element, vor dem das neue Steuer-element eingef&uuml;gt werden soll. Wir m&uuml;ssen also zuvor den Index der Schaltfl&auml;che <b>Projekt-Explorer <\/b>ermitteln und diesen dann als Wert des Parameters <b>Before <\/b>&uuml;bergeben.<\/p>\n<p>Zur Sicherheit pr&uuml;fen wir noch, wie die Symbolleiste tats&auml;chlich aufgebaut ist und wie die korrekte Bezeichnung lautet. Dazu f&uuml;gen wir in der Methode <b>CommandBarsAusgeben <\/b>wieder die folgenden drei Zeilen in die vorhandene <b>For Each<\/b>-Schleife ein, um auch die Steuer-elemente der durchlaufenen Symbolleisten auszugeben:<\/p>\n<pre>For Each cbc In cbr.Controls\r\n     <span style=\"color:blue;\">Debug.Print<\/span>(\"  \" + cbc.Caption)\r\n<span style=\"color:blue;\">Next<\/span><\/pre>\n<p>Dies liefert das Ergebnis aus Bild 11. Allerdings taucht hier an der f&uuml;r uns interessanten Stelle noch ein weiterer Eintrag namens <b>&#038;Projekt ausf&uuml;hren <\/b>auf.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2019_01\/pic_1177_012.png\" alt=\"Namen der Steuer-elemente der Symbolleiste Voreinstellungen\" width=\"599,593\" height=\"407,1938\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 11: Namen der Steuer-elemente der Symbolleiste Voreinstellungen<\/span><\/b><\/p>\n<p>Warum sehen wir den nicht in der Symbolleiste Ganz einfach: Weil er ausgeblendet ist. Das pr&uuml;fen wir, indem wir die <b>Debug.Print<\/b>-Anweisung noch wie folgt anpassen und erhalten hier den Wert <b>False<\/b>:<\/p>\n<pre><span style=\"color:blue;\">Debug.Print<\/span>(\"  \" + cbc.Caption + \" \" + cbc.Visible.ToString)<\/pre>\n<p>Danach sieht unsere Methode <b>SteuerelementHinzufuegenSymbolleiste <\/b>wie folgt aus:<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>SteuerelementHinzufuegenSymbolleiste()\r\n     <span style=\"color:blue;\">Dim <\/span>cbr<span style=\"color:blue;\"> As <\/span>CommandBar\r\n     <span style=\"color:blue;\">Dim <\/span>cbcBefore<span style=\"color:blue;\"> As <\/span>CommandBarButton\r\n     <span style=\"color:blue;\">Dim <\/span>objBitmap<span style=\"color:blue;\"> As <\/span>Bitmap\r\n     <span style=\"color:blue;\">Dim <\/span>intBefore<span style=\"color:blue;\"> As <\/span>Int16\r\n     cbr = _VBE.CommandBars(\"Voreinstellung\")\r\n     cbcBefore = cbr.Controls.Item(\"&Projekt ausf&uuml;hren\")\r\n     intBefore = cbcBefore.Index\r\n     cbcSymbolleiste = cbr.Controls.Add( MsoControlType.msoControlButton, Before:=intBefore)\r\n     <span style=\"color:blue;\">With<\/span> cbcSymbolleiste\r\n         objBitmap = My.Resources.ResourceManager. GetObject(\"add\")\r\n         .Picture = IconConverter.GetIPictureDispFromImage (objBitmap)\r\n         .Mask = GetPictureMask(objBitmap)\r\n         .TooltipText = \"Beispielschaltfl&auml;che\"\r\n         .BeginGroup = <span style=\"color:blue;\">True<\/span>\r\n     End <span style=\"color:blue;\">With<\/span>\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p>Wir ermitteln also zun&auml;chst einen Verweis namens <b>cbcBefore <\/b>auf die Schaltfl&auml;che, vor der wir unsere Schaltfl&auml;che einf&uuml;gen m&ouml;chten. Dann ermitteln wir &uuml;ber die Eigenschaft <b>Index <\/b>ihren Index und speichern diesen in der Variablen <b>intBefore<\/b>.<\/p>\n<p>Der <b>Add<\/b>-Methode der <b>Controls<\/b>-Auflistung f&uuml;gen wir dann &uuml;ber den Parameter <b>Before <\/b>den Index aus <b>intBefore <\/b>zu. Nach dem Erstellen stellen wie schlie&szlig;lich noch die Eigenschaften <b>ToolTipText<\/b> und <b>BeginGroup <\/b>ein, sodass unsere Symbolleiste nach dem n&auml;chsten Start des VBA-Editors wie in Bild 12 aussieht. Das Erstellen der Ereignismethode f&uuml;r das <b>Click<\/b>-Ereignis sparen wir an dieser Stelle &#8211; Sie wissen ja bereits, wie das gelingt.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2019_01\/pic_1177_013.png\" alt=\"Die neue Schaltfl&auml;che an der gew&uuml;nschten Position und mit ToolTipText\" width=\"499,6607\" height=\"172,9594\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 12: Die neue Schaltfl&auml;che an der gew&uuml;nschten Position und mit ToolTipText<\/span><\/b><\/p>\n<h2>Kontextmen&uuml;s<\/h2>\n<p>Fehlt noch ein Beispiel daf&uuml;r, wie Sie einen Eintrag zu einem Kontextmen&uuml; hinzuf&uuml;gen k&ouml;nnen. Dazu listen wir zun&auml;chst einmal alle Kontextmen&uuml;s des VBA-Editors auf.<\/p>\n<p>Dazu geben wir wieder alle Kontextmen&uuml;s im Direktbereich von Visual Studio aus. Um dies zu erledigen, kopieren wir die Methode <b>CommandBarsAusgeben <\/b>in die Methode <b>PopupMenusAusgeben <\/b>und ersetzen den Parameter <b>msoBarTypeNormal <\/b>durch <b>msoBarTypePopup<\/b>.<\/p>\n<p>Au&szlig;erdem f&uuml;gen wir den Aufruf dieser Methode der Methode <b>OnStartupComplete <\/b>zu. Nach dem n&auml;chsten Start des VBA-Editors werden die Namen aller Kontextmen&uuml;s im Direktfenster von Visual Studio ausgegeben. Das sind eine ganze Menge &#8211; daher wird es schwierig, das richtige Men&uuml; zu finden.<\/p>\n<p>Um uns die Arbeit zu erleichtern, f&uuml;gen wir einfach jedem Kontextmen&uuml; eine Schaltfl&auml;che an, die den Namen des Kontextmen&uuml;s enth&auml;lt. So k&ouml;nnen wir dann schnell das gew&uuml;nschte Kontextmen&uuml; identifizieren.<\/p>\n<p>Dazu haben wir in der folgenden Methode, die alle Kontextmen&uuml;s durchl&auml;uft, f&uuml;r jedes Kontextmen&uuml; eine neue Schaltfl&auml;che hinzugef&uuml;gt, der wir f&uuml;r die <b>Caption<\/b>-Eigenschaft den Namen des Men&uuml;s hinzugef&uuml;gt haben. Au&szlig;erdem haben wir jeweils den Beginn einer neuen Gruppe f&uuml;r die neuen Eintr&auml;ge definiert:<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>PopupMenusAusgeben()\r\n     ...\r\n     For Each cbr In cbrs\r\n         <span style=\"color:blue;\">If <\/span>cbr.Type = MsoBarType.msoBarTypePopup<span style=\"color:blue;\"> Then<\/span>\r\n             cbr.Protection =  MsoBarProtection.msoBarNoProtection\r\n             cbc = cbr.Controls.Add( MsoControlType.msoControlButton)\r\n             <span style=\"color:blue;\">With<\/span> cbc\r\n                 .BeginGroup = <span style=\"color:blue;\">True<\/span>\r\n                 .Caption = cbr.Name\r\n             End <span style=\"color:blue;\">With<\/span>\r\n         <span style=\"color:blue;\">End If<\/span>\r\n     <span style=\"color:blue;\">Next<\/span>\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p>Ein Problem hat mich dabei lange besch&auml;ftigt: Im Gegensatz zum Hinzuf&uuml;gen einer Schaltfl&auml;che zur Men&uuml;leiste und zu den Symbolleisten trat beim Kontextmen&uuml; immer ein Fehler auf, wenn die <b>Add<\/b>-Methode aufgerufen wurde.<\/p>\n<p>Sp&auml;ter wurde dann klar, dass dies an der Einstellung f&uuml;r die Eigenschaft <b>Protection <\/b>der eingebauten Kontextmen&uuml;s lag: Die waren n&auml;mlich gesch&uuml;tzt, sodass der Benutzer diese nicht &auml;ndern konnte. Stellt man diese Eigenschaft jedoch zuvor auf den Wert <b>msoBarNoProtection <\/b>ein, kann man auch hier benutzerdefinierte Eintr&auml;ge hinzuf&uuml;gen &#8211; siehe Bild 13.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2019_01\/pic_1177_014.png\" alt=\"Neuer Befehl mit dem Namen eines Kontextmen&uuml;s am Ende jedes Kontextmen&uuml;s\" width=\"424,7115\" height=\"475,7971\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 13: Neuer Befehl mit dem Namen eines Kontextmen&uuml;s am Ende jedes Kontextmen&uuml;s<\/span><\/b><\/p>\n<p>Damit kennen wir nun beispielsweise den Namen f&uuml;r das <b>Kontextmen&uuml; <\/b>des Codefensters &#8211; <b>Code Window <\/b>-, und k&ouml;nnen diesem benutzerdefinierte Eintr&auml;ge hinzuf&uuml;gen.<\/p>\n<p>Die folgende Prozedur schlie&szlig;lich f&uuml;gt eine neue Schaltfl&auml;che zum Kontextmen&uuml; hinzu, das beim rechten Mausklick auf das Codefenster ge&ouml;ffnet wird (siehe Bild 14):<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2019_01\/pic_1177_015.png\" alt=\"Ein neuer Befehl im Kontextmen&uuml;\" width=\"424,7115\" height=\"615,713\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 14: Ein neuer Befehl im Kontextmen&uuml;<\/span><\/b><\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>SteuerelementHinzufuegenKontextmenue()\r\n     <span style=\"color:blue;\">Dim <\/span>cbr<span style=\"color:blue;\"> As <\/span>CommandBar\r\n     <span style=\"color:blue;\">Dim <\/span>objBitmap<span style=\"color:blue;\"> As <\/span>Bitmap\r\n     cbr = _VBE.CommandBars(\"Code Window\")\r\n     cbr.Protection = MsoBarProtection.msoBarNoProtection\r\n     cbcSymbolleiste = cbr.Controls.Add( MsoControlType.msoControlButton)\r\n     <span style=\"color:blue;\">With<\/span> cbcSymbolleiste\r\n         objBitmap = My.Resources.ResourceManager. GetObject(\"add\")\r\n         .Picture = IconConverter. GetIPictureDispFromImage(objBitmap)\r\n         .Mask = GetPictureMask(objBitmap)\r\n         .TooltipText = \"Beispielschaltfl&auml;che\"\r\n         .Caption = \"Beispielschaltfl&auml;che\"\r\n         .BeginGroup = <span style=\"color:blue;\">True<\/span>\r\n     End <span style=\"color:blue;\">With<\/span>\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<h2>Zusammenfassung und Ausblick<\/h2>\n<p>Damit haben wir die Voraussetzungen geschaffen, COM-Add-Ins mit Men&uuml;-Eintr&auml;gen zum Aufrufen der Funktion zu programmieren.<\/p>\n<p>In der folgenden Ausgabe schauen wir uns ein praktisches Beispiel f&uuml;r ein solches COM-Add-In an.<\/p>\n<h3>Downloads zu diesem Beitrag<\/h3>\n<p>Enthaltene Beispieldateien:<\/p>\n<p>VBECOMAddIn.zip<\/p>\n<p><a href=\"..\/fileadmin\/beispiele\/F97A766D-A705-4E13-9D96-83B78453657A\/aiu_1177.zip\">Download<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Im Beitrag &#8222;COM-Add-In f&uuml;r den VBA-Editor&#8220; haben wir uns zun&auml;chst darum gek&uuml;mmert, &uuml;berhaupt eine COM-DLL zu programmieren und diese so in die Registry einzutragen, dass sie beim Starten des VBA-Editors geladen wird und die dort angelegten Ereignisprozeduren ausgel&ouml;st wurden. Damit sind wir noch lange nicht fertig. Im vorliegenden Artikel schauen wir uns an, wie Sie dem VBA-Editor Men&uuml;eintr&auml;ge f&uuml;r den Aufruf der im COM-Add-In enthaltenen Funktionen hinzuf&uuml;gen &#8211; und zwar f&uuml;r die Men&uuml;leiste, die Symbolleiste sowie f&uuml;r Kontextmen&uuml;s.<\/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":[66012019,662019,44000025],"tags":[],"class_list":["post-55001177","post","type-post","status-publish","format-standard","hentry","category-66012019","category-662019","category-VBA_und_Programmiertechniken"],"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>Men&uuml;s f&uuml;r das COM-Add-In f&uuml;r den VBA-Editor  - 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\/Menues_fuer_das_COMAddIn_fuer_den_VBAEditor_\/\" \/>\n<meta property=\"og:locale\" content=\"de_DE\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Men&uuml;s f&uuml;r das COM-Add-In f&uuml;r den VBA-Editor\" \/>\n<meta property=\"og:description\" content=\"Im Beitrag &quot;COM-Add-In f&uuml;r den VBA-Editor&quot; haben wir uns zun&auml;chst darum gek&uuml;mmert, &uuml;berhaupt eine COM-DLL zu programmieren und diese so in die Registry einzutragen, dass sie beim Starten des VBA-Editors geladen wird und die dort angelegten Ereignisprozeduren ausgel&ouml;st wurden. Damit sind wir noch lange nicht fertig. Im vorliegenden Artikel schauen wir uns an, wie Sie dem VBA-Editor Men&uuml;eintr&auml;ge f&uuml;r den Aufruf der im COM-Add-In enthaltenen Funktionen hinzuf&uuml;gen - und zwar f&uuml;r die Men&uuml;leiste, die Symbolleiste sowie f&uuml;r Kontextmen&uuml;s.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/access-im-unternehmen.de\/Menues_fuer_das_COMAddIn_fuer_den_VBAEditor_\/\" \/>\n<meta property=\"og:site_name\" content=\"Access im Unternehmen\" \/>\n<meta property=\"article:published_time\" content=\"2020-05-13T21:06:00+00:00\" \/>\n<meta property=\"og:image\" content=\"http:\/\/vg06.met.vgwort.de\/na\/94980585493a435aa3a7db68dd5e2af9\" \/>\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=\"20\u00a0Minuten\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Menues_fuer_das_COMAddIn_fuer_den_VBAEditor_\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Menues_fuer_das_COMAddIn_fuer_den_VBAEditor_\\\/\"},\"author\":{\"name\":\"Andr\u00e9 Minhorst\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#\\\/schema\\\/person\\\/13395c4bcd7d7963efe33be9c584d93f\"},\"headline\":\"Men&uuml;s f&uuml;r das COM-Add-In f&uuml;r den VBA-Editor\",\"datePublished\":\"2020-05-13T21:06:00+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Menues_fuer_das_COMAddIn_fuer_den_VBAEditor_\\\/\"},\"wordCount\":3174,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#organization\"},\"image\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Menues_fuer_das_COMAddIn_fuer_den_VBAEditor_\\\/#primaryimage\"},\"thumbnailUrl\":\"http:\\\/\\\/vg06.met.vgwort.de\\\/na\\\/94980585493a435aa3a7db68dd5e2af9\",\"articleSection\":[\"1\\\/2019\",\"2019\",\"VBA und Programmiertechniken\"],\"inLanguage\":\"de\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/access-im-unternehmen.de\\\/Menues_fuer_das_COMAddIn_fuer_den_VBAEditor_\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Menues_fuer_das_COMAddIn_fuer_den_VBAEditor_\\\/\",\"url\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Menues_fuer_das_COMAddIn_fuer_den_VBAEditor_\\\/\",\"name\":\"Men&uuml;s f&uuml;r das COM-Add-In f&uuml;r den VBA-Editor - Access im Unternehmen\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Menues_fuer_das_COMAddIn_fuer_den_VBAEditor_\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Menues_fuer_das_COMAddIn_fuer_den_VBAEditor_\\\/#primaryimage\"},\"thumbnailUrl\":\"http:\\\/\\\/vg06.met.vgwort.de\\\/na\\\/94980585493a435aa3a7db68dd5e2af9\",\"datePublished\":\"2020-05-13T21:06:00+00:00\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Menues_fuer_das_COMAddIn_fuer_den_VBAEditor_\\\/#breadcrumb\"},\"inLanguage\":\"de\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/access-im-unternehmen.de\\\/Menues_fuer_das_COMAddIn_fuer_den_VBAEditor_\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"de\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Menues_fuer_das_COMAddIn_fuer_den_VBAEditor_\\\/#primaryimage\",\"url\":\"http:\\\/\\\/vg06.met.vgwort.de\\\/na\\\/94980585493a435aa3a7db68dd5e2af9\",\"contentUrl\":\"http:\\\/\\\/vg06.met.vgwort.de\\\/na\\\/94980585493a435aa3a7db68dd5e2af9\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Menues_fuer_das_COMAddIn_fuer_den_VBAEditor_\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/access-im-unternehmen.de\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Men&uuml;s f&uuml;r das COM-Add-In f&uuml;r den VBA-Editor\"}]},{\"@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":"Men&uuml;s f&uuml;r das COM-Add-In f&uuml;r den VBA-Editor  - 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\/Menues_fuer_das_COMAddIn_fuer_den_VBAEditor_\/","og_locale":"de_DE","og_type":"article","og_title":"Men&uuml;s f&uuml;r das COM-Add-In f&uuml;r den VBA-Editor","og_description":"Im Beitrag \"COM-Add-In f&uuml;r den VBA-Editor\" haben wir uns zun&auml;chst darum gek&uuml;mmert, &uuml;berhaupt eine COM-DLL zu programmieren und diese so in die Registry einzutragen, dass sie beim Starten des VBA-Editors geladen wird und die dort angelegten Ereignisprozeduren ausgel&ouml;st wurden. Damit sind wir noch lange nicht fertig. Im vorliegenden Artikel schauen wir uns an, wie Sie dem VBA-Editor Men&uuml;eintr&auml;ge f&uuml;r den Aufruf der im COM-Add-In enthaltenen Funktionen hinzuf&uuml;gen - und zwar f&uuml;r die Men&uuml;leiste, die Symbolleiste sowie f&uuml;r Kontextmen&uuml;s.","og_url":"https:\/\/access-im-unternehmen.de\/Menues_fuer_das_COMAddIn_fuer_den_VBAEditor_\/","og_site_name":"Access im Unternehmen","article_published_time":"2020-05-13T21:06:00+00:00","og_image":[{"url":"http:\/\/vg06.met.vgwort.de\/na\/94980585493a435aa3a7db68dd5e2af9","type":"","width":"","height":""}],"author":"Andr\u00e9 Minhorst","twitter_card":"summary_large_image","twitter_misc":{"Verfasst von":"Andr\u00e9 Minhorst","Gesch\u00e4tzte Lesezeit":"20\u00a0Minuten"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/access-im-unternehmen.de\/Menues_fuer_das_COMAddIn_fuer_den_VBAEditor_\/#article","isPartOf":{"@id":"https:\/\/access-im-unternehmen.de\/Menues_fuer_das_COMAddIn_fuer_den_VBAEditor_\/"},"author":{"name":"Andr\u00e9 Minhorst","@id":"https:\/\/access-im-unternehmen.de\/#\/schema\/person\/13395c4bcd7d7963efe33be9c584d93f"},"headline":"Men&uuml;s f&uuml;r das COM-Add-In f&uuml;r den VBA-Editor","datePublished":"2020-05-13T21:06:00+00:00","mainEntityOfPage":{"@id":"https:\/\/access-im-unternehmen.de\/Menues_fuer_das_COMAddIn_fuer_den_VBAEditor_\/"},"wordCount":3174,"commentCount":0,"publisher":{"@id":"https:\/\/access-im-unternehmen.de\/#organization"},"image":{"@id":"https:\/\/access-im-unternehmen.de\/Menues_fuer_das_COMAddIn_fuer_den_VBAEditor_\/#primaryimage"},"thumbnailUrl":"http:\/\/vg06.met.vgwort.de\/na\/94980585493a435aa3a7db68dd5e2af9","articleSection":["1\/2019","2019","VBA und Programmiertechniken"],"inLanguage":"de","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/access-im-unternehmen.de\/Menues_fuer_das_COMAddIn_fuer_den_VBAEditor_\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/access-im-unternehmen.de\/Menues_fuer_das_COMAddIn_fuer_den_VBAEditor_\/","url":"https:\/\/access-im-unternehmen.de\/Menues_fuer_das_COMAddIn_fuer_den_VBAEditor_\/","name":"Men&uuml;s f&uuml;r das COM-Add-In f&uuml;r den VBA-Editor - Access im Unternehmen","isPartOf":{"@id":"https:\/\/access-im-unternehmen.de\/#website"},"primaryImageOfPage":{"@id":"https:\/\/access-im-unternehmen.de\/Menues_fuer_das_COMAddIn_fuer_den_VBAEditor_\/#primaryimage"},"image":{"@id":"https:\/\/access-im-unternehmen.de\/Menues_fuer_das_COMAddIn_fuer_den_VBAEditor_\/#primaryimage"},"thumbnailUrl":"http:\/\/vg06.met.vgwort.de\/na\/94980585493a435aa3a7db68dd5e2af9","datePublished":"2020-05-13T21:06:00+00:00","breadcrumb":{"@id":"https:\/\/access-im-unternehmen.de\/Menues_fuer_das_COMAddIn_fuer_den_VBAEditor_\/#breadcrumb"},"inLanguage":"de","potentialAction":[{"@type":"ReadAction","target":["https:\/\/access-im-unternehmen.de\/Menues_fuer_das_COMAddIn_fuer_den_VBAEditor_\/"]}]},{"@type":"ImageObject","inLanguage":"de","@id":"https:\/\/access-im-unternehmen.de\/Menues_fuer_das_COMAddIn_fuer_den_VBAEditor_\/#primaryimage","url":"http:\/\/vg06.met.vgwort.de\/na\/94980585493a435aa3a7db68dd5e2af9","contentUrl":"http:\/\/vg06.met.vgwort.de\/na\/94980585493a435aa3a7db68dd5e2af9"},{"@type":"BreadcrumbList","@id":"https:\/\/access-im-unternehmen.de\/Menues_fuer_das_COMAddIn_fuer_den_VBAEditor_\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/access-im-unternehmen.de\/"},{"@type":"ListItem","position":2,"name":"Men&uuml;s f&uuml;r das COM-Add-In f&uuml;r den VBA-Editor"}]},{"@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\/55001177","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=55001177"}],"version-history":[{"count":0,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/posts\/55001177\/revisions"}],"wp:attachment":[{"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/media?parent=55001177"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/categories?post=55001177"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/tags?post=55001177"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}