{"id":55001331,"date":"2021-12-01T00:00:00","date_gmt":"2021-12-10T07:39:29","guid":{"rendered":"http:\/\/access-im-unternehmen.aix-dev.de\/aiu\/?p=1331"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-30T00:00:00","slug":"Ribbonvariable_fehlerresistent_machen","status":"publish","type":"post","link":"https:\/\/access-im-unternehmen.de\/Ribbonvariable_fehlerresistent_machen\/","title":{"rendered":"Ribbonvariable fehlerresistent machen"},"content":{"rendered":"<p><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/vg07.met.vgwort.de\/na\/6713e6d4cbc447ec90d08bd460041009\" width=\"1\" height=\"1\" alt=\"\"><\/p>\n<p><b>In VBA-Projekten von Access-Datenbanken (und in VBA im Allgemeinen) gibt es das Problem, dass das Auftreten von unbehandelten Laufzeitfehlern dazu f&uuml;hrt, dass Objektvariablen geleert werden. Das ist insbesondere dann nachteilig, wenn Sie mit dem Ribbon arbeiten und dieses zwischendurch mit der Invalidate-Methode ung&uuml;ltig machen m&uuml;ssen, damit die Attribute mit get&#8230;-Prozeduren erneut eingelesen werden k&ouml;nnen. Der Aufruf von Invalidate f&uuml;hrt dann unweigerlich zu einem Laufzeitfehler. Dieser Beitrag beschreibt das grundlegende Beispiel und liefert eine L&ouml;sung, mit der Sie sich keine Sorgen mehr um Objektvariablen machen m&uuml;ssen, die durch Laufzeitfehler geleert werden.<\/b><\/p>\n<h2>Leeren von Objektvariablen nach Laufzeitfehlern reproduzieren<\/h2>\n<p>Als Erstes schauen wir uns an, mit welchem Problem wir es &uuml;berhaupt zu tun haben. Das Problem betrifft nicht nur die Variablen, die in Zusammenhang mit dem Ribbon erstellt werden. Allerdings haben Objektvariablen &uuml;blicherweise eine &uuml;berschaubare G&uuml;ltigkeitsdauer &#8211; sie werden in der Regel innerhalb einer Prozedur deklariert und verlieren ihre G&uuml;ltigkeit nach dem Beenden der Prozedur auch wieder.<\/p>\n<p>Grunds&auml;tzlich ist es ohnehin nicht empfehlenswert, mit global deklarierten Variablen zu arbeiten, da diese nicht nur von &uuml;berall gelesen, sondern auch von &uuml;berall ge&auml;ndert werden k&ouml;nnen. Dabei treten schnell Probleme auf, wenn man von mehreren Stellen aus auf solche Variablen zugreift und nicht genau wei&szlig;, was man da tut.<\/p>\n<p>Sp&auml;testens, wenn mal jemand anderer die Anwendung &uuml;bernimmt und anpasst und sich nicht bewusst ist, das er dort mit global deklarierten Variablen arbeitet, k&ouml;nnte es zu Problemen kommen.<\/p>\n<h2>Beispiel f&uuml;r Datenverlust nach Laufzeitfehlern<\/h2>\n<p>Schauen wir uns also zun&auml;chst einmal den grunds&auml;tzlichen Effekt an, um zu sehen, womit wir es zu tun haben. Dazu deklarieren wir in einem Standardmodul die folgende Variable:<\/p>\n<pre><span style=\"color:blue;\">Public <\/span>db<span style=\"color:blue;\"> As <\/span>DAO.Database<\/pre>\n<p>db ist nun &ouml;ffentlich deklariert und kann von &uuml;berall innerhalb der Anwendung gesetzt und gelesen werden. Wir setzen diese in einer kleinen Prozedur im gleichen Modul:<\/p>\n<pre><span style=\"color:blue;\">Public Sub <\/span>DbSetzen()\r\n     <span style=\"color:blue;\">Set<\/span> db = CurrentDb\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p>Wir k&ouml;nnen nun im Direktbereich von Access &uuml;ber die Objektvariable db auf das referenzierte Objekt zugreifen und so beispielsweise den Pfad der aktuellen Anwendung ermitteln:<\/p>\n<pre>  db.Name\r\nC:\\Users\\...\\RibbonvariableFehlersicherMachen.accdb<\/pre>\n<p>Nun provozieren wir einen unbehandelten Laufzeitfehler, indem wir die folgende Prozedur ausl&ouml;sen:<\/p>\n<pre><span style=\"color:blue;\">Public Sub <\/span>RaiseError()\r\n     <span style=\"color:blue;\">Debug.Print<\/span> 1 \/ 0\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p>Dies ruft die Fehlermeldung aus Bild 1 hervor. Klicken wir hier auf <b>Beenden<\/b>, vervollst&auml;ndigen wir den unbehandelten Laufzeitfehler. Durch einen Klick auf Debuggen und gegebenenfalls &Auml;nderungen im Code k&ouml;nnten wir den Fehler behandeln, was wir aber an dieser Stelle nicht wollen. Stattdessen klicken wir schlicht auf <b>Beenden<\/b>.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2021_06\/pic_1331_001.png\" alt=\"Unbehandelter Laufzeitfehler\" width=\"549,559\" height=\"363,4322\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 1: Unbehandelter Laufzeitfehler<\/span><\/b><\/p>\n<p>Dies f&uuml;hrt zun&auml;chst einmal zu keiner sichtbaren Folge &#8211; davon abgesehen, dass die Prozedur an dieser Stelle einfach abgebrochen wird.<\/p>\n<p>Es gibt jedoch noch einen weiteren Nebeneffekt: Die Variable <b>db <\/b>ist nun leer und zeigt nicht mehr auf das soeben referenzierte Objekt des Typs <b>Database<\/b>. Wie k&ouml;nnen wir das herausfinden Indem wir einfach nochmal versuchen, den Pfad der aktuellen Anwendung im Direktbereich auszugeben.<\/p>\n<p>Dies f&uuml;hrt nun zu dem Fehler aus Bild 2. Die Variable enth&auml;lt also nicht mehr den Verweis auf das <b>Database<\/b>-Objekt.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2021_06\/pic_1331_002.png\" alt=\"Die Variable db ist geleert.\" width=\"549,559\" height=\"266,0926\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 2: Die Variable db ist geleert.<\/span><\/b><\/p>\n<h2>Wozu globale Ribbonvariablen<\/h2>\n<p>Doch zur&uuml;ck zur eigentlichen Problemstellung, die solche Variablen betrifft, die global deklariert sind und Verweise auf Ribbon-Definitionen speichern.<\/p>\n<p>Warum machen wir das &uuml;berhaupt Nun: Der Verweis auf eine Ribbon-Definition wird nur einmal beim Anwenden der Ribbon-Definition geliefert, und zwar mit der Prozedur, die Sie f&uuml;r das Ereignisattribut <b>onLoad <\/b>hinterlegen k&ouml;nnen. Diese enth&auml;lt einen Parameter namens <b>ribbon <\/b>mit dem Datentyp <b>IRibbonUI<\/b>.<\/p>\n<p>Damit wir sp&auml;ter auf diese Variable zugreifen k&ouml;nnen, m&uuml;ssen wir diese als globale Variable speichern. Dazu verwenden wir die folgende Variable, die wir in einem Standardmodul beispielsweise namens <b>mdlRibbons <\/b>deklarieren:<\/p>\n<pre><span style=\"color:blue;\">Public <\/span>objRibbon_Main<span style=\"color:blue;\"> As <\/span>IRibbonUI<\/pre>\n<p>In der Ribbon-Definition legen wir f&uuml;r das Element <b>CustomUI <\/b>ein Attribut namens <b>onLoad <\/b>an, das den Namen der Prozedur enth&auml;lt, die beim Laden der Ribbondefinition ausgef&uuml;hrt werden soll &#8211; au&szlig;erdem hinterlegen wir f&uuml;r das <b>button<\/b>-Element <b>btn <\/b>noch ein Callbackattribut namens <b>getEnabled<\/b>, mit dem wir gleich pr&uuml;fen k&ouml;nnen, ob die <b>Invalidate<\/b>-Methode des Ribbons funktioniert:<\/p>\n<pre>&lt;xml version=\"1.0\"&gt;\r\n&lt;customUI ... onLoad=\"OnLoad_Main\"&gt;\r\n   &lt;ribbon&gt;\r\n     &lt;tabs&gt;\r\n       &lt;tab id=\"tab\" label=\"Beispieltab\"&gt;\r\n         &lt;group id=\"grp\" label=\"Beispielgruppe\"&gt;\r\n           &lt;button id=\"btn\" getEnabled=\"getEnabled\"             label=\"Beispielbutton\"\/&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>Die Prozedur f&uuml;r das Attribut <b>onLoad<\/b> enth&auml;lt lediglich eine Anweisung, die den mit dem Parameter <b>ribbon <\/b>&uuml;bergebenen Verweis in der Variablen <b>objRibbon_Main <\/b>speichert:<\/p>\n<pre><span style=\"color:blue;\">Sub <\/span>onLoad_Main(ribbon<span style=\"color:blue;\"> As <\/span>IRibbonUI)\r\n     <span style=\"color:blue;\">Set<\/span> objRibbon_Main = ribbon\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p>Au&szlig;erdem hinterlegen wir im Modul <b>mdlRibbons <\/b>noch eine Variable f&uuml;r den <b>Enabled<\/b>-Zustand der Schaltfl&auml;che <b>btn<\/b>:<\/p>\n<pre><span style=\"color:blue;\">Public <\/span>bolEnabled<span style=\"color:blue;\"> As Boolean<\/span><\/pre>\n<p>F&uuml;r das Attribut <b>getEnabled <\/b>des <b>button<\/b>-Elements <b>btn <\/b>hinterlegen wir die folgende Prozedur, welche mit dem Parameter <b>enabled <\/b>den Wert der Variablen <b>bolEnabled <\/b>zur&uuml;ckgibt:<\/p>\n<pre><span style=\"color:blue;\">Sub <\/span>getEnabled(control<span style=\"color:blue;\"> As <\/span>IRibbonControl, ByRef enabled)\r\n     enabled = bolEnabled\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<h2>Testen, ob die Ribbon-Variable bei Fehler geleert wird<\/h2>\n<p><!--30percent--><\/p>\n<p>Wenn Sie die Ribbon-Definition wie hier beschrieben und in der Beispielanwendung umgesetzt angelegt haben, sollte nach einem Neustart der Anwendung das Tab mit der Beschriftung <b>Beispieltab <\/b>mit einer Gruppe <b>Beispielgruppe <\/b>und einer Schaltfl&auml;che <b>Beispielbutton <\/b>erscheinen (siehe Bild 3).<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2021_06\/pic_1331_003.png\" alt=\"Das Beispielribbon in Aktion\" width=\"599,559\" height=\"262,6888\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 3: Das Beispielribbon in Aktion<\/span><\/b><\/p>\n<p>Die Schaltfl&auml;che ist nicht aktiviert, da die Variable <b>bol-Enabled <\/b>standardm&auml;&szlig;ig den Wert <b>False <\/b>hat und noch nicht auf <b>True <\/b>eingestellt wurde.<\/p>\n<p>Also liefert die Prozedur <b>getEnabled <\/b>den Wert <b>False <\/b>f&uuml;r den Parameter <b>enabled<\/b>, der dann an das aufrufende <b>button<\/b>-Element weitergegeben wird.<\/p>\n<p>Nun probieren wir, ob auch das Zuweisen des <b>IRibbon-UI<\/b>-Objekts funktioniert hat. Dazu rufen wir die folgende Prozedur auf. Diese stellt zun&auml;chst <b>bolEnabled <\/b>auf <b>True <\/b>ein. Beim n&auml;chsten Aufruf von <b>getEnabled <\/b>sollte also die Schaltfl&auml;che <b>btn <\/b>aktiviert werden. Au&szlig;erdem ruft die Prozedur die <b>Invalidate<\/b>-Methode von <b>objRibbon_Main <\/b>auf:<\/p>\n<pre><span style=\"color:blue;\">Public Sub <\/span>BeispielbuttonAktivieren()\r\n     bolEnabled = <span style=\"color:blue;\">True<\/span>\r\n     objRibbon_Main.Invalidate\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p>Dies f&uuml;hrt dazu, dass die Schaltfl&auml;che <b>btn<\/b> nun aktiviert dargestellt wird (siehe Bild 4). Mit der folgenden Prozedur k&ouml;nnen Sie diese wieder deaktivieren:<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2021_06\/pic_1331_004.png\" alt=\"Die nun aktivierte Schaltfl&auml;che im Ribbon\" width=\"349,5589\" height=\"224,4435\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 4: Die nun aktivierte Schaltfl&auml;che im Ribbon<\/span><\/b><\/p>\n<pre><span style=\"color:blue;\">Public Sub <\/span>BeispielbuttonDeaktivieren()\r\n     bolEnabled = <span style=\"color:blue;\">False<\/span>\r\n     objRibbon_Main.Invalidate\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p>Damit k&ouml;nnen wir nun wieder einen unbehandelten Fehler ausl&ouml;sen:<\/p>\n<pre><span style=\"color:blue;\">Public Sub <\/span>RaiseError()\r\n     <span style=\"color:blue;\">Debug.Print<\/span> 1 \/ 0\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p>Versuchen wir nun, mit der Prozedur <b>BeispielbuttonAktivieren <\/b>die Schaltfl&auml;che im Ribbon wieder zu aktivieren, erhalten wir den Fehler aus Bild 5. Genau dieses Verhalten wollen wir nun &auml;ndern.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2021_06\/pic_1331_005.png\" alt=\"Fehler beim Versuch, das Ribbon zu invalidieren\" width=\"449,5589\" height=\"255,182\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 5: Fehler beim Versuch, das Ribbon zu invalidieren<\/span><\/b><\/p>\n<h2>Was speichert eine Objektvariable<\/h2>\n<p>Um die folgenden Schritte besser nachvollziehen zu k&ouml;nnen, m&uuml;ssen Sie wissen, was eine Objektvariable eigentlich speichert &#8211; was auch der Grund ist, warum wir meist schreiben, dass eine Objektvariable ein Objekt referenziert und eben nicht das Objekt selbst enth&auml;lt.<\/p>\n<p>Tats&auml;chlich enth&auml;lt die Objektvariable n&auml;mlich nur die Speicheradresse, an der sich das jeweilige Objekt befindet. Und genau diese ist der Punkt, an dem unsere nachfolgend beschriebene L&ouml;sung ansetzt.<\/p>\n<h2>Die Rolle der TempVars<\/h2>\n<p>Mit Access 2010 wurden die <b>TempVars <\/b>eingef&uuml;hrt. <b>TempVars <\/b>sind eine Auflistung, in der Sie beliebige Name-Wert-Paare speichern k&ouml;nnen. Dabei nutzen wir die <b>Add<\/b>-Methode dieser Auflistung, um Elemente hinzuzuf&uuml;gen:<\/p>\n<pre>TempVars.Add \"Name\", \"Wert\"<\/pre>\n<p>Um einen Wert wieder auszulesen, verwenden Sie einfach den Namen des Wertes als Parameter:<\/p>\n<pre><span style=\"color:blue;\">Debug.Print<\/span> TempVars(\"Name\")<\/pre>\n<p>Was ist der Clou Warum nicht einfach eine globale Variable verwenden Der gro&szlig;e Vorteil der <b>TempVars<\/b>-Auflistung ist, dass die darin enthaltenen Daten nicht beim Auftreten eines unbehandelten Laufzeitfehlers geleert werden &#8211; auch nicht, wenn Sie einen Zeiger auf eine Objektvariable als Wert &uuml;bergeben.<\/p>\n<h2>Speichern des Zeigers auf die Ribbondefinition per TempVar<\/h2>\n<p>Es hilft uns nun nicht weiter, wenn wir einfach die Objektvariable in der <b>TempVars<\/b>-Auflistung speichern und diese bei Bedarf wieder hervorholen, um deren <b>Invalidate<\/b>&#8211; oder <b>InvalidateControl<\/b>-Methode aufzurufen.<\/p>\n<p>Stattdessen speichern wir die Speicheradresse des mit dieser Objektvariablen verkn&uuml;pften Objekts in der <b>TempVars<\/b>-Auflistung. Die Speicheradresse eines Objekts liefert uns wiederum die Funktion <b>ObjPtr<\/b>, der Sie die Objektvariable als Parameter &uuml;bergeben:<\/p>\n<pre><span style=\"color:blue;\">Sub <\/span>onLoad_Main(ribbon<span style=\"color:blue;\"> As <\/span>IRibbonUI)\r\n     <span style=\"color:blue;\">Set<\/span> objRibbon_Main = ribbon\r\n     TempVars.Add \"objRibbon_Main\", ObjPtr(ribbon)\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p>Ob die Funktion <b>ObjPtr <\/b>tats&auml;chlich eine Speicheradresse liefert, k&ouml;nnen Sie auch am Beispiel der oben definierten Variablen <b>db <\/b>pr&uuml;fen:<\/p>\n<pre><span style=\"color:blue;\">Debug.Print<\/span> ObjPtr(db)<\/pre>\n<p>Wenn <b>db <\/b>leer ist, liefert dies den Wert <b>0<\/b>, anderenfalls eine Speicheradresse wie <b>618085052<\/b>.<\/p>\n<h2>Objektvariable wiederherstellen<\/h2>\n<p>Nun haben wir allerdings ein Problem: Wir k&ouml;nnen zwar mit der Funktion <b>ObjPtr <\/b>die Speicheradresse eines Objekts ermitteln, aber wie k&ouml;nnen wir das Objekt wiederherstellen, wenn es zwischenzeitlich geleert wurde<\/p>\n<p>Dazu nutzen wir die Prozedur aus Listing 1, die speziell f&uuml;r das Wiederherstellen von Objekten des Typs <b>IRibbonUI <\/b>aus <b>TempVars<\/b>-Auflistungen heraus programmiert wurde.<\/p>\n<pre><span style=\"color:blue;\">Private <\/span>Declare Sub CopyMemory Lib \"kernel32.dll\" Alias \"RtlMoveMemory\" (ByRef Destination<span style=\"color:blue;\"> As <\/span>Any, _\r\n     ByRef Source<span style=\"color:blue;\"> As <\/span>Any, ByVal Length<span style=\"color:blue;\"> As Long<\/span>)\r\n     \r\n<span style=\"color:blue;\">Public Sub <\/span>RebuildIRibbonUI(objRibbon<span style=\"color:blue;\"> As <\/span>IRibbonUI, strRibbon<span style=\"color:blue;\"> As String<\/span>)\r\n     <span style=\"color:blue;\">Dim <\/span>lngObject<span style=\"color:blue;\"> As Long<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>obj<span style=\"color:blue;\"> As Object<\/span>\r\n     lngObject = TempVars(strRibbon)\r\n     <span style=\"color:blue;\">If <\/span>lngObject &lt;&gt; 0<span style=\"color:blue;\"> Then<\/span>\r\n         CopyMemory obj, lngObject, 4&\r\n         <span style=\"color:blue;\">Set<\/span> objRibbon = obj\r\n         CopyMemory obj, 0&, 4&\r\n     <span style=\"color:blue;\">End If<\/span>\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 1: Prozedur zum Wiederherstellen einer IRibbonUI-Objektvariablen auf Basis ihrer Speicheradresse<\/span><\/b><\/p>\n<p>Hier sehen wir zun&auml;chst die Deklaration einer API-Funktion namens <b>CopyMemory<\/b>. Diese dient dem Kopieren von Speicherbereichen.<\/p>\n<p>Die Prozedur <b>RebuildIRibbonUI <\/b>erwartet zwei Parameter:<\/p>\n<ul>\n<li><b>objRibbon<\/b>: Objektvariable, die wiederhergestellt werden soll<\/li>\n<li><b>strRibbon<\/b>: Bezeichnung, unter dem die Speicheradresse in der <b>TempVars<\/b>-Auflistung gespeichert wurde<\/li>\n<\/ul>\n<p>Sie f&uuml;llt zun&auml;chst die Variable <b>lngObject <\/b>mit dem Wert, der f&uuml;r das Ribbon namens <b>strRibbon <\/b>in der <b>TempVars<\/b>-Auflistung gespeichert wurde und pr&uuml;ft, ob diese ungleich <b>0 <\/b>ist. Ist das der Fall, kopiert sie die Speicheradresse aus <b>lngObject <\/b>in die Variable <b>obj<\/b>.<\/p>\n<p>Dann weist sie <b>obj <\/b>der wiederherzustellenden Variablen <b>objRibbon <\/b>zu. Anschlie&szlig;end leert sie noch den Inhalt von <b>obj<\/b>. Damit ist die Variable, die mit dem Parameter <b>objRibbon <\/b>&uuml;bergeben wurde, wiederhergestellt.<\/p>\n<h2>Aufruf der Prozedur zum Wiederherstellen der Objektvariable<\/h2>\n<p>Das Zuweisen des frisch erstellten <b>IRibbonUI<\/b>-Objekts in ein neues Objekt der <b>TempVars<\/b>-Auflistung haben wir ja bereits erledigt. Nun wollen wir sicherstellen, dass beim Zugriff auf die Objektvariable zum Zwecke des Aufrufs der Methode <b>Invalidate <\/b>kein Fehler ausgel&ouml;st wird, weil die Objektvariable <b>objRibbon_Main <\/b>zwischenzeitlich gel&ouml;scht wurde. Deshalb pr&uuml;fen wir in der Prozedur, welche die <b>Invalidate<\/b>-Methode aufruft, zuvor, ob <b>objRibbon_Main <\/b>den Wert <b>Nothing <\/b>aufweist.<\/p>\n<p>Ist das der Fall, rufen wir die Prozedur <b>RebuildIRibbonUI <\/b>auf und &uuml;bergeben als ersten Parameter die Objektvariable <b>objRibbon_Main <\/b>und als zweiten die Bezeichnung, unter der wir die Speicheradresse in der <b>TempVars<\/b>-Auflistung gespeichert haben.<\/p>\n<p>Erst danach rufen wir die <b>Invalidate<\/b>-Methode von <b>objRibbon_Main <\/b>auf:<\/p>\n<pre><span style=\"color:blue;\">Public Sub <\/span>BeispielbuttonAktivieren()\r\n     bolEnabled = <span style=\"color:blue;\">True<\/span>\r\n     <span style=\"color:blue;\">If <\/span>objRibbon_Main Is Nothing<span style=\"color:blue;\"> Then<\/span>\r\n         RebuildIRibbonUI objRibbon_Main, \"objRibbon_Main\"\r\n     <span style=\"color:blue;\">End If<\/span>\r\n     objRibbon_Main.Invalidate\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p>Die Prozedur zum Deaktivieren statten wir mit der gleichen Erweiterung aus:<\/p>\n<pre><span style=\"color:blue;\">Public Sub <\/span>BeispielbuttonDeaktivieren()\r\n     bolEnabled = <span style=\"color:blue;\">False<\/span>\r\n     <span style=\"color:blue;\">If <\/span>objRibbon_Main Is Nothing<span style=\"color:blue;\"> Then<\/span>\r\n         RebuildIRibbonUI objRibbon_Main, \"objRibbon_Main\"\r\n     <span style=\"color:blue;\">End If<\/span>\r\n     objRibbon_Main.Invalidate\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p>Ob dies nun funktioniert, finden wir erst heraus, wenn wir die Prozeduren vor und nach dem Ausl&ouml;sen eines nicht behandelten Laufzeitfehlers ausf&uuml;hren.<\/p>\n<p>Dies gelingt reibungslos &#8211; unsere L&ouml;sung l&auml;sst unserer Anwendung also Laufzeitfehler durchgehen und kann anschlie&szlig;end noch das <b>IRibbonUI<\/b>-Objekt wiederherstellen.<\/p>\n<h2>Einfacherer Zugriff auf die Wiederherstellung<\/h2>\n<p>Sie sehen oben schon, dass wir f&uuml;r den Einbau der Wiederherstellung an jeder Stelle, an der wir auf das <b>IRibbonUI<\/b>-Objekt zugreifen, zus&auml;tzliche Zeilen einf&uuml;gen m&uuml;ssen. Das wollen wir m&ouml;glichst minimieren, also bauen wir noch einen kleinen Workaround.<\/p>\n<p>Dazu erstellen wie eine &ouml;ffentliche <b>Property Get<\/b>-Prozedur:<\/p>\n<pre><span style=\"color:blue;\">Public Property Get <\/span>GetObjRibbon_Main()<span style=\"color:blue;\"> As <\/span>IRibbonUI\r\n     <span style=\"color:blue;\">If <\/span>objRibbon_Main Is Nothing<span style=\"color:blue;\"> Then<\/span>\r\n         RebuildIRibbonUI objRibbon_Main, \"objRibbon_Main\"\r\n     <span style=\"color:blue;\">End If<\/span>\r\n     <span style=\"color:blue;\">Set<\/span> GetObjRibbon_Main = objRibbon_Main\r\n<span style=\"color:blue;\">End Property<\/span><\/pre>\n<p>Auf diese greifen wir dann von &uuml;berall dort zu, wo wir auf das mit der Variablen <b>objRibbon_Main <\/b>gespeicherte Ribbon zugreifen wollen, beispielsweise um die <b>Invali-date<\/b>-Methode aufzurufen. Die beiden Prozeduren von oben vereinfachen wir dann wie folgt:<\/p>\n<pre><span style=\"color:blue;\">Public Sub <\/span>BeispielbuttonAktivieren()\r\n     bolEnabled = <span style=\"color:blue;\">True<\/span>\r\n     GetObjRibbon_Main.Invalidate\r\n<span style=\"color:blue;\">End Sub<\/span>\r\n<span style=\"color:blue;\">Public Sub <\/span>BeispielbuttonDeaktivieren()\r\n     bolEnabled = <span style=\"color:blue;\">False<\/span>\r\n     GetObjRibbon_Main.Invalidate\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<h2>Zusammenfassung und Ausblick<\/h2>\n<p>Dieser Beitrag zeigt eine Technik, mit der Sie verhindern k&ouml;nnen, dass Zugriffe auf <b>IRibbonUI<\/b>-Objektvariablen nach unbehandelten Laufzeitfehlern nicht zu weiteren Fehlern f&uuml;hren. Die Anpassungen sind auch f&uuml;r bereits vorhandene Anwendungen &uuml;berschaubar.<\/p>\n<h2>Downloads zu diesem Beitrag<\/h2>\n<p>Enthaltene Beispieldateien:<\/p>\n<p>RibbonvariableFehlersicherMachen.accdb<\/p>\n<p><a href=\"..\/fileadmin\/beispiele\/C4DE3FCD-9231-4E3B-A898-528748FC805C\/aiu_1331.zip\">Download<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>In VBA-Projekten von Access-Datenbanken (und in VBA im Allgemeinen) gibt es das Problem, dass das Auftreten von unbehandelten Laufzeitfehlern dazu f&uuml;hrt, dass Objektvariablen geleert werden. Das ist insbesondere dann nachteilig, wenn Sie mit dem Ribbon arbeiten und dieses zwischendurch mit der Invalidate-Methode ung&uuml;ltig machen m&uuml;ssen, damit die Attribute mit get&#8230;-Prozeduren erneut eingelesen werden k&ouml;nnen. Der Aufruf von Invalidate f&uuml;hrt dann unweigerlich zu einem Laufzeitfehler. Dieser Beitrag beschreibt das grundlegende Beispiel und liefert eine L&ouml;sung, mit der Sie sich keine Sorgen mehr um Objektvariablen machen m&uuml;ssen, die durch Laufzeitfehler geleert werden.<\/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":[662021,66062021,44000028],"tags":[],"class_list":["post-55001331","post","type-post","status-publish","format-standard","hentry","category-662021","category-66062021","category-Ergonomie_und_Benutzeroberflaeche"],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v20.9 (Yoast SEO v27.3) - https:\/\/yoast.com\/product\/yoast-seo-premium-wordpress\/ -->\n<title>Ribbonvariable fehlerresistent machen - 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\/Ribbonvariable_fehlerresistent_machen\/\" \/>\n<meta property=\"og:locale\" content=\"de_DE\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Ribbonvariable fehlerresistent machen\" \/>\n<meta property=\"og:description\" content=\"In VBA-Projekten von Access-Datenbanken (und in VBA im Allgemeinen) gibt es das Problem, dass das Auftreten von unbehandelten Laufzeitfehlern dazu f&uuml;hrt, dass Objektvariablen geleert werden. Das ist insbesondere dann nachteilig, wenn Sie mit dem Ribbon arbeiten und dieses zwischendurch mit der Invalidate-Methode ung&uuml;ltig machen m&uuml;ssen, damit die Attribute mit get...-Prozeduren erneut eingelesen werden k&ouml;nnen. Der Aufruf von Invalidate f&uuml;hrt dann unweigerlich zu einem Laufzeitfehler. Dieser Beitrag beschreibt das grundlegende Beispiel und liefert eine L&ouml;sung, mit der Sie sich keine Sorgen mehr um Objektvariablen machen m&uuml;ssen, die durch Laufzeitfehler geleert werden.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/access-im-unternehmen.de\/Ribbonvariable_fehlerresistent_machen\/\" \/>\n<meta property=\"og:site_name\" content=\"Access im Unternehmen\" \/>\n<meta property=\"article:published_time\" content=\"2021-12-10T07:39:29+00:00\" \/>\n<meta property=\"og:image\" content=\"http:\/\/vg07.met.vgwort.de\/na\/6713e6d4cbc447ec90d08bd460041009\" \/>\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=\"11\u00a0Minuten\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Ribbonvariable_fehlerresistent_machen\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Ribbonvariable_fehlerresistent_machen\\\/\"},\"author\":{\"name\":\"Andr\u00e9 Minhorst\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#\\\/schema\\\/person\\\/13395c4bcd7d7963efe33be9c584d93f\"},\"headline\":\"Ribbonvariable fehlerresistent machen\",\"datePublished\":\"2021-12-10T07:39:29+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Ribbonvariable_fehlerresistent_machen\\\/\"},\"wordCount\":1837,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#organization\"},\"image\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Ribbonvariable_fehlerresistent_machen\\\/#primaryimage\"},\"thumbnailUrl\":\"http:\\\/\\\/vg07.met.vgwort.de\\\/na\\\/6713e6d4cbc447ec90d08bd460041009\",\"articleSection\":[\"2021\",\"6\\\/2021\",\"Ergonomie und Benutzeroberfl\u00e4che\"],\"inLanguage\":\"de\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/access-im-unternehmen.de\\\/Ribbonvariable_fehlerresistent_machen\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Ribbonvariable_fehlerresistent_machen\\\/\",\"url\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Ribbonvariable_fehlerresistent_machen\\\/\",\"name\":\"Ribbonvariable fehlerresistent machen - Access im Unternehmen\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Ribbonvariable_fehlerresistent_machen\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Ribbonvariable_fehlerresistent_machen\\\/#primaryimage\"},\"thumbnailUrl\":\"http:\\\/\\\/vg07.met.vgwort.de\\\/na\\\/6713e6d4cbc447ec90d08bd460041009\",\"datePublished\":\"2021-12-10T07:39:29+00:00\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Ribbonvariable_fehlerresistent_machen\\\/#breadcrumb\"},\"inLanguage\":\"de\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/access-im-unternehmen.de\\\/Ribbonvariable_fehlerresistent_machen\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"de\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Ribbonvariable_fehlerresistent_machen\\\/#primaryimage\",\"url\":\"http:\\\/\\\/vg07.met.vgwort.de\\\/na\\\/6713e6d4cbc447ec90d08bd460041009\",\"contentUrl\":\"http:\\\/\\\/vg07.met.vgwort.de\\\/na\\\/6713e6d4cbc447ec90d08bd460041009\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Ribbonvariable_fehlerresistent_machen\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/access-im-unternehmen.de\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Ribbonvariable fehlerresistent machen\"}]},{\"@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":"Ribbonvariable fehlerresistent machen - 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\/Ribbonvariable_fehlerresistent_machen\/","og_locale":"de_DE","og_type":"article","og_title":"Ribbonvariable fehlerresistent machen","og_description":"In VBA-Projekten von Access-Datenbanken (und in VBA im Allgemeinen) gibt es das Problem, dass das Auftreten von unbehandelten Laufzeitfehlern dazu f&uuml;hrt, dass Objektvariablen geleert werden. Das ist insbesondere dann nachteilig, wenn Sie mit dem Ribbon arbeiten und dieses zwischendurch mit der Invalidate-Methode ung&uuml;ltig machen m&uuml;ssen, damit die Attribute mit get...-Prozeduren erneut eingelesen werden k&ouml;nnen. Der Aufruf von Invalidate f&uuml;hrt dann unweigerlich zu einem Laufzeitfehler. Dieser Beitrag beschreibt das grundlegende Beispiel und liefert eine L&ouml;sung, mit der Sie sich keine Sorgen mehr um Objektvariablen machen m&uuml;ssen, die durch Laufzeitfehler geleert werden.","og_url":"https:\/\/access-im-unternehmen.de\/Ribbonvariable_fehlerresistent_machen\/","og_site_name":"Access im Unternehmen","article_published_time":"2021-12-10T07:39:29+00:00","og_image":[{"url":"http:\/\/vg07.met.vgwort.de\/na\/6713e6d4cbc447ec90d08bd460041009","type":"","width":"","height":""}],"author":"Andr\u00e9 Minhorst","twitter_card":"summary_large_image","twitter_misc":{"Verfasst von":"Andr\u00e9 Minhorst","Gesch\u00e4tzte Lesezeit":"11\u00a0Minuten"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/access-im-unternehmen.de\/Ribbonvariable_fehlerresistent_machen\/#article","isPartOf":{"@id":"https:\/\/access-im-unternehmen.de\/Ribbonvariable_fehlerresistent_machen\/"},"author":{"name":"Andr\u00e9 Minhorst","@id":"https:\/\/access-im-unternehmen.de\/#\/schema\/person\/13395c4bcd7d7963efe33be9c584d93f"},"headline":"Ribbonvariable fehlerresistent machen","datePublished":"2021-12-10T07:39:29+00:00","mainEntityOfPage":{"@id":"https:\/\/access-im-unternehmen.de\/Ribbonvariable_fehlerresistent_machen\/"},"wordCount":1837,"commentCount":0,"publisher":{"@id":"https:\/\/access-im-unternehmen.de\/#organization"},"image":{"@id":"https:\/\/access-im-unternehmen.de\/Ribbonvariable_fehlerresistent_machen\/#primaryimage"},"thumbnailUrl":"http:\/\/vg07.met.vgwort.de\/na\/6713e6d4cbc447ec90d08bd460041009","articleSection":["2021","6\/2021","Ergonomie und Benutzeroberfl\u00e4che"],"inLanguage":"de","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/access-im-unternehmen.de\/Ribbonvariable_fehlerresistent_machen\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/access-im-unternehmen.de\/Ribbonvariable_fehlerresistent_machen\/","url":"https:\/\/access-im-unternehmen.de\/Ribbonvariable_fehlerresistent_machen\/","name":"Ribbonvariable fehlerresistent machen - Access im Unternehmen","isPartOf":{"@id":"https:\/\/access-im-unternehmen.de\/#website"},"primaryImageOfPage":{"@id":"https:\/\/access-im-unternehmen.de\/Ribbonvariable_fehlerresistent_machen\/#primaryimage"},"image":{"@id":"https:\/\/access-im-unternehmen.de\/Ribbonvariable_fehlerresistent_machen\/#primaryimage"},"thumbnailUrl":"http:\/\/vg07.met.vgwort.de\/na\/6713e6d4cbc447ec90d08bd460041009","datePublished":"2021-12-10T07:39:29+00:00","breadcrumb":{"@id":"https:\/\/access-im-unternehmen.de\/Ribbonvariable_fehlerresistent_machen\/#breadcrumb"},"inLanguage":"de","potentialAction":[{"@type":"ReadAction","target":["https:\/\/access-im-unternehmen.de\/Ribbonvariable_fehlerresistent_machen\/"]}]},{"@type":"ImageObject","inLanguage":"de","@id":"https:\/\/access-im-unternehmen.de\/Ribbonvariable_fehlerresistent_machen\/#primaryimage","url":"http:\/\/vg07.met.vgwort.de\/na\/6713e6d4cbc447ec90d08bd460041009","contentUrl":"http:\/\/vg07.met.vgwort.de\/na\/6713e6d4cbc447ec90d08bd460041009"},{"@type":"BreadcrumbList","@id":"https:\/\/access-im-unternehmen.de\/Ribbonvariable_fehlerresistent_machen\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/access-im-unternehmen.de\/"},{"@type":"ListItem","position":2,"name":"Ribbonvariable fehlerresistent machen"}]},{"@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\/55001331","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=55001331"}],"version-history":[{"count":0,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/posts\/55001331\/revisions"}],"wp:attachment":[{"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/media?parent=55001331"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/categories?post=55001331"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/tags?post=55001331"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}