{"id":55001515,"date":"2024-10-01T00:00:00","date_gmt":"2024-08-27T08:57:41","guid":{"rendered":"http:\/\/access-im-unternehmen.aix-dev.de\/aiu\/?p=1515"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-30T00:00:00","slug":"Zeilennummern_per_VBA_hinzufuegen","status":"publish","type":"post","link":"https:\/\/access-im-unternehmen.de\/Zeilennummern_per_VBA_hinzufuegen\/","title":{"rendered":"Zeilennummern per VBA hinzuf&uuml;gen"},"content":{"rendered":"<p><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/vg02.met.vgwort.de\/na\/a63bca05b10e4bdaa225ea8ca944f24c\" width=\"1\" height=\"1\" alt=\"\"><b>Wer eine wirklich professionelle Fehlerbehandlung zu seiner Access-Anwendung hinzuf&uuml;gen m&ouml;chte, kommt nicht um das Anlegen von Zeilennummern herum. Wenn man Zeilennummern festgelegt hat, kann man diese im Falle eines Fehlers mit der nicht dokumentierten Erl-Funktion auslesen. Das hei&szlig;t, dass wir neben der Fehlernummer und der Fehlerbeschreibung noch auf die Zeilennummer zur&uuml;ckgreifen k&ouml;nnen, um den Fehler zu lokalisieren. Dazu geh&ouml;rt allerdings auch, dass wir in der Fehlermeldung Informationen &uuml;ber das Modul und die Prozedur unterbringen, in denen der Fehler aufgetreten ist &#8211; doch dies l&auml;sst sich einfach realisieren. Sehr aufw&auml;ndig ist es hingegen, alle Prozeduren von umfangreichen Anwendungen mit Zeilennummern zu versehen. Um dies zu implementieren, nutzen wir die Bibliothek &#8222;Microsoft Visual Basic for Applications Extensibility 5.3&#8220;, die alle M&ouml;glichkeiten bietet, um auf die enthaltenen Module zuzugreifen und den Code automatisiert nach unseren W&uuml;nschen anzupassen.<\/b><\/p>\n<h2>Funktion zum Hinzuf&uuml;gen von Zeilennummern<\/h2>\n<p>Wichtig f&uuml;r die Fehlerbehandlung sind auch die Zeilennummern. Diese f&uuml;gen wir mit der Funktion <b>AddLineNumbers <\/b>zu einer Prozedur hinzu. Diese Prozedur statten wir mit den folgenden Parametern aus:<\/p>\n<ul>\n<li><b>strModule<\/b>: Name des Moduls, in dem sich die Prozedur befindet<\/li>\n<li><b>strProcedure<\/b>: Name der Prozedur, die mit Zeilennummern versehen werden soll<\/li>\n<\/ul>\n<p>Die Prozedur aus Listing 1 referenziert als Erstes das aktuelle VBA-Projekt und die mit <b>strModule <\/b>angegebene Komponente. Dazu holt sie sich &uuml;ber die <b>CodeModule<\/b>-Eigenschaft noch das passende <b>CodeModule<\/b>-Objekt, mit dem wir auf den Code zugreifen k&ouml;nnen. Mit <b>lngProcBodyLine <\/b>speichern wir die Zeile, in der die Prozedur aus <b>strProcedure <\/b>beginnt. Wir wollen nur die eigentlichen Anweisungen der Prozedur mit Zeilennummern versehen, also ermitteln wir die Nummer der ersten Zeile hinter dem Prozedurkopf und die Nummer der letzten Zeile vor der <b>End&#8230;<\/b>-Zeile der Prozedur. Dazu nutzen wir die beiden weiter hinten beschriebenen Funktionen <b>GetFirstStatementLineNumber <\/b>und <b>GetLastStatementLineNumber<\/b>.<\/p>\n<pre><span style=\"color:blue;\">Public Sub <\/span>AddLineNumbers(strModule<span style=\"color:blue;\"> As String<\/span>, strProcedure<span style=\"color:blue;\"> As String<\/span>)\r\n     <span style=\"color:blue;\">Dim <\/span>objVBProject<span style=\"color:blue;\"> As <\/span>VBIDE.VBProject\r\n     <span style=\"color:blue;\">Dim <\/span>objVBComponent<span style=\"color:blue;\"> As <\/span>VBIDE.VBComponent\r\n     <span style=\"color:blue;\">Dim <\/span>objCodemodule<span style=\"color:blue;\"> As <\/span>VBIDE.CodeModule\r\n     <span style=\"color:blue;\">Dim <\/span>intProcType<span style=\"color:blue;\"> As <\/span>vbext_ProcKind\r\n     <span style=\"color:blue;\">Dim <\/span>lngProcBodyLine<span style=\"color:blue;\"> As Long<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>lngFirstStatementLineNumber<span style=\"color:blue;\"> As Long<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>lngLastStatementLineNumber<span style=\"color:blue;\"> As Long<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>lngLine<span style=\"color:blue;\"> As Long<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>bolNumbers<span style=\"color:blue;\"> As Boolean<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>strLine<span style=\"color:blue;\"> As String<\/span>\r\n     <span style=\"color:blue;\">Set<\/span> objVBProject = VBE.ActiveVBProject\r\n     <span style=\"color:blue;\">Set<\/span> objVBComponent = objVBProject.VBComponents(strModule)\r\n     <span style=\"color:blue;\">Set<\/span> objCodemodule = objVBComponent.CodeModule\r\n     lngProcBodyLine = objCodemodule.ProcBodyLine(strProcedure, intProcType)\r\n     lngFirstStatementLineNumber = GetFirstStatementLineNumber(objCodemodule, lngProcBodyLine)\r\n     lngLastStatementLineNumber = GetLastStatementLineNumber(objCodemodule, lngProcBodyLine)\r\n     For lngLine = lngFirstStatementLineNumber To lngLastStatementLineNumber\r\n         strLine = left(objCodemodule.Lines(lngLine, 1), 6)\r\n         Select Case <span style=\"color:blue;\">True<\/span>\r\n             <span style=\"color:blue;\">Case <\/span>IsNumeric(strLine)\r\n                 bolNumbers = <span style=\"color:blue;\">True<\/span>\r\n                 <span style=\"color:blue;\">Exit For<\/span>\r\n         <span style=\"color:blue;\">End Select<\/span>\r\n     <span style=\"color:blue;\">Next<\/span> lngLine\r\n     <span style=\"color:blue;\">If <\/span>bolNumbers = <span style=\"color:blue;\">False<\/span><span style=\"color:blue;\"> Then<\/span>\r\n         For lngLine = lngFirstStatementLineNumber To lngLastStatementLineNumber\r\n             Select Case <span style=\"color:blue;\">True<\/span>\r\n                 <span style=\"color:blue;\">Case <\/span>left(<span style=\"color:blue;\">LTrim<\/span>(objCodemodule.Lines(lngLine, 1)), 5) = \"Case \"\r\n                     objCodemodule.ReplaceLine lngLine, Space(6) & objCodemodule.Lines(lngLine, 1)\r\n                 <span style=\"color:blue;\">Case <\/span>IsLabel(objCodemodule.Lines(lngLine, 1))\r\n                 <span style=\"color:blue;\">Case Else<\/span>\r\n                     objCodemodule.ReplaceLine lngLine, Format(lngLine, \"00000\") & \" \" & objCodemodule.Lines(lngLine, 1)\r\n             <span style=\"color:blue;\">End Select<\/span>\r\n         <span style=\"color:blue;\">Next<\/span> lngLine\r\n     <span style=\"color:blue;\">Else<\/span>\r\n         <span style=\"color:blue;\">MsgBox<\/span> \"Die Prozedur ''\" & strProcedure & \"'' aus Modul ''\" & strModule _\r\n             & \"'' scheint bereits Zeilennummern zu enthalten.\", vbOKOnly + vbInformation, \"Zeilennummern vorhanden\"\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 Hinzuf&uuml;gen von Zeilennummern zu einer Prozedur<\/span><\/b><\/p>\n<p>Die Prozedur durchl&auml;uft nun in einer ersten <b>For&#8230;Next<\/b>-Schleife alle Zeilen der Prozedur, um eventuell bereits mit Zeilennummern versehene Prozeduren zu erkennen. Findet sie w&auml;hrend dieses Durchlaufs in irgendeiner Zeile einen numerischen Wert in den ersten sechs Zeichen, wird die Variable <b>bolNumbers <\/b>auf <b>True <\/b>eingestellt und die Schleife verlassen. In diesem Fall legt die Prozedur keine neuen Zeilennummern an, sondern gibt eine entsprechende Meldung aus.<\/p>\n<p>Anderenfalls durchl&auml;uft die Prozedur alle Zeilen von der ersten Anweisung bis zur letzten Anweisung der mit Zeilennummern zu versehenden Routine. Dies geschieht in einer <b>For&#8230;Next<\/b>-Schleife mit der Laufvariablen <b>lngLine<\/b>.<\/p>\n<p>Innerhalb der Schleife pr&uuml;fen wir in einer <b>Select Case<\/b>-Bedingung, ob verschiedene Bedingungen den Wert <b>True <\/b>haben. Dazu weisen wir der <b>Select Case<\/b>-Anweisung das Kriterium <b>True <\/b>zu. Der erste der folgenden <b>Case<\/b>-Zweige, der den Wert <b>True <\/b>liefert, wird demzufolge angesteuert.<\/p>\n<p>Die erste Bedingung pr&uuml;ft, ob die um f&uuml;hrende und folgende Leerzeichen erleichterte aktuelle Zeile mit <b>Case <\/b>beginnt. <b>Case<\/b>-Zeilen sind eine der wenigen Zeilen, die nicht mit einer Zeilennummer versehen werden k&ouml;nnen. Eine <b>Case<\/b>-Zeile soll genau wie die nummerierten Zeilen um sechs Zeichen nach rechts einger&uuml;ckt werden, auch wenn diese nicht nummeriert wird. Auf diese Weise bleibt die Einr&uuml;ckung gegen&uuml;ber den nummerierten Zeilen erhalten.<\/p>\n<p>Um die Zeile um sechs Zeichen einzur&uuml;cken, verwenden wir die <b>ReplaceLine<\/b>-Anweisung des <b>CodeModule<\/b>-Objekts. Diese erwartet als ersten Parameter die Nummer der zu ersetzenden Zeile und als zweiten Parameter den neuen Inhalt der Zeile. Diesen stellen wir aus sechs mit der <b>Space<\/b>-Funktion ermittelten Leerzeichen und der vorherigen Zeile zusammen. Der zweite <b>Case<\/b>-Fall untersucht, ob es sich bei der Zeile um eine Sprungmarke handelt. Dazu verwendet sie die <b>IsLabel<\/b>-Funktion, welche die &uuml;bergebene Zeile untersucht. Diese Funktion stellen wir sp&auml;ter vor. Liefert <b>IsLabel <\/b>den Wert <b>True<\/b>, geschieht nichts weiter mit dieser Zeile. Sprungmarken sollten weder nummeriert noch einger&uuml;ckt werden (letzteres wird ohnehin wieder r&uuml;ckg&auml;ngig gemacht).<\/p>\n<p>Der <b>Case Else<\/b>-Zweig tritt f&uuml;r alle weiteren F&auml;lle ein. Dieser sorgt daf&uuml;r, dass die aktuelle Zeile durch eine neue Zeile ersetzt wird, die aus der aktuellen Zeilennummer im Format <b>00000<\/b>, einem Leerzeichen und der urspr&uuml;nglichen Zeile besteht. Warum als Format <b>00000<\/b>? Weil wir davon ausgehen, dass wir keine Module mit mehr als 99.999 Zeilen verwenden (falls doch, k&ouml;nnen Sie das Format und die Einr&uuml;ckungen so anpassen, dass diese mehr Stellen abdecken).<\/p>\n<p>Wenn wir die Zeilenzahl <b>123 <\/b>mit dem Format <b>00000 <\/b>einf&uuml;gen, wird daraus <b>123 <\/b>plus zwei folgende Leerzeichen. Aus <b>1 <\/b>wird <b>1 <\/b>plus vier folgende Leerzeichen. Es erfolgt also unabh&auml;ngig von der Stellenzahl der Zeilennummer eine konstante Einr&uuml;ckung. Auf diese Weise durchlaufen wir alle Zeilen von der ersten bis zur letzten Anweisung der angegebenen Prozedur.<\/p>\n<h2>Funktion zum Hinzuf&uuml;gen von Zeilennummern aufrufen<\/h2>\n<p>Um die Funktion <b>AddLineNumbers <\/b>aufzurufen, verwenden wir beispielsweise den folgenden Befehl:<\/p>\n<pre><span style=\"color:blue;\">Call<\/span> AddLineNumbers(\"mdlTest\", \"Test\")<\/pre>\n<p>Damit f&uuml;gen wir genau einer Prozedur Zeilennummern hinzu.<\/p>\n<h2>Zeilennummern zu allen Prozeduren eines Moduls hinzuf&uuml;gen<\/h2>\n<p>Gegebenenfalls wollen wir jedoch nicht nur einer, sondern allen Prozeduren eines Moduls Zeilennummern hinzuf&uuml;gen &#8211; oder vielleicht sogar allen Modulen des VBA-Projekts. Dazu bauen wir uns schnell ein paar Routinen. Die erste soll den Namen des Moduls entgegennehmen, deren Prozeduren mit Zeilennummerierungen versehen werden sollen (siehe Listing 2).<\/p>\n<pre><span style=\"color:blue;\">Public Sub <\/span>AddLineNumbersToModule(strModule<span style=\"color:blue;\"> As String<\/span>)\r\n     <span style=\"color:blue;\">Dim <\/span>objVBProject<span style=\"color:blue;\"> As <\/span>VBIDE.VBProject\r\n     <span style=\"color:blue;\">Dim <\/span>objVBComponent<span style=\"color:blue;\"> As <\/span>VBIDE.VBComponent\r\n     <span style=\"color:blue;\">Dim <\/span>objCodemodule<span style=\"color:blue;\"> As <\/span>VBIDE.CodeModule\r\n     <span style=\"color:blue;\">Dim <\/span>intProcType<span style=\"color:blue;\"> As <\/span>vbext_ProcKind\r\n     <span style=\"color:blue;\">Dim <\/span>lngCountOfLines<span style=\"color:blue;\"> As Long<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>lngLine<span style=\"color:blue;\"> As Long<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>strProcedure<span style=\"color:blue;\"> As String<\/span>\r\n     <span style=\"color:blue;\">Set<\/span> objVBProject = VBE.ActiveVBProject\r\n     <span style=\"color:blue;\">Set<\/span> objVBComponent = objVBProject.VBComponents(strModule)\r\n     <span style=\"color:blue;\">Set<\/span> objCodemodule = objVBComponent.CodeModule\r\n     lngCountOfLines = objCodemodule.CountOfLines\r\n     For lngLine = 1 To lngCountOfLines\r\n         <span style=\"color:blue;\">If <\/span><span style=\"color:blue;\">Not<\/span> strProcedure = objCodemodule.ProcOfLine(lngLine, intProcType)<span style=\"color:blue;\"> Then<\/span>\r\n             strProcedure = objCodemodule.ProcOfLine(lngLine, intProcType)\r\n             <span style=\"color:blue;\">Call<\/span> AddLineNumbers(strModule, strProcedure)\r\n         <span style=\"color:blue;\">End If<\/span>\r\n     <span style=\"color:blue;\">Next<\/span> lngLine\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 2: Prozedur zum Hinzuf&uuml;gen von Zeilennummern zu allen Prozeduren eines Moduls<\/span><\/b><\/p>\n<p>Sie referenziert &uuml;ber das <b>VBProject<\/b>-Objekt das <b>VBComponents<\/b>-Objekt f&uuml;r das Modul und verwendet dann das <b>CodeModule <\/b>dieses Objekts. Sie ermittelt die Anzahl der Zeilen des Moduls und durchl&auml;uft dann alle Zeilen des Moduls. Dabei vergleicht sie jeweils den Namen der Prozedur der aktuellen Zeile mit dem in <b>strProcedure <\/b>gespeicherten Namen.<\/p>\n<p>Diese ist zun&auml;chst leer. Sobald die Routine auf die erste Prozedur st&ouml;&szlig;t, wird der Name der Prozedur in <b>strProcedure <\/b>geschrieben und die Prozedur <b>AddLineNumber<\/b> wird f&uuml;r dieses Modul und diese Prozedur aufgerufen. Auf diese Weise durchl&auml;uft die Prozedur <b>AddLineNumbersToModule <\/b>alle Prozeduren des Moduls:<\/p>\n<h2>Zeilennummern zu allen Prozeduren des VBA-Projekts hinzuf&uuml;gen<\/h2>\n<p>Schlie&szlig;lich schauen wir uns noch an, wie wir allen Prozeduren in allen Modulen eines VBA-Projekts Zeilennummern hinzuf&uuml;gen k&ouml;nnen. Dazu schreiben wir eine weitere Prozedur, welche wiederum die Prozedur <b>AddLineNumbersToModule <\/b>aufruft:<\/p>\n<pre><span style=\"color:blue;\">Public Sub <\/span>AddLineNumbersToActiveVBProject()\r\n     <span style=\"color:blue;\">Dim <\/span>objVBProject<span style=\"color:blue;\"> As <\/span>VBIDE.VBProject\r\n     <span style=\"color:blue;\">Dim <\/span>objVBComponent<span style=\"color:blue;\"> As <\/span>VBIDE.VBComponent\r\n     <span style=\"color:blue;\">Set<\/span> objVBProject = VBE.ActiveVBProject\r\n     For Each objVBComponent In objVBProject.VBComponents\r\n         <span style=\"color:blue;\">Call<\/span> AddLineNumbersToModule(objVBComponent.Name)\r\n     <span style=\"color:blue;\">Next<\/span> objVBComponent\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p>Die Prozedur referenziert das aktive VBA-Projekt und durchl&auml;uft alle Elemente der <b>VBComponents<\/b>-Auflistung, die sie dabei mit der Variablen <b>objVBComponent <\/b>referenziert. Sie ruft f&uuml;r jeden Schleifendurchlauf die Prozedur <b>AddLineNumbersToModule <\/b>mit dem Namen des aktuellen <b>VBComponent<\/b>-Objekts auf.<\/p>\n<h2>Funktion zum Entfernen von Zeilennummern aus einer Prozedur<\/h2>\n<p>Gegebenenfalls m&ouml;chte man auch einmal die Zeilennummern wieder entfernen. Beispielsweise dann, wenn man Zeilen zum Code hinzuf&uuml;gen oder entfernen will und nicht die Nummerierung von Hand anpassen m&ouml;chte.Dazu k&ouml;nnen wir die Prozedur <b>RemoveLineNumbers <\/b>aus Listing 3 nutzen.<\/p>\n<pre><span style=\"color:blue;\">Public Sub <\/span>RemoveLineNumbers(strModule<span style=\"color:blue;\"> As String<\/span>, strProcedure<span style=\"color:blue;\"> As String<\/span>)\r\n     <span style=\"color:blue;\">Dim <\/span>objVBProject<span style=\"color:blue;\"> As <\/span>VBIDE.VBProject\r\n     <span style=\"color:blue;\">Dim <\/span>objVBComponent<span style=\"color:blue;\"> As <\/span>VBIDE.VBComponent\r\n     <span style=\"color:blue;\">Dim <\/span>objCodemodule<span style=\"color:blue;\"> As <\/span>VBIDE.CodeModule\r\n     <span style=\"color:blue;\">Dim <\/span>lngCountOfLines<span style=\"color:blue;\"> As Long<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>intProcType<span style=\"color:blue;\"> As <\/span>vbext_ProcKind\r\n     <span style=\"color:blue;\">Dim <\/span>lngProcBodyLine<span style=\"color:blue;\"> As Long<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>lngFirstStatementLineNumber<span style=\"color:blue;\"> As Long<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>lngLastStatementLineNumber<span style=\"color:blue;\"> As Long<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>lngLine<span style=\"color:blue;\"> As Long<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>strLine<span style=\"color:blue;\"> As String<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>bolNumbers<span style=\"color:blue;\"> As Boolean<\/span>\r\n     <span style=\"color:blue;\">Set<\/span> objVBProject = VBE.ActiveVBProject\r\n     <span style=\"color:blue;\">Set<\/span> objVBComponent = objVBProject.VBComponents(strModule)\r\n     <span style=\"color:blue;\">Set<\/span> objCodemodule = objVBComponent.CodeModule\r\n     lngCountOfLines = objCodemodule.CountOfLines\r\n     lngProcBodyLine = objCodemodule.ProcBodyLine(strProcedure, intProcType)\r\n     lngFirstStatementLineNumber = GetFirstStatementLineNumber(objCodemodule, lngProcBodyLine)\r\n     lngLastStatementLineNumber = GetLastStatementLineNumber(objCodemodule, lngProcBodyLine)\r\n     For lngLine = lngFirstStatementLineNumber To lngLastStatementLineNumber\r\n         strLine = left(objCodemodule.Lines(lngLine, 1), 6)\r\n         Select Case <span style=\"color:blue;\">True<\/span>\r\n             <span style=\"color:blue;\">Case <\/span>IsNumeric(strLine)\r\n                 bolNumbers = <span style=\"color:blue;\">True<\/span>\r\n                 <span style=\"color:blue;\">Exit For<\/span>\r\n         <span style=\"color:blue;\">End Select<\/span>\r\n     <span style=\"color:blue;\">Next<\/span> lngLine\r\n     <span style=\"color:blue;\">If <\/span>bolNumbers = <span style=\"color:blue;\">True<\/span><span style=\"color:blue;\"> Then<\/span>\r\n         For lngLine = lngFirstStatementLineNumber To lngLastStatementLineNumber\r\n             strLine = left(objCodemodule.Lines(lngLine, 1), 6)\r\n             Select Case <span style=\"color:blue;\">True<\/span>\r\n                 <span style=\"color:blue;\">Case <\/span>IsNumeric(strLine), <span style=\"color:blue;\">Trim<\/span>(strLine) = \"\"\r\n                    objCodemodule.ReplaceLine lngLine, <span style=\"color:blue;\">Mid<\/span>(objCodemodule.Lines(lngLine, 1), 7)\r\n             <span style=\"color:blue;\">End Select<\/span>\r\n         <span style=\"color:blue;\">Next<\/span> lngLine\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 3: Prozedur zum Entfernen von Zeilennummern einer Prozedur<\/span><\/b><\/p>\n<p>Achtung: Die Prozedur geht davon aus, dass die Prozedur, aus der die Zeilennummern entfernt werden sollen, mit der weiter oben beschriebenen Prozedur <b>AddLineNumbers <\/b>mit Zeilennummern versehen wurde.<\/p>\n<p>Die Prozedur erwartet die folgenden Parameter:<\/p>\n<ul>\n<li><b>strModule<\/b>: Name des Moduls, in dem sich die Prozedur befindet<\/li>\n<li><b>strProcedure<\/b>: Name der Prozedur, aus der die Zeilennummern entfernt werden sollen<\/li>\n<\/ul>\n<p>Sie referenziert das aktuelle VBA-Projekt und dann mit <b>objVBComponent <\/b>die mit <b>strModule <\/b>&uuml;bergebene Komponente. Mit <b>objCodeModule <\/b>referenzieren wir das <b>CodeModule<\/b>-Element, das wir anschlie&szlig;end nutzen, um mit <b>ProcBodyLine <\/b>die erste Zeile der Prozedur aus <b>strProcedure <\/b>zu ermitteln. Mit dieser k&ouml;nnen wir nun die beiden Funktionen <b>GetFirstStatementLineNumber <\/b>und <b>GetLastStatementLineNumber <\/b>aufrufen, um die Nummern der ersten und der letzten Zeile innerhalb der Prozedur zu ermitteln. Diese Werte verwenden wir als Bereich von zun&auml;chst einer <b>For&#8230;Next<\/b>-Schleife.<\/p>\n<p>In dieser untersuchen wir die ersten sechs Zeichen der Zeile. Enthalten diese einen numerischen Wert, ist die Prozedur offensichtlich mit einer Zeilennummerierung ausgestattet. Sobald wir einen numerischen Wert in den ersten sechs Zeichen einer Zeile ermittelt haben, stellen wir daher die Variable <b>bolNumbers <\/b>auf <b>True <\/b>ein und verlassen die erste <b>For&#8230;Next<\/b>-Schleife. Hat <b>bolNumbers <\/b>danach den Wert <b>True<\/b>, steigen wir in die n&auml;chste <b>For&#8230;Next<\/b>-Schleife ein. In dieser trennen wir zun&auml;chst die ersten sechs Zeichen einer jeden Zeile ab und untersuchen diese anschlie&szlig;end. Ist der Inhalt der ersten sechs Zeichen numerisch, handelt es sich offensichtlich um Zeilennummern. Ist der Inhalt hingegen eine leere Zeichenkette, so ist es eine Zeile, die zuvor einger&uuml;ckt wurde, ohne dass eine Zeilennummer hinzugef&uuml;gt wurde. In beiden F&auml;llen werden einfach die ersten sechs Zeichen von vorn entfernt.<\/p>\n<h2>Funktion zum Entfernen von Zeilennummern aus einem vollst&auml;ndigen Modul<\/h2>\n<p>Da wir diese Prozedur nicht f&uuml;r jede Prozedur einzeln aufrufen wollen, verwenden wir eine weitere Prozedur namens <b>RemoveLineNumbersFromModule <\/b>(siehe Listing 4), um alle Prozeduren eines Moduls zu durchlaufen und f&uuml;r jede Prozedur die Routine <b>RemoveLineNumbers <\/b>aufzurufen.<\/p>\n<pre><span style=\"color:blue;\">Public Sub <\/span>RemoveLineNumbersFromModule(strModule<span style=\"color:blue;\"> As String<\/span>)\r\n     <span style=\"color:blue;\">Dim <\/span>objVBProject<span style=\"color:blue;\"> As <\/span>VBIDE.VBProject\r\n     <span style=\"color:blue;\">Dim <\/span>objVBComponent<span style=\"color:blue;\"> As <\/span>VBIDE.VBComponent\r\n     <span style=\"color:blue;\">Dim <\/span>objCodemodule<span style=\"color:blue;\"> As <\/span>VBIDE.CodeModule\r\n     <span style=\"color:blue;\">Dim <\/span>intProcType<span style=\"color:blue;\"> As <\/span>vbext_ProcKind\r\n     <span style=\"color:blue;\">Dim <\/span>lngCountOfLines<span style=\"color:blue;\"> As Long<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>lngLine<span style=\"color:blue;\"> As Long<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>strProcedure<span style=\"color:blue;\"> As String<\/span>\r\n     <span style=\"color:blue;\">Set<\/span> objVBProject = VBE.ActiveVBProject\r\n     <span style=\"color:blue;\">Set<\/span> objVBComponent = objVBProject.VBComponents(strModule)\r\n     <span style=\"color:blue;\">Set<\/span> objCodemodule = objVBComponent.CodeModule\r\n     lngCountOfLines = objCodemodule.CountOfLines\r\n     For lngLine = 1 To lngCountOfLines\r\n         <span style=\"color:blue;\">If <\/span><span style=\"color:blue;\">Not<\/span> strProcedure = objCodemodule.ProcOfLine(lngLine, intProcType)<span style=\"color:blue;\"> Then<\/span>\r\n             strProcedure = objCodemodule.ProcOfLine(lngLine, intProcType)\r\n             <span style=\"color:blue;\">Call<\/span> RemoveLineNumbers(strModule, strProcedure)\r\n         <span style=\"color:blue;\">End If<\/span>\r\n     <span style=\"color:blue;\">Next<\/span> lngLine\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 4: Prozedur zum Entfernen von Zeilennummern eines Moduls<\/span><\/b><\/p>\n<p>Dazu referenzieren wir das aktuelle VBA-Projekt und das &uuml;bergebene Modul mit der Variablen <b>objCodeModule<\/b>. Wir durchlaufen alle Zeilen des Moduls und pr&uuml;fen, zu welcher Prozedur die aktuelle Zeile geh&ouml;rt. Beim Auffinden einer jeden neuen Prozedur rufen wir einmal die Prozedur <b>RemoveLineNumbers <\/b>f&uuml;r diese Prozedur auf. Dies f&uuml;hren wir solange durch, bis wir alle Zeilen des Moduls durchlaufen haben.<\/p>\n<h2>Funktion zum Entfernen von Zeilennummern aus dem vollst&auml;ndigen VBA-Projekt<\/h2>\n<p>Schlie&szlig;lich verwenden wir noch eine Prozedur namens <b>RemoveLineNumbersFromActiveVBProject<\/b>, um alle Module des aktuellen VBA-Projekts zu durchlaufen und f&uuml;r jedes Modul einmal die Prozedur <b>RemoveLineNumbersFromModule <\/b>aufzurufen.<\/p>\n<p>Damit k&ouml;nnen wir alle Nummerierungen aus den Modulen des Projekts entfernen:<\/p>\n<pre><span style=\"color:blue;\">Public Sub <\/span>RemoveLineNumbersFromActiveVBProject()\r\n     <span style=\"color:blue;\">Dim <\/span>objVBProject<span style=\"color:blue;\"> As <\/span>VBIDE.VBProject\r\n     <span style=\"color:blue;\">Dim <\/span>objVBComponent<span style=\"color:blue;\"> As <\/span>VBIDE.VBComponent\r\n     <span style=\"color:blue;\">Set<\/span> objVBProject = VBE.ActiveVBProject\r\n     For Each objVBComponent In objVBProject.VBComponents\r\n         <span style=\"color:blue;\">Call<\/span> RemoveLineNumbersFromModule(objVBComponent.Name)\r\n     <span style=\"color:blue;\">Next<\/span> objVBComponent\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<h2>Hilfsfunktion zum Ermitteln der Zeilennummer der ersten Anweisung einer Prozedur<\/h2>\n<p>Die Hilfsfunktion <b>GetFirstStatementLineNumber <\/b>ermittelt die Nummer der ersten Anweisung in einer Prozedur. Damit ist tats&auml;chlich die erste Anweisung gemeint, die auf die Kopfzeile folgt &#8211; auch, wenn diese mehr als eine Zeile umfasst. Diese Funktion aus Listing 5 erwartet die folgenden Parameter:<\/p>\n<pre><span style=\"color:blue;\">Public Function <\/span>GetFirstStatementLineNumber(objCodemodule<span style=\"color:blue;\"> As <\/span>VBIDE.CodeModule, lngProcBodyLine<span style=\"color:blue;\"> As Long<\/span>)<span style=\"color:blue;\"> As Long<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>strLine<span style=\"color:blue;\"> As String<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>lngFirstStatementLineNumber<span style=\"color:blue;\"> As Long<\/span>\r\n     lngFirstStatementLineNumber = lngProcBodyLine\r\n     strLine = objCodemodule.Lines(lngFirstStatementLineNumber, 1)\r\n     strLine = <span style=\"color:blue;\">Trim<\/span>(strLine)\r\n     <span style=\"color:blue;\">Do While<\/span> right(strLine, 1) = \"_\"\r\n         lngFirstStatementLineNumber = lngFirstStatementLineNumber + 1\r\n         strLine = objCodemodule.Lines(lngFirstStatementLineNumber, 1)\r\n         strLine = <span style=\"color:blue;\">Trim<\/span>(strLine)\r\n     <span style=\"color:blue;\">Loop<\/span>\r\n     GetFirstStatementLineNumber = lngFirstStatementLineNumber + 1\r\n<span style=\"color:blue;\">End Function<\/span><\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 5: Prozedur zum Einlesen der Nummer der Zeile der ersten Anweisung in einer Prozedur<\/span><\/b><\/p>\n<ul>\n<li><b>objCodemodule<\/b>: Verweis auf das <b>CodeModule<\/b>-Objekt, in dem sich die Prozedur befindet<\/li>\n<li><b>lngProcBodyLine<\/b>: Nummer der Kopfzeile der zu untersuchenden Prozedur<\/li>\n<\/ul>\n<p>Die mit <b>lngProcBodyLine <\/b>gelieferte Zeilennummer verwenden wir als Ausgangspunkt f&uuml;r die Suche nach der ersten Zeile hinter der Kopfzeile. Die Funktion <b>GetFirstStatementLineNumber <\/b>schreibt zuerst den Wert aus <b>lngProcBodyLine <\/b>in die Variable <b>lngFirstStatementLineNumber<\/b>.<\/p>\n<p>Nun pr&uuml;ft die Funktion, ob die Kopfzeile der Prozedur am Ende einen Unterstrich enth&auml;lt, was darauf hindeuten w&uuml;rde, dass die Kopfzeile noch mindestens eine weitere Zeile enth&auml;lt. Ist das nicht der Fall, ist die erste Zeile nach der Kopfzeile die erste Zeile mit einer Anweisung.<\/p>\n<p>Wir brauchen also nur <b>lngFirstStatementLineNumber  <\/b>um <b>1 <\/b>zu erh&ouml;hen und zur&uuml;ckzugeben. Anderenfalls springt die Prozedur solange eine Zeile weiter, bis sie die letzte Zeile der Kopfzeile erreicht. Anschlie&szlig;end wird ebenfalls <b>1 <\/b>zu <b>lngFirstStatementLineNumber <\/b>hinzugez&auml;hlt und der Wert zur&uuml;ckgegeben.<\/p>\n<h2>Hilfsfunktion zum Ermitteln der Zeilennummer der letzten Anweisung einer Prozedur<\/h2>\n<p>Auf &auml;hnliche Weise ermitteln wir die Zeile mit der letzten Anweisung. Die dazu verwendete Funktion <b>GetLastStatementLineNumber <\/b>aus Listing 6 ist lediglich etwas umfangreicher und verwendet die gleichen Parameter wie <b>GetFirstStatementLineNumber<\/b>. Das liegt daran, dass sie zuerst die erste Zeile mit einer Anweisung ermittelt und sich von dort bis zur letzten Anweisung der Prozedur durcharbeitet.<\/p>\n<pre><span style=\"color:blue;\">Public Function <\/span>GetLastStatementLineNumber(objCodemodule<span style=\"color:blue;\"> As <\/span>VBIDE.CodeModule, lngProcBodyLine<span style=\"color:blue;\"> As Long<\/span>)<span style=\"color:blue;\"> As Long<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>lngFirstStatementLineNumber<span style=\"color:blue;\"> As Long<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>lngLastStatementLineNumber<span style=\"color:blue;\"> As Long<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>lngLine<span style=\"color:blue;\"> As Long<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>strCurrentLine<span style=\"color:blue;\"> As String<\/span>\r\n     lngFirstStatementLineNumber = GetFirstStatementLineNumber(objCodemodule, lngProcBodyLine)\r\n     For lngLine = lngFirstStatementLineNumber To objCodemodule.CountOfLines\r\n         strCurrentLine = objCodemodule.Lines(lngLine, 1)\r\n         strCurrentLine = <span style=\"color:blue;\">LTrim<\/span>(strCurrentLine)\r\n         Select Case <span style=\"color:blue;\">True<\/span>\r\n             <span style=\"color:blue;\">Case <\/span>left(strCurrentLine, 7) = \"End Sub\", left(strCurrentLine, 12) = \"End Function\", _\r\n                     left(strCurrentLine, 12) = \"End Property\"\r\n                 lngLastStatementLineNumber = lngLine - 1\r\n                 <span style=\"color:blue;\">Exit For<\/span>\r\n         <span style=\"color:blue;\">End Select<\/span>\r\n     <span style=\"color:blue;\">Next<\/span> lngLine\r\n     GetLastStatementLineNumber = lngLastStatementLineNumber\r\n<span style=\"color:blue;\">End Function<\/span><\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 6: Prozedur zum Ermitteln der Nummer der Zeile mit der letzten Anweisung einer Prozedur<\/span><\/b><\/p>\n<p>Dazu durchlaufen wir alle Zeilen von der Zeile mit der ersten Anweisung bis zum Ende des aktuellen Moduls &#8211; allerdings nur solange, bis wir auf eine Zeile sto&szlig;en, die mit <b>End Sub<\/b>, <b>End Function <\/b>oder <b>End Property <\/b>endet. In diesem Fall ist die vorherige Zeile die letzte Zeile der aktuellen Prozedur und wir geben den Wert der Laufvariablen <b>lngLine &#8211; 1 <\/b>als Funktionsergebnis zur&uuml;ck.<\/p>\n<h2>Hilfsfunktion zum Identifizieren einer Zeile als Sprungmarke<\/h2>\n<p>Sprungmarken wie die folgende sollen nicht mit einer Zeilennummer versehen werden:<\/p>\n<pre>Errorhandling:<\/pre>\n<p>Es kann auch sein, dass auf die Sprungmarke noch ein Kommentar folgt:<\/p>\n<pre>Errorhandling: ''Hier beginnt die Fehlerbehandlung<\/pre>\n<p>Beide F&auml;lle m&uuml;ssen wir ber&uuml;cksichtigen. Dazu nutzen wir die Funktion <b>IsLabel<\/b>, die lediglich die Zeile als Parameter erwartet (siehe Listing 7).<\/p>\n<pre><span style=\"color:blue;\">Public Function <\/span>IsLabel(strLine<span style=\"color:blue;\"> As String<\/span>)<span style=\"color:blue;\"> As Boolean<\/span>\r\n     <span style=\"color:blue;\">If <\/span><span style=\"color:blue;\">LTrim<\/span>(strLine) = strLine<span style=\"color:blue;\"> Then<\/span>\r\n         <span style=\"color:blue;\">If <\/span><span style=\"color:blue;\">InStr<\/span>(1, <span style=\"color:blue;\">Trim<\/span>(strLine), \" \") = 0<span style=\"color:blue;\"> Then<\/span>\r\n             <span style=\"color:blue;\">If <\/span>right(<span style=\"color:blue;\">Trim<\/span>(strLine), 1) = \":\"<span style=\"color:blue;\"> Then<\/span>\r\n                 IsLabel = <span style=\"color:blue;\">True<\/span>\r\n             <span style=\"color:blue;\">Else<\/span>\r\n                 IsLabel = <span style=\"color:blue;\">False<\/span>\r\n             <span style=\"color:blue;\">End If<\/span>\r\n         <span style=\"color:blue;\">Else<\/span>\r\n             <span style=\"color:blue;\">If <\/span><span style=\"color:blue;\">InStr<\/span>(1, strLine, \":\") = 0<span style=\"color:blue;\"> Then<\/span>\r\n                 IsLabel = <span style=\"color:blue;\">False<\/span>\r\n             <span style=\"color:blue;\">Else<\/span>\r\n                 <span style=\"color:blue;\">If <\/span><span style=\"color:blue;\">InStr<\/span>(1, strLine, \":\") &lt; <span style=\"color:blue;\">InStr<\/span>(1, strLine, \" \")<span style=\"color:blue;\"> Then<\/span>\r\n                     IsLabel = <span style=\"color:blue;\">True<\/span>\r\n                 <span style=\"color:blue;\">Else<\/span>\r\n                     IsLabel = <span style=\"color:blue;\">False<\/span>\r\n                 <span style=\"color:blue;\">End If<\/span>\r\n             <span style=\"color:blue;\">End If<\/span>\r\n         <span style=\"color:blue;\">End If<\/span>\r\n     <span style=\"color:blue;\">Else<\/span>\r\n         IsLabel = <span style=\"color:blue;\">False<\/span>\r\n     <span style=\"color:blue;\">End If<\/span>\r\n<span style=\"color:blue;\">End Function<\/span><\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 7: Prozedur zum Pr&uuml;fen, ob eine Zeile eine Sprungmarke ist<\/span><\/b><\/p>\n<p>Sie pr&uuml;ft zun&auml;chst, ob der um f&uuml;hrende Leerzeichen mit <b>LTrim <\/b>erleichterte Inhalt von <b>strLine <\/b>gleich dem unbearbeiteten Inhalt von <b>strLine <\/b>entspricht.<\/p>\n<p>Wenn das nicht der Fall ist, bedeutet dies, dass der Text der Zeile nicht ganz links beginnt &#8211; dann kann es sich nicht um eine Sprungmarke handeln.<\/p>\n<p>Ist das hingegen der Fall, sind weitere Untersuchungen n&ouml;tig. Die erste pr&uuml;ft mit der <b>InStr<\/b>-Funktion, ob die Zeile ein Leerzeichen enth&auml;lt. Ist das nicht der Fall, pr&uuml;ft sie noch, ob das ganz rechte Zeichen der um Leerzeichen erleichterten Zeile ein Doppelpunkt ist. In diesem Fall handelt es sich ebenfalls um eine Sprungmarke.<\/p>\n<p>Den Fall mit dem Leerzeichen untersuchen wir im <b>Else<\/b>-Zweig. Hier pr&uuml;fen wir zuerst, ob die Zeile dennoch einen Doppelpunkt enth&auml;lt. Falls nein, ist es keine Sprungmarke. Falls ja, m&uuml;ssen wir noch pr&uuml;fen, ob der Doppelpunkt vor dem Leerzeichen steht. Ist das der Fall, handelt es sich vermutlich um eine Sprungmarke mit einem Kommentar. Anderenfalls ist es keine Sprungmarke.<\/p>\n<h2>Hilfsfunktion zum Ermitteln der Kopfzeile der Prozedur in einer Zeile<\/h2>\n<p>Es kann sein, dass der Entwickler die Kopfzeile der Prozedur &uuml;ber mehrere Zeilen erstreckt hat, weil diese wegen vieler Parameter sehr lang ist. F&uuml;r verschiedene Anwendungszwecke ben&ouml;tigen wir jedoch die Kopfzeile ohne Zeilenumbr&uuml;che. Deshalb haben wir die Funktion <b>GetProcBodyLine <\/b>entwickelt, der wir die folgenden Parameter &uuml;bergeben:<\/p>\n<ul>\n<li><b>objCodeModule<\/b>: Verweis auf das <b>CodeModule<\/b>-Objekt, in dem sich die zu untersuchende Prozedur befindet<\/li>\n<li><b>lngProcBodyLine<\/b>: Zeile, in der die Kopfzeile der Prozedur beginnt<\/li>\n<\/ul>\n<p>Die Prozedur aus Listing 8 tr&auml;gt zun&auml;chst den Wert des Parameters <b>lngProcBodyLine <\/b>in die Variable <b>lngCurrentLine <\/b>ein. Dann ermittelt sie mit der <b>Lines<\/b>-Funktion des <b>CodeModule<\/b>-Objekts den Text der Zeile mit der Nummer aus <b>lngCurrentLine<\/b> und speichert diese in der Variablen <b>strLine<\/b>. Vorher wird sie noch mit der Trim-Funktion behandelt, um f&uuml;hrende und folgende Leerzeichen zu entfernen.<\/p>\n<pre><span style=\"color:blue;\">Public Function <\/span>GetProcBodyLine(objCodemodule<span style=\"color:blue;\"> As <\/span>VBIDE.CodeModule, lngProcBodyLine)<span style=\"color:blue;\"> As String<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>strLine<span style=\"color:blue;\"> As String<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>lngCurrentLine<span style=\"color:blue;\"> As Long<\/span>\r\n     lngCurrentLine = lngProcBodyLine\r\n     strLine = <span style=\"color:blue;\">Trim<\/span>(objCodemodule.Lines(lngCurrentLine, 1))\r\n     <span style=\"color:blue;\">Do While<\/span> right(strLine, 1) = \"_\"\r\n         lngCurrentLine = lngCurrentLine + 1\r\n         strLine = left(strLine, <span style=\"color:blue;\">Len<\/span>(strLine) - 2)\r\n         strLine = strLine & \" \" & <span style=\"color:blue;\">Trim<\/span>(objCodemodule.Lines(lngCurrentLine, 1))\r\n     <span style=\"color:blue;\">Loop<\/span>\r\n     GetProcBodyLine = strLine\r\n<span style=\"color:blue;\">End Function<\/span><\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 8: Prozedur zum Ermitteln der kompletten Kopfzeile ohne Zeilenumbr&uuml;che<\/span><\/b><\/p>\n<p>Damit steigt sie in einer <b>Do While<\/b>-Schleife ein, die untersucht, ob das erste Zeichen von rechts ein Unterstrich ist (<b>_<\/b>), was bedeuten w&uuml;rde, dass die Kopfzeile zumindest noch eine weitere Zeile enth&auml;lt.<\/p>\n<p>In diesem Fall wird <b>lngCurrentLine <\/b>um <b>1 <\/b>erh&ouml;ht und die Prozedur schneidet den Unterstrich und das vorherige Leerzeichen ab. Dann h&auml;ngt es den Inhalt der aktuell mit <b>lngCurrentLine <\/b>bezeichneten Zeile an die Variable <b>strLine <\/b>an.<\/p>\n<p>Dies geschieht solange, bis die mit <b>lngCurrentLine <\/b>bezeichnete Zeile keinen Unterstrich mehr als letztes Zeichen enth&auml;lt. Dann wird der aktuelle Inhalt von <b>strLine <\/b>als Wert der Funktion <b>GetProcBodyLine <\/b>zur&uuml;ckgegeben.<\/p>\n<h2>Hilfsfunktion zum Ermitteln des Prozedurtyps<\/h2>\n<p>F&uuml;r verschiedene Aktionen m&uuml;ssen wir wissen, ob es sich bei der Prozedur um eine <b>Sub<\/b>-, <b>Function<\/b>&#8211; oder <b>Property<\/b>-Prozedur handelt. Um dies herauszufinden, schicken wir die erste Zeile einer Prozedur an eine Hilfsfunktion namens <b>GetProcType<\/b>. Diese erwartet die folgenden beiden Parameter:<\/p>\n<ul>\n<li><b>strProcedure<\/b>: Name der Prozedur<\/li>\n<li><b>strProcBodyLine<\/b>: Kopfzeile der Prozedur<\/li>\n<\/ul>\n<p>Die Funktion finden wir in Listing 9. Sie ermittelt als Erstes die Position in der Kopfzeile der Prozedur, in welcher der Prozedurname zum ersten Mal auftaucht. Nur der Teil bis zu dieser Position interessiert uns &#8211; alles inklusive des Prozedurnamens und der Parameter k&ouml;nnen wir erst einmal abschneiden. Also ermittelt die Funktion diese Position mit der <b>InStr<\/b>-Funktion, der wir als zu suchenden Begriff nicht nur den Prozedurnamen &uuml;bergeben, sondern auch noch ein f&uuml;hrendes Leerzeichen.<\/p>\n<pre><span style=\"color:blue;\">Public Function <\/span>GetProcType(strProcedure<span style=\"color:blue;\"> As String<\/span>, strProcBodyLine<span style=\"color:blue;\"> As String<\/span>)<span style=\"color:blue;\"> As String<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>lngPos<span style=\"color:blue;\"> As Long<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>strProcType<span style=\"color:blue;\"> As String<\/span>\r\n     lngPos = <span style=\"color:blue;\">InStr<\/span>(1, strProcBodyLine, \" \" & strProcedure)\r\n     strProcType = <span style=\"color:blue;\">Trim<\/span>(left(strProcBodyLine, lngPos))\r\n     lngPos = <span style=\"color:blue;\">InStrRev<\/span>(strProcType, \" \")\r\n     strProcType = <span style=\"color:blue;\">Trim<\/span>(<span style=\"color:blue;\">Mid<\/span>(strProcType, lngPos))\r\n     Select Case strProcType\r\n         <span style=\"color:blue;\">Case <\/span>\"Get\", \"Let\", \"Set\"\r\n             strProcType = \"Property\"\r\n     <span style=\"color:blue;\">End Select<\/span>\r\n     GetProcType = strProcType\r\n<span style=\"color:blue;\">End Function<\/span><\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 9: Ermitteln des Typs einer Prozedur<\/span><\/b><\/p>\n<p>Dann schneidet die Prozedur den Teil ab, der hinter diesem Zeichen liegt, indem sie mit der <b>Left<\/b>-Funktion nur den Teil bis zu dieser Position zur&uuml;ckliefert. Das Ergebnis behandeln wir noch mit der <b>Trim<\/b>-Funktion, um f&uuml;hrende und folgende Leerzeichen abzuschneiden. Schlie&szlig;lich wandelt die Prozedur den Inhalt im Falle der Werte <b>Get, Let <\/b>oder <b>Set <\/b>noch in <b>Property <\/b>um. Angenommen, wir starten mit der folgenden Anweisung:<\/p>\n<pre><span style=\"color:blue;\">Public Sub <\/span>Beispielprozedur(strBeispiel<span style=\"color:blue;\"> As String<\/span>)<\/pre>\n<p>Nach diesen ersten Schritten bleibt noch diese Zeichenkette &uuml;brig:<\/p>\n<pre><span style=\"color:blue;\">Public <\/span>Sub<\/pre>\n<p>Davon ben&ouml;tigen wir nur noch den hinteren Teil, also <b>Sub<\/b>. Dazu ermitteln wir mit der <b>InStrRev<\/b>-Funktion die Position des ersten Leerzeichens von hinten, also des Leerzeichens vor <b>Sub<\/b>. Mit der <b>Mid<\/b>-Funktion ermitteln wir nun nur noch die Zeichenkette von dieser Position bis zum Ende der Zeichenkette, also <b>Sub<\/b>, und speichern das Ergebnis in der Variablen <b>strProcType<\/b>. Dessen Inhalt gibt die Funktion schlie&szlig;lich als Ergebnis zur&uuml;ck.<\/p>\n<h2>Zusammenfassung und Ausblick<\/h2>\n<p>In diesem Beitrag haben wir Techniken vorgestellt, mit denen wir Zeilennummern zu einzelnen Prozeduren, Modulen oder sogar zu vollst&auml;ndigen VBA-Projekten hinzuf&uuml;gen k&ouml;nnen. Diese setzen wir beispielsweise im Beitrag <b>Fehler in der Runtime von Access finden <\/b>(<b>www.access-im-unternehmen.de\/1513<\/b>) praktisch ein. Dort nutzen wir auch den Beitrag <b>Fehlerbehandlung per VBA hinzuf&uuml;gen <\/b>(<b>www.access-im-unternehmen.de\/1514<\/b>).<\/p>\n<h2>Downloads zu diesem Beitrag<\/h2>\n<p>Enthaltene Beispieldateien:<\/p>\n<p>ZeilennummernPerVBAHinzufuegen.accdb<\/p>\n<p><a href=\"..\/fileadmin\/beispiele\/59B3BB10-FEEB-4A6D-8229-C403832E0CA0\/aiu_1515.zip\">Download<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Wer eine wirklich professionelle Fehlerbehandlung zu seiner Access-Anwendung hinzuf&uuml;gen m&ouml;chte, kommt nicht um das Anlegen von Zeilennummern herum. Wenn man Zeilennummern festgelegt hat, kann man diese im Falle eines Fehlers mit der nicht dokumentierten Erl-Funktion auslesen. Das hei&szlig;t, dass wir neben der Fehlernummer und der Fehlerbeschreibung noch auf die Zeilennummer zur&uuml;ckgreifen k&ouml;nnen, um den Fehler zu lokalisieren. Dazu geh&ouml;rt allerdings auch, dass wir in der Fehlermeldung Informationen &uuml;ber das Modul und die Prozedur unterbringen, in denen der Fehler aufgetreten ist &#8211; doch dies l&auml;sst sich einfach realisieren. Sehr aufw&auml;ndig ist es hingegen, alle Prozeduren von umfangreichen Anwendungen mit Zeilennummern zu versehen. Um dies zu realisieren, nutzen wir die Bibliothek Microsoft Visual Basic for Applications Extensibility 5.3, die alle M&ouml;glichkeiten bietet, um auf die enthaltenen Module zuzugreifen und den Code automatisiert nach unseren W&uuml;nschen anzupassen.<\/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":[662024,66052024,44000025],"tags":[],"class_list":["post-55001515","post","type-post","status-publish","format-standard","hentry","category-662024","category-66052024","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>Zeilennummern per VBA hinzuf&uuml;gen - 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\/Zeilennummern_per_VBA_hinzufuegen\/\" \/>\n<meta property=\"og:locale\" content=\"de_DE\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Zeilennummern per VBA hinzuf&uuml;gen\" \/>\n<meta property=\"og:description\" content=\"Wer eine wirklich professionelle Fehlerbehandlung zu seiner Access-Anwendung hinzuf&uuml;gen m&ouml;chte, kommt nicht um das Anlegen von Zeilennummern herum. Wenn man Zeilennummern festgelegt hat, kann man diese im Falle eines Fehlers mit der nicht dokumentierten Erl-Funktion auslesen. Das hei&szlig;t, dass wir neben der Fehlernummer und der Fehlerbeschreibung noch auf die Zeilennummer zur&uuml;ckgreifen k&ouml;nnen, um den Fehler zu lokalisieren. Dazu geh&ouml;rt allerdings auch, dass wir in der Fehlermeldung Informationen &uuml;ber das Modul und die Prozedur unterbringen, in denen der Fehler aufgetreten ist - doch dies l&auml;sst sich einfach realisieren. Sehr aufw&auml;ndig ist es hingegen, alle Prozeduren von umfangreichen Anwendungen mit Zeilennummern zu versehen. Um dies zu realisieren, nutzen wir die Bibliothek Microsoft Visual Basic for Applications Extensibility 5.3, die alle M&ouml;glichkeiten bietet, um auf die enthaltenen Module zuzugreifen und den Code automatisiert nach unseren W&uuml;nschen anzupassen.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/access-im-unternehmen.de\/Zeilennummern_per_VBA_hinzufuegen\/\" \/>\n<meta property=\"og:site_name\" content=\"Access im Unternehmen\" \/>\n<meta property=\"article:published_time\" content=\"2024-08-27T08:57:41+00:00\" \/>\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=\"18\u00a0Minuten\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Zeilennummern_per_VBA_hinzufuegen\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Zeilennummern_per_VBA_hinzufuegen\\\/\"},\"author\":{\"name\":\"Andr\u00e9 Minhorst\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#\\\/schema\\\/person\\\/13395c4bcd7d7963efe33be9c584d93f\"},\"headline\":\"Zeilennummern per VBA hinzuf&uuml;gen\",\"datePublished\":\"2024-08-27T08:57:41+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Zeilennummern_per_VBA_hinzufuegen\\\/\"},\"wordCount\":2839,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#organization\"},\"image\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Zeilennummern_per_VBA_hinzufuegen\\\/#primaryimage\"},\"thumbnailUrl\":\"http:\\\/\\\/vg02.met.vgwort.de\\\/na\\\/a63bca05b10e4bdaa225ea8ca944f24c\",\"articleSection\":[\"2024\",\"5\\\/2024\",\"VBA und Programmiertechniken\"],\"inLanguage\":\"de\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/access-im-unternehmen.de\\\/Zeilennummern_per_VBA_hinzufuegen\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Zeilennummern_per_VBA_hinzufuegen\\\/\",\"url\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Zeilennummern_per_VBA_hinzufuegen\\\/\",\"name\":\"Zeilennummern per VBA hinzuf&uuml;gen - Access im Unternehmen\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Zeilennummern_per_VBA_hinzufuegen\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Zeilennummern_per_VBA_hinzufuegen\\\/#primaryimage\"},\"thumbnailUrl\":\"http:\\\/\\\/vg02.met.vgwort.de\\\/na\\\/a63bca05b10e4bdaa225ea8ca944f24c\",\"datePublished\":\"2024-08-27T08:57:41+00:00\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Zeilennummern_per_VBA_hinzufuegen\\\/#breadcrumb\"},\"inLanguage\":\"de\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/access-im-unternehmen.de\\\/Zeilennummern_per_VBA_hinzufuegen\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"de\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Zeilennummern_per_VBA_hinzufuegen\\\/#primaryimage\",\"url\":\"http:\\\/\\\/vg02.met.vgwort.de\\\/na\\\/a63bca05b10e4bdaa225ea8ca944f24c\",\"contentUrl\":\"http:\\\/\\\/vg02.met.vgwort.de\\\/na\\\/a63bca05b10e4bdaa225ea8ca944f24c\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Zeilennummern_per_VBA_hinzufuegen\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/access-im-unternehmen.de\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Zeilennummern per VBA hinzuf&uuml;gen\"}]},{\"@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":"Zeilennummern per VBA hinzuf&uuml;gen - 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\/Zeilennummern_per_VBA_hinzufuegen\/","og_locale":"de_DE","og_type":"article","og_title":"Zeilennummern per VBA hinzuf&uuml;gen","og_description":"Wer eine wirklich professionelle Fehlerbehandlung zu seiner Access-Anwendung hinzuf&uuml;gen m&ouml;chte, kommt nicht um das Anlegen von Zeilennummern herum. Wenn man Zeilennummern festgelegt hat, kann man diese im Falle eines Fehlers mit der nicht dokumentierten Erl-Funktion auslesen. Das hei&szlig;t, dass wir neben der Fehlernummer und der Fehlerbeschreibung noch auf die Zeilennummer zur&uuml;ckgreifen k&ouml;nnen, um den Fehler zu lokalisieren. Dazu geh&ouml;rt allerdings auch, dass wir in der Fehlermeldung Informationen &uuml;ber das Modul und die Prozedur unterbringen, in denen der Fehler aufgetreten ist - doch dies l&auml;sst sich einfach realisieren. Sehr aufw&auml;ndig ist es hingegen, alle Prozeduren von umfangreichen Anwendungen mit Zeilennummern zu versehen. Um dies zu realisieren, nutzen wir die Bibliothek Microsoft Visual Basic for Applications Extensibility 5.3, die alle M&ouml;glichkeiten bietet, um auf die enthaltenen Module zuzugreifen und den Code automatisiert nach unseren W&uuml;nschen anzupassen.","og_url":"https:\/\/access-im-unternehmen.de\/Zeilennummern_per_VBA_hinzufuegen\/","og_site_name":"Access im Unternehmen","article_published_time":"2024-08-27T08:57:41+00:00","author":"Andr\u00e9 Minhorst","twitter_card":"summary_large_image","twitter_misc":{"Verfasst von":"Andr\u00e9 Minhorst","Gesch\u00e4tzte Lesezeit":"18\u00a0Minuten"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/access-im-unternehmen.de\/Zeilennummern_per_VBA_hinzufuegen\/#article","isPartOf":{"@id":"https:\/\/access-im-unternehmen.de\/Zeilennummern_per_VBA_hinzufuegen\/"},"author":{"name":"Andr\u00e9 Minhorst","@id":"https:\/\/access-im-unternehmen.de\/#\/schema\/person\/13395c4bcd7d7963efe33be9c584d93f"},"headline":"Zeilennummern per VBA hinzuf&uuml;gen","datePublished":"2024-08-27T08:57:41+00:00","mainEntityOfPage":{"@id":"https:\/\/access-im-unternehmen.de\/Zeilennummern_per_VBA_hinzufuegen\/"},"wordCount":2839,"commentCount":0,"publisher":{"@id":"https:\/\/access-im-unternehmen.de\/#organization"},"image":{"@id":"https:\/\/access-im-unternehmen.de\/Zeilennummern_per_VBA_hinzufuegen\/#primaryimage"},"thumbnailUrl":"http:\/\/vg02.met.vgwort.de\/na\/a63bca05b10e4bdaa225ea8ca944f24c","articleSection":["2024","5\/2024","VBA und Programmiertechniken"],"inLanguage":"de","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/access-im-unternehmen.de\/Zeilennummern_per_VBA_hinzufuegen\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/access-im-unternehmen.de\/Zeilennummern_per_VBA_hinzufuegen\/","url":"https:\/\/access-im-unternehmen.de\/Zeilennummern_per_VBA_hinzufuegen\/","name":"Zeilennummern per VBA hinzuf&uuml;gen - Access im Unternehmen","isPartOf":{"@id":"https:\/\/access-im-unternehmen.de\/#website"},"primaryImageOfPage":{"@id":"https:\/\/access-im-unternehmen.de\/Zeilennummern_per_VBA_hinzufuegen\/#primaryimage"},"image":{"@id":"https:\/\/access-im-unternehmen.de\/Zeilennummern_per_VBA_hinzufuegen\/#primaryimage"},"thumbnailUrl":"http:\/\/vg02.met.vgwort.de\/na\/a63bca05b10e4bdaa225ea8ca944f24c","datePublished":"2024-08-27T08:57:41+00:00","breadcrumb":{"@id":"https:\/\/access-im-unternehmen.de\/Zeilennummern_per_VBA_hinzufuegen\/#breadcrumb"},"inLanguage":"de","potentialAction":[{"@type":"ReadAction","target":["https:\/\/access-im-unternehmen.de\/Zeilennummern_per_VBA_hinzufuegen\/"]}]},{"@type":"ImageObject","inLanguage":"de","@id":"https:\/\/access-im-unternehmen.de\/Zeilennummern_per_VBA_hinzufuegen\/#primaryimage","url":"http:\/\/vg02.met.vgwort.de\/na\/a63bca05b10e4bdaa225ea8ca944f24c","contentUrl":"http:\/\/vg02.met.vgwort.de\/na\/a63bca05b10e4bdaa225ea8ca944f24c"},{"@type":"BreadcrumbList","@id":"https:\/\/access-im-unternehmen.de\/Zeilennummern_per_VBA_hinzufuegen\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/access-im-unternehmen.de\/"},{"@type":"ListItem","position":2,"name":"Zeilennummern per VBA hinzuf&uuml;gen"}]},{"@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\/55001515","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=55001515"}],"version-history":[{"count":0,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/posts\/55001515\/revisions"}],"wp:attachment":[{"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/media?parent=55001515"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/categories?post=55001515"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/tags?post=55001515"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}