{"id":55000620,"date":"2008-08-01T00:00:00","date_gmt":"2020-05-06T15:19:05","guid":{"rendered":"http:\/\/access-im-unternehmen.aix-dev.de\/aiu\/?p=620"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-30T00:00:00","slug":"Effizientes_Codieren","status":"publish","type":"post","link":"https:\/\/access-im-unternehmen.de\/Effizientes_Codieren\/","title":{"rendered":"Effizientes Codieren"},"content":{"rendered":"<p><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/vg06.met.vgwort.de\/na\/2eb90918bbea4d6a914d741b75dab89b\" width=\"1\" height=\"1\" alt=\"\"><\/p>\n<p><b>Wer gut zu wartenden und lesbaren Code schreiben m&ouml;chte, der &uuml;berdies m&ouml;glichst wenig fehleranf&auml;llig sein soll, braucht keine dicken B&uuml;cher zu studieren. Dieser Beitrag zeigt einige einfache M&ouml;glichkeiten, die Qualit&auml;t seines Codes zu verbessern.<\/b><\/p>\n<p class=\"zwischen-berschrift-oberer-spaltenrand\">Explizite Deklaration<\/p>\n<p>Im Auslieferungszustand brauchen Sie unter Access keine Variable zu deklarieren. Das hei&szlig;t, Sie k&ouml;nnen einer Variablen <b>strText <\/b>einfach einen Text zuweisen, ohne dass eine Deklaration vonn&ouml;ten w&auml;re:<\/p>\n<pre>strText = &quot;Beispieltext&quot;<\/pre>\n<p>Diesen Text verarbeiten Sie dann sp&auml;ter, indem Sie beispielsweise eine der Zeichenketten-Funktionen von VBA darauf loslassen.<\/p>\n<p>Da die Variable aber nicht deklariert ist, k&ouml;nnen Sie ihr auch jegliche andere Information zuweisen &#8211; so auch Verweise auf Objekte wie etwa ein <b>Database<\/b>-Objekt:<\/p>\n<pre>Set strText = CurrentDB<\/pre>\n<p>Wenn man <b>strText <\/b>sp&auml;ter mit einer der Zeichenketten-Funktionen untersuchen m&ouml;chte, l&ouml;st dies nat&uuml;rlich einen Fehler aus.<\/p>\n<p>Dies passiert sicher nicht, wenn der VBA-Editor Sie zwingt, alle Variablen unter Angabe des Datentyps zu deklarieren. Dreh- und Angelpunkt ist eine einfache Anweisung, die Sie im Kopf des Moduls platzieren:<\/p>\n<pre>Option Explicit<\/pre>\n<p>Nicht deklarierte Variablen f&uuml;hren beim Kompilieren der Anwendung nun zu einem Laufzeitfehler. Wenn Sie sicherstellen m&ouml;chten, dass die <b>Option Explicit<\/b>-Anweisung automatisch hinzugef&uuml;gt wird, wenn Sie ein neues Modul anlegen, brauchen Sie nur die Option <b>Variablendeklaration erforderlich <\/b>im Optionen-Dialog des VBA-Editors (<b>Extras|Optionen<\/b>) zu aktivieren (siehe Bild 1).<\/p>\n<p><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2008_04\/Codieren-web-images\/pic001_opt.jpeg\" alt=\"pic001.tif\" \/><\/p>\n<p><b><span style=\"color:darkgrey\">Bild 1: Die Option Variablendeklaration erforderlich sorgt daf&uuml;r, dass jedes neue Modul automatisch die Zeile Option Explicit erh&auml;lt.<\/span><\/b><\/p>\n<h2>Variant vermeiden<\/h2>\n<p>Der Datentyp <b>Variant <\/b>ist der flexibelste aller Datentypen. Daf&uuml;r ben&ouml;tigt er aber auch eine Menge Speicherplatz. Er kann alle Datentypen aufnehmen, selbst Verweise auf Objekte, und zus&auml;tzlich &#8211; das macht diesen Datentyp &uuml;berhaupt so interessant &#8211; kann er als einziger Datentyp Werte wie <b>Null<\/b> oder <b>Empty <\/b>enthalten.<\/p>\n<p>Den <b>Variant<\/b>-Datentyp setzen Sie beispielsweise f&uuml;r die folgenden Zwecke ein:<\/p>\n<ul>\n<li class=\"aufz-hlung\">Sie wissen nicht, welchen Datentyps ein Wert ist.<\/li>\n<li class=\"aufz-hlung\">Sie m&uuml;ssen auf <b>Null <\/b>pr&uuml;fen. Das erledigen Sie mit der <b>IsNull<\/b>-Funktion. Beispiel:<\/li>\n<\/ul>\n<pre>If IsNull(DLookup(&quot;ID&quot;, &quot;tblKontakte&quot;, &quot;_\r\n    Nachname = &apos;Minhorst&apos;&quot;) Then\r\n    MsgBox &quot;Kein Datensatz gefunden.&quot;\r\nEnd If<\/pre>\n<ul>\n<li class=\"aufz-hlung\">Sie m&uuml;ssen pr&uuml;fen, ob eine Variable einen Wert enth&auml;lt. Diese Aufgabe &uuml;bernimmt die Funktion <b>IsMissing<\/b>. Einsatzort sind Prozeduren mit optionalen Parametern. Beispiel:<\/li>\n<\/ul>\n<pre>Public Sub TestAufEmpty(Optional var As _\r\n        Variant)\r\n    If IsMissing(var) Then\r\n        MsgBox &quot;Kein Parameter &uuml;bergeben.&quot;\r\n    End If\r\nEnd Sub<\/pre>\n<p>Nicht jedem ist bekannt, dass eine nicht explizit deklarierte Variable automatisch den Datentyp <b>Variant <\/b>erh&auml;lt. Das gilt beispielsweise f&uuml;r eine Deklaration wie diese:<\/p>\n<pre>Dim var<\/pre>\n<p>Das folgende Beispiel tritt ebenfalls immer wieder auf, wenn es um Probleme mit Variablen geht:<\/p>\n<pre>Dim str1, str2 As String<\/pre>\n<p>Es erhalten keinesfalls beide Variablen den Datentyp <b>String<\/b>, sondern nur <b>str2<\/b>. <b>str1 <\/b>wird hier als <b>Variant <\/b>deklariert. Sie k&ouml;nnen das mit der folgenden Routine pr&uuml;fen:<\/p>\n<pre>Public Sub VarOderNichtVar()\r\n    Dim str1, str2 As String\r\n    Debug.Print &quot;str1&quot;, VarType(str1), _\r\n        TypeName(str1)\r\n    Debug.Print &quot;str2&quot;, VarType(str2), _\r\n        TypeName(str2)\r\nEnd Sub<\/pre>\n<p>Im Direktfenster erscheint das folgende Ergebnis:<\/p>\n<pre>str1 0 Empty\r\nstr2 8 String<\/pre>\n<h2>Ordnung muss sein<\/h2>\n<p>Lesbaren und gut zu wartenden Code kann man unter zwei Aspekten betrachten. Die beiden unterscheiden sich dadurch, ob jemand anderes als Sie selbst jemals einen Blick auf Ihren Code werfen wird. Falls nicht, k&ouml;nnen Sie Ihre eigenen Regeln aufstellen &#8211; Hauptsache, Sie finden sich zurecht. Wenn aber, wie es Fachautoren zu diesem Thema ist, noch andere auf Ihren Code schauen und diesen auch noch verstehen oder gar anpassen sollen, gibt es gewisse Grundregeln, die Sie beachten sollten:<\/p>\n<ul>\n<li class=\"aufz-hlung\">Verwendung einer Namenskonvention<\/li>\n<li class=\"aufz-hlung\">Sprechende Bezeichnungen f&uuml;r Variablen und Routinen<\/li>\n<li class=\"aufz-hlung\">Optische Aufbereitung des Codes<\/li>\n<\/ul>\n<p>Die n&auml;chsten Abschnitte stellen diese Grundregeln vor, denen Sie zwar nicht folgen m&uuml;ssen, die aber die Kommunikation vereinfachen.<\/p>\n<h2>Verwendung einer Namenskonvention<\/h2>\n<p>Namenskonventionen sind ein treffliches Thema f&uuml;r Diskussionen. Dabei geht es meist gar nicht um die Namen selbst, sondern um die Pr&auml;fixe. Es gibt zwar eine Notation namens <b>Reddick Naming Convention <\/b>(s. <b>http:\/\/www.xoc.net\/standards\/rvbanc.asp<\/b>), aber l&auml;ngst nicht alle Entwickler verwenden diese.<\/p>\n<p>Manche verzichten aus Nachl&auml;ssigkeit einfach ganz auf Pr&auml;fixe, andere bringen eigene Konventionen von anderen Programmiersprachen mit. Letztlich hat sich auch die <b>Reddick Naming Convention <\/b>nicht zu hundert Prozent durchgesetzt, aber immerhin verwenden Entwickler die g&auml;ngigen Pr&auml;fixe wie etwa <b>str <\/b>f&uuml;r eine String-Variable.<\/p>\n<p>Da wir hier &uuml;ber VBA sprechen, fallen die Access-Objekte und darin enthaltene Steuerelemente weg; bleibt also alles, was sich so im Codefenster herumtreibt. VBA-Routinen versieht niemand mit einem Pr&auml;fix. Hin und wieder tauchen Funktionen mit vorangestelltem <b>fct <\/b>oder<b> fu <\/b>auf, aber das ist eher die Ausnahme.<\/p>\n<p>Bleiben die Variablen: Die Basistypen sollten Sie grunds&auml;tzlich mit einem Pr&auml;fix entsprechend der Reddick-Konvention ausstatten, allein damit man den Datentyp erkennen kann, ohne in l&auml;ngeren Prozeduren immer zum Deklarationsbereich der Prozedur oder des Moduls wandern zu m&uuml;ssen.<\/p>\n<p>Ein interessantes Thema ist die Benennung von Objektvariablen, etwa f&uuml;r den Verweis auf Formulare, Berichte, Steuerelemente, Klassen oder auch externe Objekte wie etwa Anwendungen (Excel, Word, Outlook et cetera) und deren Elemente.<\/p>\n<p>Objektverweise auf andere Anwendungen nennt man &#8211; am Beispiel von Excel &#8211; zum Beispiel <b>objExcel <\/b>oder einfach <b>xls<\/b>:<\/p>\n<pre>Dim objExcel As Excel.Application<\/pre>\n<p>Auch f&uuml;r die Benennung der Objekte externer Anwendungen gibt es mehrere Alternativen: Entweder Sie benutzen, wenn das Objekt nur einmal in einer Routine vorkommt, das Pr&auml;fix <b>obj <\/b>plus den Objektnamen, also beispielsweise <b>objRange<\/b>, oder deuten zumindest die Stammanwendung an, indem Sie statt des <b>obj <\/b>ein <b>xls <\/b>voranstellen (<b>xlsRange<\/b>).<\/p>\n<p>Die meisten werden auch die Bezeichnung <b>rng <\/b>zuordnen k&ouml;nnen. Wenn es mehrere gleichartige Objekte im Code gibt, sollte man ein wenig detaillierter auf die jeweilige Verwendung eingehen und ein von der Objektart abh&auml;ngiges K&uuml;rzel mit einem weiteren Ausdruck verwenden (f&uuml;r <b>Range <\/b>also beispielsweise <b>rngZiel<\/b>).<\/p>\n<p class=\"zwischen-berschrift-oberer-spaltenrand\">Pr&auml;fixe f&uuml;r Steuerelemente<\/p>\n<p>Wenn Sie im Code Steuerelemente referenzieren, haben Sie auf zwei Arten zur Wahl. Entweder Sie verweisen direkt auf die Steuerelemente im Formular oder im Bericht oder Sie erzeugen Objektvariablen, in denen Sie den Verweis speichern.<\/p>\n<p>Im ersten Fall &uuml;bernehmen Sie schlicht die Bezeichnungen der Steuerelemente, beispielsweise so:<\/p>\n<pre>Debug.Print Me!txtBeispiel.Value<\/pre>\n<p>Im zweiten Fall brauchen Sie eine Objektvariable. Wenn Sie das dem Steuerelement entsprechende Pr&auml;fix und auch eine den Inhalt repr&auml;sentierende Bezeichnung verwenden m&ouml;chten, k&ouml;nnen Sie prinzipiell nur den Namen des Steuerelements als Variablennamen verwenden. Dies funktioniert ohne Probleme: Die folgende kleine Beispielroutine stammt aus einem Formular mit einem Textfeld namens <b>txtBeispiel<\/b>. Sie benennt die Variable f&uuml;r das Textfeld nach dem Namen des Steuerelements und weist diesem &uuml;ber den Objektverweis einen Wert zu:<\/p>\n<pre>Private Sub cmdTextfeldFuellen_Click()\r\n    Dim txtBeispiel As Access.TextBox\r\n    Set txtBeispiel = Me!txtBeispiel\r\n    txtBeispiel = &quot;Text&quot;\r\nEnd Sub<\/pre>\n<p><!--30percent--><\/p>\n<p>In diesem Fall macht dies nat&uuml;rlich nur wenig Sinn, denn Access erkennt die Eigenschaften der eingebauten Steuerelemente auch so.<\/p>\n<p>Die Programmierung eines TreeViews oder anderer externer Steuerelemente stellt sich jedoch unter Umst&auml;nden als unkomfortabel heraus, wenn man keine passenden Objektvariablen f&uuml;r sie deklariert, denn der VBA-Editor zeigt f&uuml;r direkte Verweise auf solche Objekte im Formular kein IntelliSense an.<\/p>\n<p>Ein Verweis darauf spart deshalb eine Menge Arbeit. Auch hier stellt sich aber die Frage, wie man die n&ouml;tige Objektvariable benennt. Ein TreeView-Steuerelement erh&auml;lt im Formular normalerweise einen Namen wie <b>ctlTreeView <\/b>oder, wenn es etwas genauer sein soll, zum Beispiel <b>tvwProjekte<\/b>.<\/p>\n<p>In Access im Unternehmen halten wir es bei solchen Steuerelementen, die in der Regel nur einmal je Formular auftauchen, meist so, dass wir das Steuerelement <b>ctlTreeView <\/b>nennen und eine darauf verweisende Objektvariable <b>objTreeView<\/b>.<\/p>\n<h2>Sprechende Bezeichnungen f&uuml;r Variablen und Routinen<\/h2>\n<p>Neben dem Pr&auml;fix ist der Name einer Variable &auml;u&szlig;erst wichtig. Sie und auch andere sollten mit einem Blick erkennen k&ouml;nnen, was die Variable f&uuml;r einen Wert speichert &#8211; und das zus&auml;tzlich zum Erkennen des Datentyps &uuml;ber das Pr&auml;fix. Negativbeispiele sind solche, die nur ein Pr&auml;fix und eine Zahl enthalten, also zum Beispiel <b>str1<\/b> und <b>str2<\/b>. Aussagekr&auml;ftig sind Variablennamen wie <b>lngAnzahlKontakte<\/b>.<\/p>\n<p>Genauso wichtig wie bei Variablen ist die sprechende Bezeichnung f&uuml;r Routinen, was gleicherma&szlig;en f&uuml;r <b>Sub<\/b>&#8211; und <b>Function<\/b>-Prozeduren gilt. Der Name sollte kurz und b&uuml;ndig beschreiben, was die Routine erledigt. Probleme beim Finden eines Routinennamens sind &uuml;brigens ein gutes Indiz daf&uuml;r, dass eine Routine zu viele Aufgaben erledigt &#8211; mehr dazu erfahren Sie weiter unten unter <b>Eine Routine pro Aufgabe<\/b>.<\/p>\n<p class=\"zwischen-berschrift-oberer-spaltenrand\">Englisch oder Deutsch<\/p>\n<p>Ob man englische oder deutsche Objekt-, Routinen- und Variablennamen verwendet, ist eine pers&ouml;nliche Entscheidung, wenn man nicht gerade Software f&uuml;r internationale Kunden entwickelt. Die Frage stellt sich, weil die Benutzeroberfl&auml;che einer Anwendung in der Regel in der jeweiligen Landessprache gehalten ist, w&auml;hrend Programmiersprachen immer englisch sind (wer Ausnahmen kennt, darf dies gern mitteilen!).<\/p>\n<p>Sie m&uuml;ssen also die Elemente, die sich zwischen Benutzeroberfl&auml;che und Programmiersprache befinden, irgendwo zwischen den beiden Sprachen einordnen. Manche gestalten bereits die Tabellen und Felder des Datenmodells in englischer Sprache, was sich nat&uuml;rlich im Quellcode und gar in den darin enthaltenen Kommentaren fortsetzt. Bei anderen findet man au&szlig;er den eingebauten Bezeichnungen etwa der Programmiersprache nur Texte in der Landessprache.<\/p>\n<h2>Optische Aufbereitung des Codes<\/h2>\n<p>Code ist nur schwer lesbar, wenn er keine Einr&uuml;ckungen enth&auml;lt und alle Zeilen am linken Rand beginnen. Das Einr&uuml;cken hierarchisch untergeordneter Elemente hat sich gl&uuml;cklicherweise fast &uuml;berall durchgesetzt. Und falls nicht, gibt es geeignete Tools, um dies automatisiert nachzuholen. Ein Beispiel daf&uuml;r ist der Indenter, den Sie unter <b>http:\/\/www.oaltd.co.uk\/Indenter\/Default.htm<\/b> finden. Er bietet zahlreiche Optionen, um die Einr&uuml;ckungen zu definieren (siehe Bild 2). Neben den Einr&uuml;ckungen kann man Code auch durch Leerzeilen lesbarer machen. So k&ouml;nnte man beispielsweise den Block mit der Deklaration, das Instanzieren von Objekten, das Leeren von Objekten und sonstige logisch zusammenh&auml;ngende Zeilen jeweils durch Leerzeilen voneinander trennen.<\/p>\n<p><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2008_04\/Codieren-web-images\/pic002_opt.jpeg\" alt=\"pic002.tif\" \/><\/p>\n<p><b><span style=\"color:darkgrey\">Bild 2: Optionen des Tools Smart Indenter, der Code automatisch einr&uuml;ckt<\/span><\/b><\/p>\n<p>Auch &uuml;berlange Zeilen sind manchmal ung&uuml;nstig. Am besten bringt man die Zeilen auf eine maximale L&auml;nge, die der Breite des Codefensters Ihres Entwicklungsrechners entspricht.<\/p>\n<h2>G&uuml;ltigkeitsbereich von Variablen<\/h2>\n<p>Eine Variable in den Kopf eines Standardmoduls zu schreiben und als <b>Public <\/b>zu deklarieren, ist bequem &#8211; immerhin steht diese Variable anschlie&szlig;end &uuml;berall zur Verf&uuml;gung. Aber weit gefehlt: Normalerweise handelt man sich mit so etwas leicht &auml;rger ein.<\/p>\n<p>Ausnahme sind einige wenige Anwendungsf&auml;lle, die einfach nicht ohne den Einsatz globaler Variablen auskommen. Der Grund f&uuml;r die Abneigung von Entwicklern gegen&uuml;ber globalen Variablen ist der, dass man diese nicht nur von &uuml;berall lesen, sondern auch von &uuml;berall ver&auml;ndern kann. Und wenn man nicht genau aufpasst und beispielsweise die gleiche Variable einmal global und einmal innerhalb einer Prozedur deklariert, kann es schnell zu Problemen kommen: beispielsweise dazu, dass man in der Routine der vermeintlich global deklarierten Variablen einen Wert zuweist, diesen aber in einer anderen Routine, die tats&auml;chlich auf diese globale Variable zugreift, nicht vorfindet.<\/p>\n<p>Der Grund ist, dass VBA lokale Variablen immer bevorzugt behandelt und beim Vorkommen einer globalen und einer lokalen Variable die lokale Variable verwendet.<\/p>\n<p>Dies gilt nicht nur f&uuml;r globale Variablen, sondern auch f&uuml;r solche, die modulweit g&uuml;ltig sind. Auch hier k&ouml;nnte eine innerhalb einer Routine im gleichen Modul deklarierte Variable gleichen Namens vorhanden sein, die zu Missverst&auml;ndnissen bei der Verwendung der Variablen f&uuml;hrt.<\/p>\n<p>Daher gilt prinzipiell folgende Regel: Deklarieren Sie Variablen immer f&uuml;r den kleinstm&ouml;glichen G&uuml;ltigkeitsbereich. Wenn Sie eine Variable nur innerhalb einer Prozedur brauchen, dann hat ihre Deklaration nichts im Modulkopf zu suchen und sie sollte erst recht nicht global g&uuml;ltig sein.<\/p>\n<p>Wenn Sie einmal eine Variable in mehr als einer Routine brauchen, die auch tats&auml;chlich den gleichen Wert enth&auml;lt oder auf das gleiche Objekt verweist, dann gibt es sicher auch eine Abh&auml;ngigkeit zwischen den beiden Routinen, weil etwa die erste die zweite aufruft.<\/p>\n<p>In diesem Fall verzichten Sie dennoch auf eine modulweite Deklaration der Variablen, sondern legen diese in der aufrufenden Routine fest und &uuml;bergeben diese als Parameter an die andere Routine.<\/p>\n<h2>Eine Routine pro Aufgabe<\/h2>\n<p>Diese Zwischen&uuml;berschrift besagt nichts anderes, als dass Sie auf einen modularen Aufbau bei der Programmierung von Routinen achten sollen. Weiter oben wurde erw&auml;hnt, dass die Aufteilung Ihres Codes auf die einzelnen Routinen ung&uuml;nstig sein k&ouml;nnte, wenn Sie f&uuml;r eine Routine keinen einfachen Namen finden, der mit einem Substantiv und einem Verb erl&auml;utern kann, was in der Routine geschieht.<\/p>\n<p>Klar ist es nicht einfach, einen einfachen Namen f&uuml;r eine Routine zu finden, die alle Felder eines Formulars validiert, den Benutzer fragt, ob dieser den aktuellen Datensatz auch wirklich speichern m&ouml;chte, und anschlie&szlig;end noch eine Historie der ge&auml;nderten Daten mit Informationen f&uuml;llt.<\/p>\n<p>Wenn Sie solche Routinen einsetzen, gliedern Sie den Code einfach in drei weitere Routinen aus, <b>EingabeValidieren<\/b>, <b>AenderungBestaetigen <\/b>und <b>HistorieSchreiben<\/b>,<b> <\/b>und rufen diese von der eigentlichen Routine aus auf, wobei Sie <b>EingabeValidieren <\/b>und <b>AenderungBestaetigen <\/b>als Funktionen auslegen, die das Ergebnis der Validierung und die Antwort des Benutzers zur&uuml;ckliefern und abh&auml;ngig vom Ergebnis den jeweils n&auml;chsten Schritt aufrufen oder auch nicht.<\/p>\n<p>Und die Routine, in der dies alles geschieht, nennen Sie einfach nur <b>DatensatzSpeichern <\/b>(vorausgesetzt, der Name ist nicht ohnehin durch eine Ereignisprozedur wie <b>Form_BeforeUpdate <\/b>vorgegeben).<\/p>\n<p>Auf diese Weise haben Sie jedenfalls drei &uuml;berschaubare Routinen, deren Wartung einfacher als bei einer einzigen, gro&szlig;en Prozedur sein d&uuml;rfte. Au&szlig;erdem k&ouml;nnen Sie diese leicht kopieren und an anderer Stelle mit &auml;hnlichen Aufgaben einf&uuml;gen und anpassen.<\/p>\n<h2>Sprechende Einzeiler<\/h2>\n<p>Manchmal enth&auml;lt eine Zeile einen langen Ausdruck, der mehrere Funktionen miteinander kombiniert &#8211; beispielsweise <b>DLookup <\/b>zum Ermitteln eines Wertes einer Tabelle, gepaart mit ein paar Zeichenketten-Funktionen, um das Ergebnis den Anforderungen anzupassen.<\/p>\n<p>Solche Konstrukte lassen sich erstens schlecht debuggen und sind au&szlig;erdem schon wenige Tage nach der Erstellung vermutlich nur noch schlecht nachzuvollziehen.<\/p>\n<p>So etwas verhindert man in zwei Schritten: Erstens verteilt man die einzelnen Aufrufe auf mehrere Anweisungen &#8211; je eine pro verwendeter eingebauter Funktion.<\/p>\n<p>Zweitens kann man die so erzeugten Zeilen im Sinne optimaler Codelesbarkeit in eine Funktion auslagern, deren Name kurz angibt, was diese f&uuml;r ein Ergebnis liefert.<\/p>\n<h2>Eine Aufgabe pro Variable<\/h2>\n<p>Variablen sollten immer nur einem Zweck dienen beziehungsweise nur einen Wert enthalten.<\/p>\n<p>Es ist zum Beispiel gef&auml;hrlich, wenn Sie eine Z&auml;hlervariable <b>i <\/b>mehrmals innerhalb einer Routine verwenden.<\/p>\n<p>Es k&ouml;nnte beispielsweise passieren, dass die Variable zwischendurch nicht initialisiert wird (etwa durch Setzen auf 0) und die Routine im weiteren Verlauf Fehler liefert.<\/p>\n<p>Wenn Sie einer Variablen, wie oben empfohlen, einen eindeutigen Namen geben, der ihrem Zweck entspricht, werden Sie aber nur schwerlich in eine solche Situation geraten.<\/p>\n<p class=\"zwischen-berschrift-oberer-spaltenrand\">Eine Variable pro Aufgabe<\/p>\n<p>Im Gegensatz dazu sollten Sie, in Erg&auml;nzung zum Abschnitt <b>Sprechende Einzeiler<\/b>, so viele Variablen wie n&ouml;tig verwenden, um Zwischenergebnisse zu speichern. Oft gibt es Probleme bei der Durchf&uuml;hrung von Aktionsabfragen, deren SQL-Ausdruck im Code zusammengesetzt wird. Der Aufruf, zum Beispiel <b>CurrentDB.Execute &quot;INSERT INTO &#8230;&quot;<\/b>, steht dann in einer Zeile und ist somit fast unm&ouml;glich zu debuggen. Hier verwendet man eine Variable namens <b>strSQL<\/b>, der man zun&auml;chst den SQL-Ausdruck zuweist und die man anschlie&szlig;end wie folgt nutzt:<\/p>\n<pre>CurrentDB.Execute strSQL<\/pre>\n<p>Auf diese Weise k&ouml;nnen Sie bei Problemen einen Haltepunkt setzen, <b>strSQL <\/b>im Direktfenster ausgeben lassen, den Inhalt in die SQL-Ansicht einer neuen Abfrage eintragen und sich nach dem Ausf&uuml;hren eine exaktere Fehlermeldung und die fehlerhafte Stelle anzeigen lassen.<\/p>\n<h2>So klein wie m&ouml;glich, so gro&szlig; wie n&ouml;tig<\/h2>\n<p>Von der unn&ouml;tigen Verwendung des Variant-Datentyps haben wir schon oben abgeraten. Einer der Gr&uuml;nde war, dass er einfach &uuml;berdimensioniert f&uuml;r manche Zwecke ist. Das gilt aber auch f&uuml;r andere Variablentypen.<\/p>\n<p>Bei Datentypen wie Boolean, Datum, Text oder W&auml;hrung ist die Auswahl nicht so gro&szlig;, dass man Fehler machen kann, aber es gibt eine ganze Reihe numerischer Datentypen, die unterschiedlich gro&szlig;e Wertebereiche abdecken:<\/p>\n<ul>\n<li class=\"aufz-hlung\"><b>Byte<\/b>: 1 Byte, Zahl von 0 bis 255<\/li>\n<li class=\"aufz-hlung\"><b>Integer<\/b>: 2 Byte -32.768 bis 32.767 <\/li>\n<li class=\"aufz-hlung\"><b>Long<\/b>: 4 Byte -2.147.483.648 bis 2.147.483.647 <\/li>\n<li class=\"aufz-hlung\"><b>Single<\/b>: 4 Byte, -3,402823E38 bis -1,401298E-45 f&uuml;r negative Werte; 1,401298E-45 bis 3,402823E38 f&uuml;r positive Werte.<\/li>\n<li class=\"aufz-hlung\"><b>Double<\/b>: 8 Byte, -1,79769313486231E308 bis <\/p>\n<pre>-4,94065645841247E-324 f&uuml;r negative Werte; 4,94065645841247E-324 bis 1,79769313486232E308 f&uuml;r positive Werte<\/li>\r\n<li class=\"aufz-hlung\"><b>Decimal<\/b>: 14 Byte, +\/-79.228.162.514.264.\r\n337.593.543.950.335 ohne Dezimalzeichen;\r\n+\/-7,9228162514264337593543950335 mit 28 Nachkommastellen; die kleinste Zahl ungleich Null ist\r\n+\/-0,0000000000000000000000000001<\/li>\r\n<\/ul>\r\n<p>Wenn Sie eine numerische Variable deklarieren, sollten Sie zuvor ermitteln, welchen Wert die Variable maximal annimmt, eine gewisse Sicherheit hinzurechnen und dann einen der oben genannten numerischen Datentypen ausw&auml;hlen, dabei aber beachten, ob es sich grunds&auml;tzlich um eine Gleitkommazahl oder um eine Ganzzahl handeln soll.<\/pre>\n<h2>Code kommentieren<\/h2>\n<p>Wenn Sie, wie oben empfohlen, Ihre Routinen modular programmiert haben, also jede Routine nur eine Aufgabe erledigen lassen und Variablen und Routinen sinnvoll benennen, brauchen Sie vermutlich so gut wie keine Kommentare mehr.<\/p>\n<h2>ByVal und ByRef<\/h2>\n<p>Es gibt zwei M&ouml;glichkeiten f&uuml;r die &Uuml;bergabe von Parametern beim Aufruf von Routinen, die durch das Voranstellen eines der Ausdr&uuml;cke <b>ByVal <\/b>und <b>ByRef <\/b>angegeben werden k&ouml;nnen.<\/p>\n<p><b>ByVal <\/b>sorgt daf&uuml;r, dass nur der Wert an die aufgerufene Routine &uuml;bergeben wird. Wenn diese Routine dann &auml;nderungen an der Variablen, mit der dieser Wert &uuml;bergeben wurde, vornimmt, wirken sich diese nicht auf die aufrufende Routine aus.<\/p>\n<p><b>ByRef <\/b>&uuml;bergibt keinen konkreten Wert, sondern einen Verweis auf die Speicheradresse des Werts. Wenn die aufgerufene Routine dem Parameter einen neuen Wert zuweist, dann arbeitet auch die aufrufende Routine mit diesem Wert weiter.<\/p>\n<p>Wenn man dies nicht beachtet, sind unerwarteten Ergebnissen T&uuml;r und Tor ge&ouml;ffnet. Der Einsatz von <b>ByVal <\/b>ist allerdings auch nicht ganz unproblematisch: Wenn Sie wie in den folgenden beiden Routinen den Inhalt einer <b>Double<\/b>-Variablen an eine Routine &uuml;bergeben, die eine <b>Long<\/b>-Variable erwartet, erzeugt diese aus dem <b>Double<\/b>-Wert einen <b>Long<\/b>-Wert, in diesem Fall aus <b>1,5 <\/b>den Wert <b>2<\/b>.<\/p>\n<pre>Public Sub AufrufendeRoutine()\r\n    Dim dblZahl As Double\r\n    dblZahl = 1.5\r\n    Debug.Print dblZahl\r\n    AufgerufeneRoutine dblZahl\r\nEnd Sub\r\nPublic Sub AufgerufeneRoutine(ByVal lngZahl _\r\n        As Long)\r\n    Debug.Print lngZahl\r\nEnd Sub<\/pre>\n<p>Wenn Sie die Variable hier <b>ByRef <\/b>&uuml;bergeben, f&uuml;hrt das zu einem Laufzeitfehler (<b>Fehler beim Kompilieren: Argumenttyp ByRef unvertr&auml;glich<\/b>).<\/p>\n<p>Der Fehler ist verkraftbar, denn er l&auml;sst sich durch &auml;ndern des Datentyps entweder in der aufrufenden oder in der aufgerufenen Routine beheben. Dies d&uuml;rfte viel schneller gehen als die Suche nach dem logischen Fehler, den obiges Beispiel liefert.<\/p>\n<p>Die Gefahr, dass per <b>ByRef <\/b>&uuml;bergebene Werte ungewollt ge&auml;ndert werden und so zur aufrufenden Routine zur&uuml;ckgegeben werden, l&auml;sst sich mit einem Minimum an Disziplin erledigen.<\/p>\n<p>Dazu legen Sie einfach eine tempor&auml;re Variable an, der Sie direkt zu Beginn den Inhalt der &uuml;bergebenen Variablen zuweisen. Den Parameter verwenden Sie in der Folge gar nicht mehr, au&szlig;er Sie wollen den enthaltenen Wert bewusst &auml;ndern:<\/p>\n<pre>Public Sub AufgerufeneRoutine(ByRef dblZahl _\r\n        As Double)\r\n    Dim dblZahlTemp As Double\r\n    dblZahlTemp = dblZahl\r\n    Debug.Print dblZahlTemp\r\nEnd Sub<\/pre>\n","protected":false},"excerpt":{"rendered":"<p>Wer gut zu wartenden und lesbaren Code schreiben m&ouml;chte, der &uuml;berdies m&ouml;glichst wenig fehler-anf&auml;llig sein soll, braucht keine dicken B&uuml;cher zu studieren. Dieser Beitrag zeigt einige einfache M&ouml;glichkeiten, die Qualit&auml;t seines Codes zu verbessern.<\/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":[662008,66042008,44000025],"tags":[],"class_list":["post-55000620","post","type-post","status-publish","format-standard","hentry","category-662008","category-66042008","category-VBA_und_Programmiertechniken"],"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>Effizientes Codieren - 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\/Effizientes_Codieren\/\" \/>\n<meta property=\"og:locale\" content=\"de_DE\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Effizientes Codieren\" \/>\n<meta property=\"og:description\" content=\"Wer gut zu wartenden und lesbaren Code schreiben m&ouml;chte, der &uuml;berdies m&ouml;glichst wenig fehler-anf&auml;llig sein soll, braucht keine dicken B&uuml;cher zu studieren. Dieser Beitrag zeigt einige einfache M&ouml;glichkeiten, die Qualit&auml;t seines Codes zu verbessern.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/access-im-unternehmen.de\/Effizientes_Codieren\/\" \/>\n<meta property=\"og:site_name\" content=\"Access im Unternehmen\" \/>\n<meta property=\"article:published_time\" content=\"2020-05-06T15:19:05+00:00\" \/>\n<meta property=\"og:image\" content=\"http:\/\/vg06.met.vgwort.de\/na\/2eb90918bbea4d6a914d741b75dab89b\" \/>\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=\"17\u00a0Minuten\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Effizientes_Codieren\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Effizientes_Codieren\\\/\"},\"author\":{\"name\":\"Andr\u00e9 Minhorst\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#\\\/schema\\\/person\\\/13395c4bcd7d7963efe33be9c584d93f\"},\"headline\":\"Effizientes Codieren\",\"datePublished\":\"2020-05-06T15:19:05+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Effizientes_Codieren\\\/\"},\"wordCount\":3100,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#organization\"},\"image\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Effizientes_Codieren\\\/#primaryimage\"},\"thumbnailUrl\":\"http:\\\/\\\/vg06.met.vgwort.de\\\/na\\\/2eb90918bbea4d6a914d741b75dab89b\",\"articleSection\":[\"2008\",\"4\\\/2008\",\"VBA und Programmiertechniken\"],\"inLanguage\":\"de\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/access-im-unternehmen.de\\\/Effizientes_Codieren\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Effizientes_Codieren\\\/\",\"url\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Effizientes_Codieren\\\/\",\"name\":\"Effizientes Codieren - Access im Unternehmen\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Effizientes_Codieren\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Effizientes_Codieren\\\/#primaryimage\"},\"thumbnailUrl\":\"http:\\\/\\\/vg06.met.vgwort.de\\\/na\\\/2eb90918bbea4d6a914d741b75dab89b\",\"datePublished\":\"2020-05-06T15:19:05+00:00\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Effizientes_Codieren\\\/#breadcrumb\"},\"inLanguage\":\"de\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/access-im-unternehmen.de\\\/Effizientes_Codieren\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"de\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Effizientes_Codieren\\\/#primaryimage\",\"url\":\"http:\\\/\\\/vg06.met.vgwort.de\\\/na\\\/2eb90918bbea4d6a914d741b75dab89b\",\"contentUrl\":\"http:\\\/\\\/vg06.met.vgwort.de\\\/na\\\/2eb90918bbea4d6a914d741b75dab89b\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Effizientes_Codieren\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/access-im-unternehmen.de\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Effizientes Codieren\"}]},{\"@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":"Effizientes Codieren - 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\/Effizientes_Codieren\/","og_locale":"de_DE","og_type":"article","og_title":"Effizientes Codieren","og_description":"Wer gut zu wartenden und lesbaren Code schreiben m&ouml;chte, der &uuml;berdies m&ouml;glichst wenig fehler-anf&auml;llig sein soll, braucht keine dicken B&uuml;cher zu studieren. Dieser Beitrag zeigt einige einfache M&ouml;glichkeiten, die Qualit&auml;t seines Codes zu verbessern.","og_url":"https:\/\/access-im-unternehmen.de\/Effizientes_Codieren\/","og_site_name":"Access im Unternehmen","article_published_time":"2020-05-06T15:19:05+00:00","og_image":[{"url":"http:\/\/vg06.met.vgwort.de\/na\/2eb90918bbea4d6a914d741b75dab89b","type":"","width":"","height":""}],"author":"Andr\u00e9 Minhorst","twitter_card":"summary_large_image","twitter_misc":{"Verfasst von":"Andr\u00e9 Minhorst","Gesch\u00e4tzte Lesezeit":"17\u00a0Minuten"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/access-im-unternehmen.de\/Effizientes_Codieren\/#article","isPartOf":{"@id":"https:\/\/access-im-unternehmen.de\/Effizientes_Codieren\/"},"author":{"name":"Andr\u00e9 Minhorst","@id":"https:\/\/access-im-unternehmen.de\/#\/schema\/person\/13395c4bcd7d7963efe33be9c584d93f"},"headline":"Effizientes Codieren","datePublished":"2020-05-06T15:19:05+00:00","mainEntityOfPage":{"@id":"https:\/\/access-im-unternehmen.de\/Effizientes_Codieren\/"},"wordCount":3100,"commentCount":0,"publisher":{"@id":"https:\/\/access-im-unternehmen.de\/#organization"},"image":{"@id":"https:\/\/access-im-unternehmen.de\/Effizientes_Codieren\/#primaryimage"},"thumbnailUrl":"http:\/\/vg06.met.vgwort.de\/na\/2eb90918bbea4d6a914d741b75dab89b","articleSection":["2008","4\/2008","VBA und Programmiertechniken"],"inLanguage":"de","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/access-im-unternehmen.de\/Effizientes_Codieren\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/access-im-unternehmen.de\/Effizientes_Codieren\/","url":"https:\/\/access-im-unternehmen.de\/Effizientes_Codieren\/","name":"Effizientes Codieren - Access im Unternehmen","isPartOf":{"@id":"https:\/\/access-im-unternehmen.de\/#website"},"primaryImageOfPage":{"@id":"https:\/\/access-im-unternehmen.de\/Effizientes_Codieren\/#primaryimage"},"image":{"@id":"https:\/\/access-im-unternehmen.de\/Effizientes_Codieren\/#primaryimage"},"thumbnailUrl":"http:\/\/vg06.met.vgwort.de\/na\/2eb90918bbea4d6a914d741b75dab89b","datePublished":"2020-05-06T15:19:05+00:00","breadcrumb":{"@id":"https:\/\/access-im-unternehmen.de\/Effizientes_Codieren\/#breadcrumb"},"inLanguage":"de","potentialAction":[{"@type":"ReadAction","target":["https:\/\/access-im-unternehmen.de\/Effizientes_Codieren\/"]}]},{"@type":"ImageObject","inLanguage":"de","@id":"https:\/\/access-im-unternehmen.de\/Effizientes_Codieren\/#primaryimage","url":"http:\/\/vg06.met.vgwort.de\/na\/2eb90918bbea4d6a914d741b75dab89b","contentUrl":"http:\/\/vg06.met.vgwort.de\/na\/2eb90918bbea4d6a914d741b75dab89b"},{"@type":"BreadcrumbList","@id":"https:\/\/access-im-unternehmen.de\/Effizientes_Codieren\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/access-im-unternehmen.de\/"},{"@type":"ListItem","position":2,"name":"Effizientes Codieren"}]},{"@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\/55000620","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=55000620"}],"version-history":[{"count":0,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/posts\/55000620\/revisions"}],"wp:attachment":[{"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/media?parent=55000620"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/categories?post=55000620"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/tags?post=55000620"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}