{"id":55001496,"date":"2024-06-01T00:00:00","date_gmt":"2024-06-02T21:18:51","guid":{"rendered":"http:\/\/access-im-unternehmen.aix-dev.de\/aiu\/?p=1496"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-30T00:00:00","slug":"AccessUnterformulare_Filtern__gezielt_nach_Excel_exportieren","status":"publish","type":"post","link":"https:\/\/access-im-unternehmen.de\/AccessUnterformulare_Filtern__gezielt_nach_Excel_exportieren\/","title":{"rendered":"Access-Unterformulare: Filtern &#038; gezielt nach Excel exportieren"},"content":{"rendered":"<p><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/vg02.met.vgwort.de\/na\/dd9a97150e4d484a93ef309e0a0623ef\" width=\"1\" height=\"1\" alt=\"\"><b>In Unterformularen in der Datenblattansicht lassen sich Daten prima filtern oder sortieren. Mit der DoCmd-Methode TransferSpreadsheet lassen sich Daten einer Tabelle oder Abfrage einfach in eine Excel-Datei exportieren. Aber wie bekommen wir beides unter einen Hut? Wir m&ouml;chten also in einem Unterformular die Daten filtern und sortieren k&ouml;nnen und diese in dieser Ansicht in eine Excel-Datei exportieren k&ouml;nnen. Dazu brauchen wir ein wenig VBA und Kenntnisse der Eigenschaften eines Formulars. In diesem Beitrag zeigen wir, wie wir die Daten der Datenherkunft des Unterformulars wie im Unterformular angegeben filtern und sortieren und so in eine Excel-Datei schreiben.<\/b><\/p>\n<h2>Beispieldatenbank<\/h2>\n<p>Wir verwenden ein einfaches Beispiel, in dem eine Tabelle namens <b>tblBeispiele <\/b>mit den beiden Feldern <b>ID <\/b>und <b>Beispieltext <\/b>die Daten liefert (siehe Bild 1).<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2024_03\/pic_1496_002.png\" alt=\"Beispieltabelle mit einfachen Texten\" width=\"424,5589\" height=\"217,7694\"\/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 1: Beispieltabelle mit einfachen Texten<\/span><\/b><\/p>\n<p>Dazu legen wir zwei Formulare an. Das Unterformular <b>sfmExportExcel <\/b>verwendet die Tabelle <b>tblBeispiele <\/b>als Datensatzquelle und zeigt die beiden Felder <b>ID <\/b>und <b>Beispieltext <\/b>im Detailbereich an. Seine Eigenschaft <b>Standardansicht <\/b>stellen wir auf <b>Datenblatt <\/b>ein.<\/p>\n<p>Dieses Unterformular f&uuml;gen wir in das Hauptformular <b>frmExportExcel <\/b>ein. Au&szlig;erdem legen wir im Hauptformular eine Schaltfl&auml;che namens <b>cmdExport <\/b>an.<\/p>\n<p>Diese soll den Export der aktuell im Unterformular angezeigten Datens&auml;tze in eine Excel-Datei starten (siehe Bild 2).<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2024_03\/pic_1496_001.png\" alt=\"Haupt- und Unterformular mit den Beispieldaten\" width=\"499,5589\" height=\"387,1801\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 2: Haupt- und Unterformular mit den Beispieldaten<\/span><\/b><\/p>\n<h2>Vorgehensweise f&uuml;r das Ermitteln von Filter und Sortierung und den Export<\/h2>\n<p>Unsere L&ouml;sung basiert darauf, dass wir f&uuml;r ein Unterformular, das der Benutzer gefiltert und\/oder sortiert hat, den Filterausdruck als auch den Sortierausdruck aus entsprechenden Eigenschaften des Unterformulars auslesen k&ouml;nnen. Wir wissen auch, welche Datensatzquelle das Unterformular verwendet. Damit k&ouml;nnen wir folgendes tun:<\/p>\n<ul>\n<li>Filter auslesen<\/li>\n<li>Sortierung auslesen<\/li>\n<li>SQL-Ausdruck zusammenstellen, der per <b>SELECT <\/b>alle Datens&auml;tze der Tabelle liefert und f&uuml;r die Schl&uuml;sselw&ouml;rter <b>WHERE <\/b>und <b>ORDER BY <\/b>die angewendeten Filter und Sortierungen eintr&auml;gt<\/li>\n<li>Aus diesem SQL-Ausdruck eine Abfrage erstellen und speichern und diese Abfrage dann als Datenquelle f&uuml;r den Export mit <b>DoCmd.TransferSpreadsheet<\/b> verwenden<\/li>\n<li>Die Abfrage wieder l&ouml;schen<\/li>\n<\/ul>\n<h2>Aktuellen Filter ermitteln<\/h2>\n<p>Die grobe, auf unser konkretes Beispiel ausgelegte Prozedur f&uuml;r diesen Zweck finden wir in Listing 1. Die Prozedur legt in der Variablen <b>strExcel <\/b>den Pfad der Zieldatei fest, die im aktuellen Verzeichnis unter dem Namen <b>Beispiele.xlsx <\/b>gespeichert werden soll.<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>cmdExport_Click()\r\n     <span style=\"color:blue;\">Dim <\/span>db<span style=\"color:blue;\"> As <\/span>DAO.Database\r\n     <span style=\"color:blue;\">Dim <\/span>qdf<span style=\"color:blue;\"> As <\/span>QueryDef\r\n     <span style=\"color:blue;\">Dim <\/span>strQuery<span style=\"color:blue;\"> As String<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>strSQL<span style=\"color:blue;\"> As String<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>strFilter<span style=\"color:blue;\"> As String<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>strExcel<span style=\"color:blue;\"> As String<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>strOrderBy<span style=\"color:blue;\"> As String<\/span>\r\n     strExcel = CurrentProject.Path & \"\\Beispiele.xlsx\"\r\n     On Error Resume <span style=\"color:blue;\">Next<\/span>\r\n     Kill strExcel\r\n     <span style=\"color:blue;\">On Error GoTo<\/span> 0\r\n     <span style=\"color:blue;\">Set<\/span> db = CurrentDb\r\n     strQuery = \"qryTemp\"\r\n     strSQL = \"SELECT * FROM tblBeispiele\"\r\n     <span style=\"color:blue;\">If <\/span>Me!sfmExportExcel.Form.FilterOn = <span style=\"color:blue;\">True<\/span><span style=\"color:blue;\"> Then<\/span>\r\n         strFilter = Me!sfmExportExcel.Form.Filter\r\n     <span style=\"color:blue;\">End If<\/span>\r\n     <span style=\"color:blue;\">If <\/span>Me!sfmExportExcel.Form.OrderByOn = <span style=\"color:blue;\">True<\/span><span style=\"color:blue;\"> Then<\/span>\r\n         strOrderBy = Me!sfmExportExcel.Form.OrderBy#\r\n     <span style=\"color:blue;\">End If<\/span>\r\n     <span style=\"color:blue;\">If <\/span><span style=\"color:blue;\">Not<\/span> <span style=\"color:blue;\">Len<\/span>(strFilter) = 0<span style=\"color:blue;\"> Then<\/span>\r\n         strSQL = strSQL & \" WHERE \" & strFilter\r\n     <span style=\"color:blue;\">End If<\/span>\r\n     <span style=\"color:blue;\">If <\/span><span style=\"color:blue;\">Not<\/span> <span style=\"color:blue;\">Len<\/span>(strOrderBy) = 0<span style=\"color:blue;\"> Then<\/span>\r\n         strSQL = strSQL & \" ORDER BY \" & strOrderBy\r\n     <span style=\"color:blue;\">End If<\/span>\r\n     <span style=\"color:blue;\">Set<\/span> qdf = db.CreateQueryDef(strQuery, strSQL)\r\n     DoCmd.TransferSpreadsheet acExport, acSpreadsheetTypeExcel12Xml, strQuery, strExcel, <span style=\"color:blue;\">True<\/span>\r\n     db.QueryDefs.Delete strQuery\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 1: Exportieren der aktuellen Daten des Unterformulars in eine Excel-Tabelle<\/span><\/b><\/p>\n<p>Gegebenenfalls ist diese Datei bereits vorhanden. F&uuml;r diesen Fall f&uuml;hren die <b>Kill<\/b>-Anweisung mit dem Pfad aus <b>strExcel <\/b>aus &#8211; dies bei deaktivierter Fehlerbehandlung, damit keine Fehlermeldung erscheint, wenn die Datei nicht vorhanden sein sollte und die <b>Kill<\/b>-Anweisung ins Leere l&auml;uft.<\/p>\n<p>Dann referenziert die Prozedur das aktuelle Datenbankobjekt und legt in <b>strQuery <\/b>den Namen f&uuml;r die tempor&auml;r zu erzeugende Abfrage fest, hier <b>qryTemp<\/b>.<\/p>\n<p>Die grundlegende SQL-Anweisung legen wir als <b>SELECT<\/b>-Anweisung &uuml;ber alle Felder der Tabelle <b>tblBeispiele <\/b>fest. Dann pr&uuml;ft die Prozedur anhand der Eigenschaft <b>FilterOn <\/b>des Unterformulars, ob der Filter aktiviert ist. In diesem Fall tr&auml;gt sie den aktuellen Filter in die Variable <b>strFilter <\/b>ein. Das Gleiche erledigen wir auch f&uuml;r die Sortierung, indem wir den Wert von <b>OrderByOn <\/b>pr&uuml;fen und gegebenenfalls den Inhalt der Eigenschaft <b>OrderBy <\/b>in die Variable <b>strOrderBy <\/b>eintragen.<\/p>\n<p>Hat <b>strFilter <\/b>einen Wert, h&auml;ngen wir an die <b>SELECT<\/b>-Anweisung in <b>strSQL <\/b>eine entsprechende <b>WHERE<\/b>-Klausel an. Gleiches erledigen wir f&uuml;r die <b>ORDER BY<\/b>-Klausel, wenn <b>strOrderBy <\/b>keine leere Zeichenkette enth&auml;lt.<\/p>\n<p>Schlie&szlig;lich erstellen wir mit der <b>CreateQueryDef<\/b>-Methode des <b>Database<\/b>-Objekts eine neue Abfrage mit dem Namen aus <b>strQuery <\/b>und der SQL-Anweisung aus <b>strSQL<\/b>.<\/p>\n<p>Damit k&ouml;nnen wir nun den eigentlichen Export starten. Dazu nutzen wir die Methode <b>TransferSpreadsheet <\/b>der <b>DoCmd<\/b>-Klasse. Diese nutzt f&uuml;r die beiden ersten Parameter die Werte <b>acExport <\/b>und <b>acSpreadsheetTypeExcel12Xml<\/b>, damit ein Export in eine <b>.xlsx<\/b>-Datei angesto&szlig;en wird. Der dritte Parameter enth&auml;lt den Namen der Datenquelle, in diesem Fall der mit <b>strQuery <\/b>angegebenen Abfrage. Mit dem vierten Parameter geben wir die zu erstellende Datei an und mit dem f&uuml;nften die Information, dass Spalten&uuml;berschriften mit exportiert werden sollen. Schlie&szlig;lich l&ouml;schen wir die Abfrage aus <b>strQuery <\/b>wieder.<\/p>\n<p>Anschlie&szlig;end f&uuml;hren wir eine absteigende Sortierung nach dem Feld <b>ID <\/b>und eine Filterung nach dem Feld <b>Beispieltext <\/b>aus, der nur noch Werte liefert, die ein <b>A <\/b>enthalten. Dann &ouml;ffnen wir die erstellte Excel-Datei und finden genau die Daten vor, wie wir sie im Unterformular definiert haben (siehe Bild 3).<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2024_03\/pic_1496_003.png\" alt=\"Der Export mit Filter und Sortierung\" width=\"624,559\" height=\"370,6797\"\/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 3: Der Export mit Filter und Sortierung<\/span><\/b><\/p>\n<h2>Variable Gestaltung der Prozedur f&uuml;r den Export nach Excel<\/h2>\n<p>Damit haben wir eine recht spezifische Implementierung geschaffen. Diese werden wir nun ein wenig flexibler gestalten, sodass sich diese leicht auf andere Formulare &uuml;bertragen l&auml;sst. Warum aber sollten wir das &uuml;berhaupt tun?<\/p>\n<ul>\n<li>Weil wir sonst immer die Referenz zum Unterformular anpassen m&uuml;ssten.<\/li>\n<li>Weil wir die Tabelle, auf der die Datensatzherkunft des Unterformulars und somit der Excel-Export basiert, bisher fix angegeben haben. Auch diese wollen wir dynamisch ermitteln.<\/li>\n<li>Weil wir noch nicht ber&uuml;cksichtigen, dass die Datensatzquelle des Unterformulars selbst auch noch Filter und Sortierungen enthalten k&ouml;nnten.<\/li>\n<\/ul>\n<h2>Auswahl der Zieldatei<\/h2>\n<p>Dazu f&uuml;gen wir zun&auml;chst ein Textfeld namens <b>txtExportdatei <\/b>hinzu sowie eine Schaltfl&auml;che namens <b>cmdDateiauswahl<\/b>. Diese statten wir f&uuml;r das Ereignis <b>Beim Klicken <\/b>mit der folgenden Prozedur aus:<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>cmdDateiauswahl_Click()\r\n     <span style=\"color:blue;\">Dim <\/span>objFiledialog<span style=\"color:blue;\"> As <\/span>Office.FileDialog\r\n     <span style=\"color:blue;\">Set<\/span> objFiledialog = _\r\n         Application.FileDialog(msoFileDialogSaveAs)\r\n     <span style=\"color:blue;\">With<\/span> objFiledialog\r\n         .Title = \"Zieldatei festlegen\"\r\n         .InitialFileName = _\r\n             CurrentProject.Path & \"\\Export.xlsx\"\r\n         <span style=\"color:blue;\">If <\/span>.Show = <span style=\"color:blue;\">True<\/span><span style=\"color:blue;\"> Then<\/span>\r\n             Me!txtExportdatei = .SelectedItems.Item(1)\r\n         <span style=\"color:blue;\">End If<\/span>\r\n     End <span style=\"color:blue;\">With<\/span>\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p>Diese &ouml;ffnet einen Dialog, mit dem wir die zu erstellende Datei festlegen k&ouml;nnen. Die gew&auml;hlte Datei landet im Textfeld <b>txtExportdatei<\/b>.<\/p>\n<h2>Funktion zum Exportieren der Excel-Datei<\/h2>\n<p>F&uuml;r maximale Flexibilit&auml;t haben wir eine Funktion geschrieben, die Sie von einer Schaltfl&auml;che aus aufrufen k&ouml;nnen. Die Beispielschaltfl&auml;che <b>cmdExportFlexibel <\/b>nutzt dazu den folgenden Aufruf:<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>cmdExportFlexibel_Click()\r\n     ExportFlexibel Me!txtExportdatei, Me!sfmExportExcel.Form\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p>Die Funktion <b>ExportFlexibel <\/b>aus Listing 2 verwendet diese Daten. Alles weitere ist tats&auml;chlich flexibel &#8211; Sie k&ouml;nnen diese Funktion f&uuml;r alle weiteren Formulare mit Unterformular so nutzen.<\/p>\n<pre><span style=\"color:blue;\">Public Sub <\/span>ExportFlexibel(strExcelpath<span style=\"color:blue;\"> As String<\/span>, sfm<span style=\"color:blue;\"> As <\/span>Form)\r\n     <span style=\"color:blue;\">Dim <\/span>db<span style=\"color:blue;\"> As <\/span>DAO.Database\r\n     <span style=\"color:blue;\">Dim <\/span>qdf<span style=\"color:blue;\"> As <\/span>QueryDef\r\n     <span style=\"color:blue;\">Dim <\/span>strQuery<span style=\"color:blue;\"> As String<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>strSQL<span style=\"color:blue;\"> As String<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>strFilter<span style=\"color:blue;\"> As String<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>strOrderBy<span style=\"color:blue;\"> As String<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>strRecordsource<span style=\"color:blue;\"> As String<\/span>\r\n     On Error Resume <span style=\"color:blue;\">Next<\/span>\r\n     Kill strExcelpath\r\n     <span style=\"color:blue;\">On Error GoTo<\/span> 0\r\n     <span style=\"color:blue;\">Set<\/span> db = CurrentDb\r\n     strQuery = \"qryTemp\"\r\n     <span style=\"color:blue;\">If <\/span><span style=\"color:blue;\">Left<\/span>(sfm.RecordSource, 6) = \"SELECT\"<span style=\"color:blue;\"> Then<\/span>\r\n         strSQL = sfm.RecordSource\r\n     <span style=\"color:blue;\">Else<\/span>\r\n         strSQL = \"SELECT * FROM \" & sfm.RecordSource\r\n     <span style=\"color:blue;\">End If<\/span>\r\n     <span style=\"color:blue;\">If <\/span>sfm.FilterOn = <span style=\"color:blue;\">True<\/span><span style=\"color:blue;\"> Then<\/span>\r\n         strFilter = sfm.Filter\r\n     <span style=\"color:blue;\">End If<\/span>\r\n     <span style=\"color:blue;\">If <\/span>sfm.OrderByOn = <span style=\"color:blue;\">True<\/span><span style=\"color:blue;\"> Then<\/span>\r\n         strOrderBy = sfm.OrderBy\r\n     <span style=\"color:blue;\">End If<\/span>\r\n     strSQL = AddWhereAndOrderByToSQL(strSQL, strFilter, strOrderBy)\r\n     <span style=\"color:blue;\">Set<\/span> qdf = db.CreateQueryDef(strQuery, strSQL)\r\n     DoCmd.TransferSpreadsheet acExport, acSpreadsheetTypeExcel12Xml, strQuery, strExcelpath, <span style=\"color:blue;\">True<\/span>\r\n     db.QueryDefs.Delete strQuery\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 2: Exportieren der aktuellen Daten des Unterformulars in eine Excel-Tabelle, flexible Variante<\/span><\/b><\/p>\n<p>Auch diese Prozedur l&ouml;scht zun&auml;chst eine eventuell bereits vorhandene Zieldatei. Wir verwenden weiterhin den Namen <b>qryTemp <\/b>f&uuml;r die tempor&auml;re Datei.<\/p>\n<p>Der n&auml;chste Schritt unterscheidet sich bereits deutlich von der ersten Variante. Hier verwenden wir n&auml;mlich nicht einfach die Abfrage <b>SELECT * FROM tblBeispiele <\/b>als Datensatzherkunft f&uuml;r die zu erstellende Abfrage als Quelle f&uuml;r den Export, sondern untersuchen die Datensatzquelle des Unterformulars explizit.<\/p>\n<p>Dazu pr&uuml;fen wir, ob die ersten sechs Buchstaben der Datensatzquelle dem Ausdruck <b>SELECT <\/b>entsprechen. In diesem Fall enth&auml;lt die Datensatzquelle gegebenenfalls selbst eine <b>WHERE<\/b>&#8211; oder <b>ORDER BY<\/b>-Klausel. Hier weisen wir den Inhalt von <b>sfm.RecordSource <\/b>direkt der Variablen <b>strSQL <\/b>zu:<\/p>\n<pre>     <span style=\"color:blue;\">If <\/span><span style=\"color:blue;\">Left<\/span>(sfm.RecordSource, 6) = \"SELECT\"<span style=\"color:blue;\"> Then<\/span>\r\n         strSQL = sfm.RecordSource<\/pre>\n<p>Anderenfalls erstellen wir eine <b>SELECT<\/b>-Anweisung auf Basis der angegebenen Tabelle oder Abfrage:<\/p>\n<pre>     <span style=\"color:blue;\">Else<\/span>\r\n         strSQL = \"SELECT * FROM \" & sfm.RecordSource\r\n     <span style=\"color:blue;\">End If<\/span><\/pre>\n<p>Dann tragen wir, sofern der Filter und die Sortierung aktiviert sind, die entsprechenden Ausdr&uuml;cke aus den Eigenschaften <b>Filter <\/b>und <b>OrderBy <\/b>in die Variablen <b>strFilter <\/b>und <b>strOrderBy <\/b>ein.<\/p>\n<h2>SQL-Ausdruck zusammenstellen<\/h2>\n<p>Nun folgt eine gr&ouml;&szlig;ere Operation, n&auml;mlich die Untersuchung des Inhalts von <b>strSQL <\/b>auf eventuell bereits vorhandene <b>WHERE<\/b>&#8211; oder <b>ORDER BY<\/b>-Klauseln und das Einf&uuml;gen der entsprechenden Klauseln aus dem Unterformular in diese Ausdr&uuml;cke. Diesen Teil haben wir in die Funktion <b>AddWhereAndOrderByToSQL <\/b>ausgegliedert, der wir drei Informationen &uuml;bergeben:<\/p>\n<ul>\n<li>den aktuellen SQL-Ausdruck, also die gegebenenfalls um <b>SELECT * FROM <\/b>erweiterte Datensatzquelle des Unterformulars,<\/li>\n<li>den Filterausdruck aus <b>strFilter <\/b>und <\/li>\n<li>den Sortierausdruck aus <b>strOrderBy<\/b>.<\/li>\n<\/ul>\n<p>Das Ergebnis dieser Funktion, die wir weiter unten beschreiben, landet wieder in der Variablen <b>strSQL<\/b>. Daraus erstellen wir wieder das <b>QueryDef<\/b>-Objekt, das wir als Datenquelle f&uuml;r den Aufruf von <b>DoCmd.TransferSpreadsheet <\/b>nutzen. Danach l&ouml;schen wir wie zuvor noch die f&uuml;r tempor&auml;re Zwecke erstellte Abfrage.<\/p>\n<h2>Anreichern eines SQL-Ausdrucks um weitere WHERE- und ORDER BY-Ausdr&uuml;cke<\/h2>\n<p>Warum brauchen wir eine eigene Funktion, um die f&uuml;r das Unterformular angegebenen Filter und Sortierungen hinzuzuf&uuml;gen, statt diese einfach anzuh&auml;ngen?<\/p>\n<p>Der Grund ist, dass wir als Datensatzquelle des Unterformulars durchaus einen Ausdruck wie den folgenden vorfinden k&ouml;nnen:<\/p>\n<pre>SELECT * FROM tblBeispiele WHERE Beispiel LIKE ''A*'' ORDER BY Beispiel DESC<\/pre>\n<p>Hier k&ouml;nnen wir die weiteren Filter und Sortierungen nicht einfach anh&auml;ngen, sondern wir m&uuml;ssen diese gegebenenfalls einbauen und m&uuml;ssen auch noch darauf achten, dass Schl&uuml;sselw&ouml;rter wie <b>WHERE <\/b>und <b>ORDER <\/b>BY nicht doppelt verwendet werden.<\/p>\n<p>Also nutzen wir die Funktion <b>AddWhereAndOrderToSQL <\/b>aus Listing 3, um diese Aufgabe zu erledigen. Diese nimmt die oben erw&auml;hnten Parameter entgegen und schreibt den Wert von <b>strSQL <\/b>zun&auml;chst in die Variable <b>strTemp<\/b>.<\/p>\n<pre><span style=\"color:blue;\">Public Function <\/span>AddWhereAndOrderByToSQL(strSQL<span style=\"color:blue;\"> As String<\/span>, <span style=\"color:blue;\">Optional<\/span> strFilter<span style=\"color:blue;\"> As String<\/span>, _\r\n         <span style=\"color:blue;\">Optional<\/span> strOrderBy<span style=\"color:blue;\"> As String<\/span>)<span style=\"color:blue;\"> As String<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>strTemp<span style=\"color:blue;\"> As String<\/span>\r\n     strTemp = strSQL\r\n     <span style=\"color:blue;\">If <\/span><span style=\"color:blue;\">Not<\/span> <span style=\"color:blue;\">Len<\/span>(strFilter) = 0<span style=\"color:blue;\"> Then<\/span>\r\n         <span style=\"color:blue;\">If <\/span><span style=\"color:blue;\">InStr<\/span>(1, strTemp, \"WHERE\") = 0<span style=\"color:blue;\"> Then<\/span>\r\n             <span style=\"color:blue;\">If <\/span><span style=\"color:blue;\">InStr<\/span>(1, strTemp, \"ORDER BY\") = 0<span style=\"color:blue;\"> Then<\/span>\r\n                 strTemp = strTemp & \" WHERE \" & strFilter\r\n             <span style=\"color:blue;\">Else<\/span>\r\n                 strTemp = <span style=\"color:blue;\">Replace<\/span>(strTemp, \" ORDER BY \", \" WHERE \" & strFilter & \" ORDER BY \")\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, strTemp, \"ORDER BY\") = 0<span style=\"color:blue;\"> Then<\/span>\r\n                 strTemp = strTemp & \" AND \" & strFilter\r\n             <span style=\"color:blue;\">Else<\/span>\r\n                 strTemp = <span style=\"color:blue;\">Replace<\/span>(strTemp, \" ORDER BY \", \" AND \" & strFilter & \" ORDER BY \")\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;\">If <\/span><span style=\"color:blue;\">Not<\/span> <span style=\"color:blue;\">Len<\/span>(strOrderBy) = 0<span style=\"color:blue;\"> Then<\/span>\r\n         <span style=\"color:blue;\">If <\/span><span style=\"color:blue;\">InStr<\/span>(1, strTemp, \" ORDER BY \") = 0<span style=\"color:blue;\"> Then<\/span>\r\n             strTemp = strTemp & \" ORDER BY \" & strOrderBy\r\n         <span style=\"color:blue;\">Else<\/span>\r\n             strTemp = strTemp & \", \" & strOrderBy\r\n         <span style=\"color:blue;\">End If<\/span>\r\n     <span style=\"color:blue;\">End If<\/span>\r\n     AddWhereAndOrderByToSQL = strTemp\r\n<span style=\"color:blue;\">End Function<\/span><\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 3: Funktion zum Zusammenstellen der Abfrage mit Filtern und Sortierungen<\/span><\/b><\/p>\n<p>Dann pr&uuml;ft sie, ob mit dem Parameter <b>strFilter <\/b>ein Wert &uuml;bergeben wurde. Falls ja, untersucht die Funktion, ob die aktuelle Version der Abfrage bereits das Schl&uuml;sselwort <b>WHERE <\/b>enth&auml;lt. Ist das nicht der Fall, untersucht sie weiter, ob die Abfrage eine <b>ORDER BY<\/b>-Klausel enth&auml;lt. Ist auch das nicht gegeben, k&ouml;nnen wir der Abfrage einfach das Schl&uuml;sselwort <b>WHERE<\/b> gefolgt vom Inhalt aus <b>strFilter <\/b>&uuml;bergeben.<\/p>\n<p>Falls noch keine <b>WHERE<\/b>-Klausel enthalten ist, aber eine <b>ORDER BY<\/b>-Klausel, dann m&uuml;ssen wir schon gezielter arbeiten: Die <b>WHERE<\/b>-Klausel mit dem Inhalt von <b>strFilter <\/b>m&uuml;ssen wir dann n&auml;mlich vor der <b>ORDER BY<\/b>-Klausel einf&uuml;gen. Dazu ersetzen wir <b>ORDER BY <\/b>einfach mit der <b>Replace<\/b>-Funktion durch <b>WHERE <\/b>plus <b>strFilter <\/b>plus <b>ORDER BY<\/b>.<\/p>\n<p>F&uuml;r den Fall, dass bereits eine <b>WHERE<\/b>-Bedingung in der Abfrage aus <b>strTemp <\/b>enthalten ist, untersuchen wir auch wieder, ob auch eine <b>ORDER BY<\/b>-Klausel vorliegt. Ist das nicht der Fall, k&ouml;nnen wir die Bedingung aus <b>strFilter <\/b>&auml;hnlich wie im ersten Fall hinten anh&auml;ngen &#8211; diesmal allerdings nicht mit dem f&uuml;hrenden Schl&uuml;sselwort <b>WHERE<\/b>, sondern mit <b>AND<\/b>. Das <b>WHERE<\/b>-Schl&uuml;sselwort ist ja bereits vorhanden und es darf auch nur einmal verwendet werden.<\/p>\n<p>Auch hier kann es wieder sein, dass eine <b>ORDER BY<\/b>-Klausel vorhanden ist. In diesem Fall ersetzen wir diese wieder, diesmal durch <b>AND <\/b>plus <b>strFilter <\/b>plus <b>ORDER BY<\/b>.<\/p>\n<p>Danach h&auml;ngen wir noch eine eventuell vorhandene Sortierung aus <b>strOrderBy <\/b>an. In diesem Fall pr&uuml;fen wir, ob bereits eine <b>ORDER BY<\/b>-Klausel vorliegt. Ist das nicht der Fall, h&auml;ngen wir einfach das Schl&uuml;sselwort <b>ORDER BY <\/b>gefolgt vom Inhalt von <b>strOrderBy <\/b>an. Anderenfalls ist <b>ORDER BY <\/b>bereits vorhanden &#8211; dann h&auml;ngen wir die weitere Sortierung einfach durch ein Komma getrennt daran an.<\/p>\n<p>Das Ergebnis aus <b>strTemp <\/b>geben wir schlie&szlig;lich als Funktionswert der Funktion <b>AddWhereAndOrderByToSQL <\/b>an die aufrufende Routine zur&uuml;ck.<\/p>\n<h2>Nur die angezeigten Felder ber&uuml;cksichtigen<\/h2>\n<p>Es gibt noch eine w&uuml;nschenswerte Erweiterung dieses Tools: Vielleicht m&ouml;chte der Benutzer, dass auch nur die Felder, die im Unterformular angezeigt werden, im Ergebnis ausgegeben werden.<\/p>\n<p>Hier wird es etwas komplizierter, denn wir m&uuml;ssten diese Spalten durchlaufen, eine Liste daraus bilden und diese im einfachsten Fall f&uuml;r das Sternchen in <b>SELECT * FROM &#8230; <\/b>einf&uuml;gen &#8211; oder eben f&uuml;r die Feldliste, die sich zwischen <b>SELECT <\/b>und <b>FROM<\/b>-Schl&uuml;sselwort befindet.<\/p>\n<p>Hierf&uuml;r setzen wir voraus, dass die Daten des Unterformulars aus einer einzigen Tabelle oder Abfrage stammen. <\/p>\n<p>Dazu haben wir zun&auml;chst die einfache Personen-Tabelle noch um einige Spalten erweitert. Au&szlig;erdem haben wir eine Kopie der Formulare <b>frmExportExcel <\/b>und <b>sfmExportExcel <\/b>unter den Namen <b>frmExportExcelNurAngezeigteFelder <\/b>und <b>sfmExportExcelNurAngezeigteFelder <\/b>erstellt. Letztere zeigt die Daten der Tabelle <b>tblPersonen <\/b>an.<\/p>\n<p>Dem Hauptformular f&uuml;gen wir noch ein Kontrollk&auml;stchen namens <b>chkNurAngezeigteFelder <\/b>hinzu (siehe Bild 4), dessen Standardwert wir auf Falsch eingestellt haben.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2024_03\/pic_1496_004.png\" alt=\"Erweitertes Formular\" width=\"499,5589\" height=\"362,553\"\/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 4: Erweitertes Formular<\/span><\/b><\/p>\n<p>In der Prozedur, die durch die Schaltfl&auml;che <b>cmdExportFlexibel <\/b>ausgel&ouml;st wird, passen wir den Aufruf der Prozedur <b>ExportFlexibel <\/b>wie folgt an:<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>cmdExportFlexibel_Click()\r\n     <span style=\"color:blue;\">Dim <\/span>strPath<span style=\"color:blue;\"> As String<\/span>\r\n     strPath = Nz(Me!txtExportdatei, \"\")\r\n     <span style=\"color:blue;\">If <\/span><span style=\"color:blue;\">Not<\/span> <span style=\"color:blue;\">Len<\/span>(strPath) = 0<span style=\"color:blue;\"> Then<\/span>\r\n         ExportFlexibel Me!txtExportdatei, _\r\n             Me!sfmExportExcel.Form, _\r\n             Me!chkNurAngezeigteFelder\r\n     <span style=\"color:blue;\">Else<\/span>\r\n         <span style=\"color:blue;\">MsgBox<\/span> \"W&auml;hle zuerst eine Zieldatei aus.\"\r\n         <span style=\"color:blue;\">Exit Sub<\/span>\r\n     <span style=\"color:blue;\">End If<\/span>\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p>Diesen dritten Parameter m&uuml;ssen wir in der aufgerufenen Prozedur <b>ExportFlexibel<\/b> verarbeiten. Damit auch der Aufruf vom Formular <b>frmExportExcel <\/b>noch funktioniert, wo wir diesen Parameter nicht verwenden, legen wir diesen Parameter als optionalen Parameter an.<\/p>\n<p>Die Anpassungen in der Prozedur <b>ExportFlexibel <\/b>sind &uuml;berschaubar. Das liegt daran, dass wir die Logik zum Ermitteln der angezeigten Felder im Formular und ihre Integration in den Abfrageausdruck f&uuml;r den Export in eine eigene Funktion ausgliedern. Die neue Version der Prozedur <b>ExportFlexibel <\/b>sieht somit wie folgt aus &#8211; wir f&uuml;gen nur den Parameter und den Aufruf einer weiteren Funktion namens <b>ReplaceFieldsByVisibleFields <\/b>ein:<\/p>\n<pre><span style=\"color:blue;\">Public Sub <\/span>ExportFlexibel(strExcelpath<span style=\"color:blue;\"> As String<\/span>, _\r\n         sfm<span style=\"color:blue;\"> As <\/span>Form, _\r\n         <span style=\"color:blue;\">Optional<\/span> bolNurAngezeigteFelder<span style=\"color:blue;\"> As Boolean<\/span>)\r\n     ...\r\n     strSQL = AddWhereAndOrderByToSQL(strSQL, strFilter, _\r\n         strOrderBy)\r\n     <span style=\"color:blue;\">If <\/span>bolNurAngezeigteFelder = <span style=\"color:blue;\">True<\/span><span style=\"color:blue;\"> Then<\/span>\r\n         strSQL = ReplaceFieldsByVisibleFields(strSQL, sfm)\r\n     <span style=\"color:blue;\">End If<\/span>\r\n     <span style=\"color:blue;\">Set<\/span> qdf = db.CreateQueryDef(strQuery, strSQL)\r\n     ...\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p>Diese Funktion erwartet zwei Parameter &#8211; den aktuellen SQL-Ausdruck mit <b>strSQL <\/b>und einen Verweis auf das Unterformular mit <b>sfm<\/b>. <b>strSQL <\/b>enth&auml;lt im aktuellen Zustand einen von zwei Werten:<\/p>\n<p>Wenn eine <b>SELECT<\/b>-Anweisung als Datensatzquelle f&uuml;r das Unterformular angegeben wurde, enth&auml;lt <b>strSQL <\/b>genau diese Abfrage. Wenn hingegen der Name einer Tabelle oder Abfrage angegeben wurde, enth&auml;lt <b>strSQL <\/b>eine SQL-Anweisung, die aus <b>SELECT * FROM <\/b>und dem Namen der Tabelle oder Abfrage besteht.<\/p>\n<p>In beiden F&auml;llen gibt <b>ExportFlexibel <\/b>im aktuellen Zustand alle Felder der so zusammengestellten SQL-Anweisung in die Excel-Tabelle aus &#8211; auch wenn wir nur einige dieser Felder im Unterformular anzeigen. Und auch hier gibt es noch eine Differenzierung: Wir k&ouml;nnen von Anfang an nur bestimmte Felder der Datensatzquelle in den Detailbereich des Unterformulars ziehen. Und dann kann der Benutzer auch noch einzelne Felder aus dem Datenblatt ausblenden (siehe Bild 5).<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2024_03\/pic_1496_005.png\" alt=\"Felder ausblenden im Formular\" width=\"499,5589\" height=\"463,4897\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 5: Felder ausblenden im Formular<\/span><\/b><\/p>\n<p>Wir wollen am Ende nur die tats&auml;chlich sichtbaren Felder in die Excel-Tabelle exportieren, sofern der Benutzer das Kontrollk&auml;stchen mit dem Text <b>Nur angezeigte Felder <\/b>markiert hat.<\/p>\n<p>Also nutzen wir die oben erw&auml;hnte Funktion <b>ReplaceFieldsByVisibleFields<\/b>, um im SQL-Ausdruck <b>strSQL <\/b>das Sternchen (*) oder die Feldliste durch die Liste der tats&auml;chlich angezeigten Felder zu ersetzen.<\/p>\n<p>Diese Funktion finden wir in Listing 4. Die Funktion k&uuml;mmert sich nicht nur darum, nur die sichtbaren Felder zusammenzustellen und in die SQL-Abfrage zu integrieren, sondern sie untersucht auch noch die Reihenfolge, in welcher die Felder angezeigt werden. Wie das gelingt, schauen wir uns nun im Detail an.<\/p>\n<pre><span style=\"color:blue;\">Public Function <\/span>ReplaceFieldsByVisibleFields(strSQL<span style=\"color:blue;\"> As String<\/span>, sfm<span style=\"color:blue;\"> As <\/span>Form)<span style=\"color:blue;\"> As String<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>ctl<span style=\"color:blue;\"> As <\/span>Control\r\n     <span style=\"color:blue;\">Dim <\/span>strTemp<span style=\"color:blue;\"> As String<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>strControlSource<span style=\"color:blue;\"> As String<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>strFields()<span style=\"color:blue;\"> As String<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>strFieldlist<span style=\"color:blue;\"> As String<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>lngField<span style=\"color:blue;\"> As Long<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>lngCountVisibleFields<span style=\"color:blue;\"> As Long<\/span>\r\n     strTemp = strSQL\r\n     For Each ctl In sfm.Controls\r\n         strControlSource = \"\"\r\n         On Error Resume <span style=\"color:blue;\">Next<\/span>\r\n         strControlSource = ctl.ControlSource\r\n         <span style=\"color:blue;\">On Error GoTo<\/span> 0\r\n         <span style=\"color:blue;\">If <\/span><span style=\"color:blue;\">Not<\/span> <span style=\"color:blue;\">Len<\/span>(strControlSource) = 0<span style=\"color:blue;\"> Then<\/span>\r\n             lngCountVisibleFields = lngCountVisibleFields + 1\r\n         <span style=\"color:blue;\">End If<\/span>\r\n     <span style=\"color:blue;\">Next<\/span> ctl\r\n     ReDim strFields(lngCountVisibleFields - 1, 1)\r\n     For Each ctl In sfm.Controls\r\n         strControlSource = \"\"\r\n         On Error Resume <span style=\"color:blue;\">Next<\/span>\r\n         strControlSource = ctl.ControlSource\r\n         <span style=\"color:blue;\">On Error GoTo<\/span> 0\r\n         <span style=\"color:blue;\">If <\/span><span style=\"color:blue;\">Len<\/span>(strControlSource) &gt; 0<span style=\"color:blue;\"> Then<\/span>\r\n             strFields(ctl.ColumnOrder - 1, 0) = strControlSource\r\n             strFields(ctl.ColumnOrder - 1, 1) = ctl.ColumnHidden\r\n         <span style=\"color:blue;\">End If<\/span>\r\n     <span style=\"color:blue;\">Next<\/span> ctl\r\n     For lngField = 0 To lngCountVisibleFields - 1\r\n         <span style=\"color:blue;\">If <\/span>strFields(lngField, 1) = <span style=\"color:blue;\">False<\/span><span style=\"color:blue;\"> Then<\/span>\r\n             strFieldlist = strFieldlist & \", \" & strFields(lngField, 0)\r\n         <span style=\"color:blue;\">End If<\/span>\r\n     <span style=\"color:blue;\">Next<\/span> lngField\r\n     <span style=\"color:blue;\">If <\/span><span style=\"color:blue;\">Not<\/span> <span style=\"color:blue;\">Len<\/span>(strFieldlist) = 0<span style=\"color:blue;\"> Then<\/span>\r\n         strFieldlist = <span style=\"color:blue;\">Mid<\/span>(strFieldlist, 3)\r\n         strTemp = \"SELECT \" & strFieldlist & <span style=\"color:blue;\">Mid<\/span>(strTemp, <span style=\"color:blue;\">InStr<\/span>(1, strTemp, \" FROM\"))\r\n     <span style=\"color:blue;\">End If<\/span>\r\n     ReplaceFieldsByVisibleFields = strTemp\r\n<span style=\"color:blue;\">End Function<\/span><\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 4: Funktion zum Zusammenstellen der sichtbaren Felder in der richtigen Reihenfolge<\/span><\/b><\/p>\n<p>Die Funktion schreibt zun&auml;chst den &uuml;bergebenen SQL-String aus <b>strSQL <\/b>in die tempor&auml;re Variable <b>strTemp<\/b>. Dann durchl&auml;uft sie alle Steuerelemente des Unterformulars &uuml;ber die <b>Controls<\/b>-Auflistung des Objekts <b>sfm<\/b>.<\/p>\n<p>Hier stellen wir noch nicht die Feldliste zusammen, sondern wir ermitteln die Anzahl der Steuerelemente im Unterformular, die Werte anzeigen.<\/p>\n<p>Man sollte meinen, das k&ouml;nnten wir normalerweise leicht erledigen, indem wir die Steuerelemente durchlaufen und die Eigenschaft <b>ColumnHidden <\/b>&uuml;berpr&uuml;fen. Allerdings gibt es da ein paar H&uuml;rden. Erstens enth&auml;lt die Auflistung <b>Controls <\/b>die Steuerelemente nicht zwangsl&auml;ufig in der Reihenfolge, in der diese im Formular angezeigt werden, da der Benutzer die Reihenfolge per Drag and Drop &auml;ndern kann.<\/p>\n<p>Stattdessen k&ouml;nnen wir die Reihenfolge nur &uuml;ber die Eigenschaft <b>ColumnOrder <\/b>ermitteln, die einen Index f&uuml;r die Reihenfolge zur&uuml;ckliefert. Au&szlig;erdem enth&auml;lt die <b>Controls<\/b>-Auflistung des Formulars nicht nur die gebundenen Steuerelemente, also solche, deren Werte angezeigt werden, sondern auch noch Bezeichnungsfelder. Wir gehen also folgenderma&szlig;en vor:<\/p>\n<ul>\n<li>Ermitteln der Anzahl der gebundenen Steuerelemente<\/li>\n<li>Anlegen eines Arrays mit der Anzahl dieser Felder und mit zwei Dimensionen, damit wir den Namen der gebundenen Spalte eintragen k&ouml;nnen und die Information, ob das Feld sichtbar ist.<\/li>\n<li>F&uuml;llen des Arrays beim Durchlaufen aller Steuerelemente<\/li>\n<li>Zusammenstellen der Liste der gebundenen Felder<\/li>\n<li>Integration dieser Feldliste in den &uuml;bergebenen SQL-Ausdruck<\/li>\n<\/ul>\n<p>Wir nehmen an, der Benutzer hat die Felder <b>AnredeID<\/b>, <b>Vorname <\/b>und <b>Nachname <\/b>ausgeblendet und au&szlig;erdem das Feld <b>Strasse <\/b>hinter <b>PLZ <\/b>und <b>Ort <\/b>verschoben (siehe Bild 6).<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2024_03\/pic_1496_006.png\" alt=\"Beispiel f&uuml;r den Export ohne ausgeblendet Felder und mit Sortierung\" width=\"524,559\" height=\"153,1819\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 6: Beispiel f&uuml;r den Export ohne ausgeblendet Felder und mit Sortierung<\/span><\/b><\/p>\n<p>Den ersten Schritt k&ouml;nnen wir bereits nicht einfach durch Ermitteln der Steuerelementanzahl mit <b>sfm.Controls.Count <\/b>durchf&uuml;hren, weil wir nur die gebundenen Felder haben wollen. Also durchlaufen wir eine Schleife &uuml;ber alle Steuerelemente und pr&uuml;fen zun&auml;chst einmal, ob es sich um ein gebundenes Feld handelt.<\/p>\n<p>Hier durchlaufen wir die Steuerelemente in der Reihenfolge, die durch die Eigenschaft <b>Reihenfolgenposition <\/b>festgelegt ist. Dazu leeren wir eine Variable namens <b>strControlSource <\/b>und versuchen dann, diese bei deaktivierter Fehlerbehandlung mit dem Inhalt der Eigenschaft <b>ControlSource <\/b>des Steuerelements zu f&uuml;llen.<\/p>\n<p>Diese ist nur gef&uuml;llt, wenn das Steuerelement gebunden ist, ansonsten l&ouml;st der Zugriff einen Fehler aus, den wir aber unterbinden.<\/p>\n<p>Anschlie&szlig;end pr&uuml;fen wir, ob <b>strControlSource <\/b>einen Wert enth&auml;lt, was nur der Fall ist, wenn das Steuerelement aus <b>ctl <\/b>gebunden ist. Ist das der Fall, erh&ouml;hen wir den Wert der Variablen <b>lngCountVisibleFields <\/b>um <b>1<\/b>. Im Beispiel nehmen wir damit alle Felder der Tabelle <b>tblPersonen <\/b>auf, was insgesamt acht Felder sind.<\/p>\n<p>Damit haben wir die Anzahl der Felder ermittelt und k&ouml;nnen das Array <b>strFields <\/b>nun auf diese Anzahl minus <b>1 <\/b>f&uuml;r die erste Dimension und den Wert <b>1 <\/b>f&uuml;r die zweite Dimension redimensionieren. Da das Array 0-basiert ist, passen diese Werte.<\/p>\n<p>Dann durchlaufen wir in einer zweiten <b>For Each<\/b>-Schleife erneut alle Steuerelemente. Wieder pr&uuml;fen wir, ob es sich um ein gebundenes Steuerelement handelt und nur dann tragen wir die Informationen des Steuerelements in das Array <b>strFields <\/b>ein, und zwar f&uuml;r das Element, dessen Wert in der ersten Dimension dem Reihenfolge-Wert des Steuerelements entspricht, also <b>ctl.ColumnOrder<\/b>, minus <b>1<\/b>.<\/p>\n<p>F&uuml;r dieses tragen wir in der ersten Spalte den Namen des gebundenen Feldes ein und in der zweiten Spalte den Wert der Eigenschaft <b>ctl.ColumnHidden<\/b>. Im Beispiel enth&auml;lt das Array nun die folgenden Werte:<\/p>\n<pre>  0            PersonID      Falsch\r\n  1            AnredeID      Wahr\r\n  2            Vorname       Wahr\r\n  3            Nachname      Wahr\r\n  4            PLZ           Falsch\r\n  5            Ort           Falsch\r\n  6            Strasse       Falsch\r\n  7            Land          Falsch<\/pre>\n<p>Damit k&ouml;nnen wir nun in einer dritten Schleife die Elemente des Arrays durchlaufen und alle Elemente, die in der zweiten Spalte den Wert <b>False <\/b>enthalten, die also nicht unsichtbar sind, in einer durch Kommata getrennten Liste in der Variablen <b>strFieldlist <\/b>zusammen. F&uuml;r unser Beispiel erhalten wir somit die folgende Liste:<\/p>\n<pre>, PersonID, PLZ, Ort, Strasse, Land<\/pre>\n<p>Ist diese Liste anschlie&szlig;end nicht leer, entfernen wir das f&uuml;hrende Komma:<\/p>\n<pre>, PersonID, PLZ, Ort, Strasse, Land<\/pre>\n<p>Dann ersetzen wir das Sternchen (<b>*<\/b>) oder die vorhandene Feldliste in <b>strTemp <\/b>durch die neue Liste. Den Inhalt der Variablen <b>strTemp <\/b>geben wir dann als Funktionsergebnis zur&uuml;ck.<\/p>\n<h2>Einsetzen der L&ouml;sung in anderen Formularen\/Unterformularen<\/h2>\n<p>Damit erhalten wir eine flexible L&ouml;sung: Wenn Sie diese in einem anderen Formular einsetzen wollen, das Daten in einem Unterformular anzeigt, sind folgende Schritte n&ouml;tig:<\/p>\n<ul>\n<li>Einf&uuml;gen der Funktion <b>ExportFlexibel <\/b>und <b>AddWhereAndOrderByToSQL <\/b>in die Zieldatenbank. Die beiden Funktionen haben wir der Einfachheit halber in das Modul <b>mdlExportExcelFromSubform <\/b>geschrieben.<\/li>\n<li>Hinzuf&uuml;gen einer Schaltfl&auml;che, welche die Funktion <b>ExportFlexibel <\/b>aufruft und dieser den Pfad der zu erstellenden Excel-Datei und einen Verweis auf das Unterformular &uuml;bergibt.<\/li>\n<\/ul>\n<p>Das war es schon! <\/p>\n<h2>Zusammenfassung und Ausblick<\/h2>\n<p>Mit der kleinen L&ouml;sung aus diesem Beitrag k&ouml;nnen Sie Formularen, die ihre Daten in einem Unterformular in der Datenblattansicht anzeigen, eine Funktion zum Exportieren dieser Daten in eine Excel-Datei hinzuf&uuml;gen. Die Funktionen sind in einem eigenen Modul gekapselt, sodass diese einfach zu einer bestehenden Anwendung hinzugef&uuml;gt werden k&ouml;nnen.<\/p>\n<h2>Downloads zu diesem Beitrag<\/h2>\n<p>Enthaltene Beispieldateien:<\/p>\n<p>ExportAktuelleAnsichtAnExcel.accdb<\/p>\n<p><a href=\"..\/fileadmin\/beispiele\/7D4786E2-26AE-4D67-9661-57187C566433\/aiu_1496.zip\">Download<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>In Unterformularen in der Datenblattansicht lassen sich Daten prima filtern oder sortieren. Mit der DoCmd-Methode TransferSpreadsheet lassen sich Daten einer Tabelle oder Abfrage einfach in eine Excel-Datei exportieren. Aber wie bekommen wir beides unter einen Hut? Wir m&ouml;chten also in einem Unterformular die Daten filtern und sortieren k&ouml;nnen und diese in dieser Ansicht in eine Excel-Datei exportieren k&ouml;nnen. Dazu brauchen wir ein wenig VBA und Kenntnisse der Eigenschaften eines Formulars. In diesem Beitrag zeigen wir, wie wir die Daten der Datenherkunft des Unterformulars wie im Unterformular angegeben filtern und sortieren und so in eine Excel-Datei schreiben.<\/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,66032024,44000026],"tags":[],"class_list":["post-55001496","post","type-post","status-publish","format-standard","hentry","category-662024","category-66032024","category-Interaktiv"],"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>Access-Unterformulare: Filtern &amp; gezielt nach Excel exportieren - 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\/AccessUnterformulare_Filtern__gezielt_nach_Excel_exportieren\/\" \/>\n<meta property=\"og:locale\" content=\"de_DE\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Access-Unterformulare: Filtern &amp; gezielt nach Excel exportieren\" \/>\n<meta property=\"og:description\" content=\"In Unterformularen in der Datenblattansicht lassen sich Daten prima filtern oder sortieren. Mit der DoCmd-Methode TransferSpreadsheet lassen sich Daten einer Tabelle oder Abfrage einfach in eine Excel-Datei exportieren. Aber wie bekommen wir beides unter einen Hut? Wir m&ouml;chten also in einem Unterformular die Daten filtern und sortieren k&ouml;nnen und diese in dieser Ansicht in eine Excel-Datei exportieren k&ouml;nnen. Dazu brauchen wir ein wenig VBA und Kenntnisse der Eigenschaften eines Formulars. In diesem Beitrag zeigen wir, wie wir die Daten der Datenherkunft des Unterformulars wie im Unterformular angegeben filtern und sortieren und so in eine Excel-Datei schreiben.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/access-im-unternehmen.de\/AccessUnterformulare_Filtern__gezielt_nach_Excel_exportieren\/\" \/>\n<meta property=\"og:site_name\" content=\"Access im Unternehmen\" \/>\n<meta property=\"article:published_time\" content=\"2024-06-02T21:18:51+00:00\" \/>\n<meta property=\"og:image\" content=\"http:\/\/vg02.met.vgwort.de\/na\/dd9a97150e4d484a93ef309e0a0623ef\" \/>\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=\"19\u00a0Minuten\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/AccessUnterformulare_Filtern__gezielt_nach_Excel_exportieren\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/AccessUnterformulare_Filtern__gezielt_nach_Excel_exportieren\\\/\"},\"author\":{\"name\":\"Andr\u00e9 Minhorst\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#\\\/schema\\\/person\\\/13395c4bcd7d7963efe33be9c584d93f\"},\"headline\":\"Access-Unterformulare: Filtern &#038; gezielt nach Excel exportieren\",\"datePublished\":\"2024-06-02T21:18:51+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/AccessUnterformulare_Filtern__gezielt_nach_Excel_exportieren\\\/\"},\"wordCount\":3228,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#organization\"},\"image\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/AccessUnterformulare_Filtern__gezielt_nach_Excel_exportieren\\\/#primaryimage\"},\"thumbnailUrl\":\"http:\\\/\\\/vg02.met.vgwort.de\\\/na\\\/dd9a97150e4d484a93ef309e0a0623ef\",\"articleSection\":[\"2024\",\"3\\\/2024\",\"Interaktiv\"],\"inLanguage\":\"de\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/access-im-unternehmen.de\\\/AccessUnterformulare_Filtern__gezielt_nach_Excel_exportieren\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/AccessUnterformulare_Filtern__gezielt_nach_Excel_exportieren\\\/\",\"url\":\"https:\\\/\\\/access-im-unternehmen.de\\\/AccessUnterformulare_Filtern__gezielt_nach_Excel_exportieren\\\/\",\"name\":\"Access-Unterformulare: Filtern & gezielt nach Excel exportieren - Access im Unternehmen\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/AccessUnterformulare_Filtern__gezielt_nach_Excel_exportieren\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/AccessUnterformulare_Filtern__gezielt_nach_Excel_exportieren\\\/#primaryimage\"},\"thumbnailUrl\":\"http:\\\/\\\/vg02.met.vgwort.de\\\/na\\\/dd9a97150e4d484a93ef309e0a0623ef\",\"datePublished\":\"2024-06-02T21:18:51+00:00\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/AccessUnterformulare_Filtern__gezielt_nach_Excel_exportieren\\\/#breadcrumb\"},\"inLanguage\":\"de\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/access-im-unternehmen.de\\\/AccessUnterformulare_Filtern__gezielt_nach_Excel_exportieren\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"de\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/AccessUnterformulare_Filtern__gezielt_nach_Excel_exportieren\\\/#primaryimage\",\"url\":\"http:\\\/\\\/vg02.met.vgwort.de\\\/na\\\/dd9a97150e4d484a93ef309e0a0623ef\",\"contentUrl\":\"http:\\\/\\\/vg02.met.vgwort.de\\\/na\\\/dd9a97150e4d484a93ef309e0a0623ef\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/AccessUnterformulare_Filtern__gezielt_nach_Excel_exportieren\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/access-im-unternehmen.de\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Access-Unterformulare: Filtern &#038; gezielt nach Excel exportieren\"}]},{\"@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":"Access-Unterformulare: Filtern & gezielt nach Excel exportieren - 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\/AccessUnterformulare_Filtern__gezielt_nach_Excel_exportieren\/","og_locale":"de_DE","og_type":"article","og_title":"Access-Unterformulare: Filtern & gezielt nach Excel exportieren","og_description":"In Unterformularen in der Datenblattansicht lassen sich Daten prima filtern oder sortieren. Mit der DoCmd-Methode TransferSpreadsheet lassen sich Daten einer Tabelle oder Abfrage einfach in eine Excel-Datei exportieren. Aber wie bekommen wir beides unter einen Hut? Wir m&ouml;chten also in einem Unterformular die Daten filtern und sortieren k&ouml;nnen und diese in dieser Ansicht in eine Excel-Datei exportieren k&ouml;nnen. Dazu brauchen wir ein wenig VBA und Kenntnisse der Eigenschaften eines Formulars. In diesem Beitrag zeigen wir, wie wir die Daten der Datenherkunft des Unterformulars wie im Unterformular angegeben filtern und sortieren und so in eine Excel-Datei schreiben.","og_url":"https:\/\/access-im-unternehmen.de\/AccessUnterformulare_Filtern__gezielt_nach_Excel_exportieren\/","og_site_name":"Access im Unternehmen","article_published_time":"2024-06-02T21:18:51+00:00","og_image":[{"url":"http:\/\/vg02.met.vgwort.de\/na\/dd9a97150e4d484a93ef309e0a0623ef","type":"","width":"","height":""}],"author":"Andr\u00e9 Minhorst","twitter_card":"summary_large_image","twitter_misc":{"Verfasst von":"Andr\u00e9 Minhorst","Gesch\u00e4tzte Lesezeit":"19\u00a0Minuten"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/access-im-unternehmen.de\/AccessUnterformulare_Filtern__gezielt_nach_Excel_exportieren\/#article","isPartOf":{"@id":"https:\/\/access-im-unternehmen.de\/AccessUnterformulare_Filtern__gezielt_nach_Excel_exportieren\/"},"author":{"name":"Andr\u00e9 Minhorst","@id":"https:\/\/access-im-unternehmen.de\/#\/schema\/person\/13395c4bcd7d7963efe33be9c584d93f"},"headline":"Access-Unterformulare: Filtern &#038; gezielt nach Excel exportieren","datePublished":"2024-06-02T21:18:51+00:00","mainEntityOfPage":{"@id":"https:\/\/access-im-unternehmen.de\/AccessUnterformulare_Filtern__gezielt_nach_Excel_exportieren\/"},"wordCount":3228,"commentCount":0,"publisher":{"@id":"https:\/\/access-im-unternehmen.de\/#organization"},"image":{"@id":"https:\/\/access-im-unternehmen.de\/AccessUnterformulare_Filtern__gezielt_nach_Excel_exportieren\/#primaryimage"},"thumbnailUrl":"http:\/\/vg02.met.vgwort.de\/na\/dd9a97150e4d484a93ef309e0a0623ef","articleSection":["2024","3\/2024","Interaktiv"],"inLanguage":"de","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/access-im-unternehmen.de\/AccessUnterformulare_Filtern__gezielt_nach_Excel_exportieren\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/access-im-unternehmen.de\/AccessUnterformulare_Filtern__gezielt_nach_Excel_exportieren\/","url":"https:\/\/access-im-unternehmen.de\/AccessUnterformulare_Filtern__gezielt_nach_Excel_exportieren\/","name":"Access-Unterformulare: Filtern & gezielt nach Excel exportieren - Access im Unternehmen","isPartOf":{"@id":"https:\/\/access-im-unternehmen.de\/#website"},"primaryImageOfPage":{"@id":"https:\/\/access-im-unternehmen.de\/AccessUnterformulare_Filtern__gezielt_nach_Excel_exportieren\/#primaryimage"},"image":{"@id":"https:\/\/access-im-unternehmen.de\/AccessUnterformulare_Filtern__gezielt_nach_Excel_exportieren\/#primaryimage"},"thumbnailUrl":"http:\/\/vg02.met.vgwort.de\/na\/dd9a97150e4d484a93ef309e0a0623ef","datePublished":"2024-06-02T21:18:51+00:00","breadcrumb":{"@id":"https:\/\/access-im-unternehmen.de\/AccessUnterformulare_Filtern__gezielt_nach_Excel_exportieren\/#breadcrumb"},"inLanguage":"de","potentialAction":[{"@type":"ReadAction","target":["https:\/\/access-im-unternehmen.de\/AccessUnterformulare_Filtern__gezielt_nach_Excel_exportieren\/"]}]},{"@type":"ImageObject","inLanguage":"de","@id":"https:\/\/access-im-unternehmen.de\/AccessUnterformulare_Filtern__gezielt_nach_Excel_exportieren\/#primaryimage","url":"http:\/\/vg02.met.vgwort.de\/na\/dd9a97150e4d484a93ef309e0a0623ef","contentUrl":"http:\/\/vg02.met.vgwort.de\/na\/dd9a97150e4d484a93ef309e0a0623ef"},{"@type":"BreadcrumbList","@id":"https:\/\/access-im-unternehmen.de\/AccessUnterformulare_Filtern__gezielt_nach_Excel_exportieren\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/access-im-unternehmen.de\/"},{"@type":"ListItem","position":2,"name":"Access-Unterformulare: Filtern &#038; gezielt nach Excel exportieren"}]},{"@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\/55001496","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=55001496"}],"version-history":[{"count":0,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/posts\/55001496\/revisions"}],"wp:attachment":[{"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/media?parent=55001496"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/categories?post=55001496"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/tags?post=55001496"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}