{"id":55001561,"date":"2025-10-01T00:00:00","date_gmt":"2025-08-28T18:59:17","guid":{"rendered":"http:\/\/access-im-unternehmen.aix-dev.de\/aiu\/?p=1561"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-30T00:00:00","slug":"Optimierter_Suchen_und_ErsetzenDialog_Funktionen","status":"publish","type":"post","link":"https:\/\/access-im-unternehmen.de\/Optimierter_Suchen_und_ErsetzenDialog_Funktionen\/","title":{"rendered":"Optimierter &#8222;Suchen und Ersetzen&#8220;-Dialog: Funktionen"},"content":{"rendered":"<p><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/vg01.met.vgwort.de\/na\/e07774b1dfe648c2a12e29c4c2e2d145\" width=\"1\" height=\"1\" alt=\"\"><b>Im Beitrag &#8222;Besserer &#8222;Suchen und Ersetzen&#8220;-Dialog: Grundger&uuml;st&#8220; haben wir das Grundger&uuml;st f&uuml;r einen Ersatz der eingebauten Suchen- und Ersetzen-Funktion von Access erstellt. Im vorliegenden Artikel wollen wir nun die Such- und Ersetzungsfunktionen mit Leben f&uuml;llen. Dabei werden Sie nicht nur die begonnene L&ouml;sung vervollst&auml;ndigen, sondern auch noch Einiges &uuml;ber das VBA-gesteuerte Suchen und Ersetzen in Datenbl&auml;ttern lernen.<\/b><\/p>\n<p>Die L&ouml;sung aus dem oben genannten Beitrag bildet bisher die vollst&auml;ndige Benutzeroberfl&auml;che des eingebauten <b>Suchen und Ersetzen<\/b>-Dialogs ab.<\/p>\n<p>Allerdings haben wir die eigentlichen Suchen- und Ersetzen-Funktionen noch nicht eingebaut. Das holen wir in diesem Beitrag nach.<\/p>\n<p>Dabei unterscheiden wir verschiedene F&auml;lle, die wir in den folgenden Abschnitten im Detail beschreiben.<\/p>\n<h2>Einfaches Weitersuchen in einem Feld<\/h2>\n<p>Der erste und einfachste Fall ist die Suche im aktuell markierten Feld (siehe Bild 1). Dazu enth&auml;lt die Eigenschaft <b>Suchen <\/b>den Wert <b>Aktuelles Feld<\/b>. Vorher m&uuml;ssen wir uns allerdings noch um einige weitere Informationen k&uuml;mmern.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2025_05\/pic_1561_001.png\" alt=\"Erster Fall: Suchen in einem einzelnen Feld\" width=\"649,559\" height=\"383,5162\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 1: Erster Fall: Suchen in einem einzelnen Feld<\/span><\/b><\/p>\n<h2>Referenzieren des aktuellen Datenblatts<\/h2>\n<p>Wichtig ist f&uuml;r den <b>Suchen und Ersetzen<\/b>-Dialog, dass wir einen Verweis auf das Datenblatt erhalten, das wir untersuchen wollen. Dazu f&uuml;hren wir in der Ereignisprozedur, die durch das &Ouml;ffnen des Formulars <b>frmSuchenUndErsetzen<\/b> ausgel&ouml;st wird, einige Aktionen aus (siehe Listing 1).<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>Form_Open(Cancel<span style=\"color:blue;\"> As Integer<\/span>)\r\n     <span style=\"color:blue;\">Dim <\/span>strObjektname<span style=\"color:blue;\"> As String<\/span>\r\n     <span style=\"color:blue;\">Set<\/span> objAktuellesDatenblatt = AktuelleDatenblattansichtObjekt\r\n     <span style=\"color:blue;\">If <\/span>objAktuellesDatenblatt Is Nothing<span style=\"color:blue;\"> Then<\/span>\r\n         <span style=\"color:blue;\">MsgBox<\/span> \"Suchen und Ersetzen steht nur f&uuml;r die Datenblattansicht zur Verf&uuml;gung.\", vbOKOnly + vbExclamation, _\r\n             \"Keine Datenblattansicht aktiviert\"\r\n         Cancel = <span style=\"color:blue;\">True<\/span>\r\n         <span style=\"color:blue;\">Exit Sub<\/span>\r\n     <span style=\"color:blue;\">Else<\/span>\r\n         <span style=\"color:blue;\">Set<\/span> rstDatenblatt = objAktuellesDatenblatt.Recordset\r\n         Me.TimerInterval = 100\r\n     <span style=\"color:blue;\">End If<\/span>\r\n     <span style=\"color:blue;\">If <\/span><span style=\"color:blue;\">Not<\/span> IsNull(Me.OpenArgs)<span style=\"color:blue;\"> Then<\/span>\r\n         <span style=\"color:blue;\">If <\/span>Me.OpenArgs = \"Ersetzen\"<span style=\"color:blue;\"> Then<\/span>\r\n             bolErsetzen = <span style=\"color:blue;\">True<\/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 Sub<\/span><\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 1: Aktionen beim &Ouml;ffnen des Formulars<\/span><\/b><\/p>\n<p>Die Prozedur ruft zuerst die Funktion <b>AktuelleDatenblattansichtObjekt<\/b> auf. Diese sehen wir in Listing 2. Sie versucht, bei deaktivierter Fehlerbehandlung &uuml;ber <b>Screen.ActiveDatasheet <\/b>auf das aktive <b>Datasheet<\/b>-Objekt zuzugreifen. Das gelingt in vielen F&auml;llen, aber zum Beispiel dann nicht, wenn sich das Datenblatt in einem Unterformular befindet. Dann liefert der Zugriff auf <b>Screen.ActiveDatasheet <\/b>einen Fehler zur&uuml;ck.<\/p>\n<pre><span style=\"color:blue;\">Public Function <\/span>AktuelleDatenblattansichtObjekt()<span style=\"color:blue;\"> As Object<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>objAktuellesObjekt<span style=\"color:blue;\"> As Object<\/span>\r\n     On Error Resume <span style=\"color:blue;\">Next<\/span>\r\n     <span style=\"color:blue;\">Set<\/span> objAktuellesObjekt = Screen.ActiveDatasheet\r\n     <span style=\"color:blue;\">On Error GoTo<\/span> 0\r\n     <span style=\"color:blue;\">If <\/span>objAktuellesObjekt Is Nothing<span style=\"color:blue;\"> Then<\/span>\r\n         On Error Resume <span style=\"color:blue;\">Next<\/span>\r\n         <span style=\"color:blue;\">Set<\/span> objAktuellesObjekt = Screen.ActiveForm.ActiveControl\r\n         <span style=\"color:blue;\">If <\/span>objAktuellesObjekt.CurrentView = acCurViewDatasheet<span style=\"color:blue;\"> Then<\/span>\r\n             <span style=\"color:blue;\">Set<\/span> AktuelleDatenblattansichtObjekt = objAktuellesObjekt.Form\r\n             <span style=\"color:blue;\">Exit Function<\/span>\r\n         <span style=\"color:blue;\">End If<\/span>\r\n         <span style=\"color:blue;\">On Error GoTo<\/span> 0\r\n     <span style=\"color:blue;\">Else<\/span>\r\n         <span style=\"color:blue;\">Set<\/span> AktuelleDatenblattansichtObjekt = objAktuellesObjekt\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 2: Aktuelle Datenblattansicht holen<\/span><\/b><\/p>\n<p>Deshalb deaktivieren wir hier die Fehlerbehandlung und pr&uuml;fen anschlie&szlig;end, ob <b>objAktuellesObjekt <\/b>einen Wert enth&auml;lt. Falls nicht, versuchen wir es auf einem anderen Weg. Wir versuchen, ebenfalls bei deaktivierter Fehlerbehandlung, mit <b>Screen.ActiveForm.ActiveControl <\/b>einen Verweis auf das Unterformular zu erhalten und in <b>objAktuellesObjekt <\/b>einzutragen. Wie gesagt: Datenbl&auml;tter in Hauptformularen, Tabellen oder Abfragen liefert uns bereits <b>Screen.ActiveDatasheet <\/b>das aktuelle Datenblatt.<\/p>\n<p>Die Funktion pr&uuml;ft dann, ob das aktive Steuerelement ein Datenblatt ist. Falls ja, liefert sie einen Verweis auf die <b>Form<\/b>-Eigenschaft von <b>objAktuellesObjekt <\/b>zur&uuml;ck.<\/p>\n<p>Die Prozedur <b>Form_Open <\/b>schreibt das Ergebnis in die Variable <b>objAktuellesDatenblatt<\/b>, das wie folgt im Kopf des Klassenmoduls des Formulars deklariert wird:<\/p>\n<pre><span style=\"color:blue;\">Private <\/span>objAktuellesDatenblatt<span style=\"color:blue;\"> As Object<\/span><\/pre>\n<p>Dort deklarieren wir direkt auch noch:<\/p>\n<pre><span style=\"color:blue;\">Private <\/span>rstDatenblatt<span style=\"color:blue;\"> As <\/span>DAO.Recordset<\/pre>\n<p>Wenn <b>objAktuellesDatenblatt <\/b>nun leer ist, gibt <b>Form_Open <\/b>eine Meldung aus, dass die <b>Suchen und Ersetzen<\/b>-Funktion nur f&uuml;r die Datenblattansicht zur Verf&uuml;gung steht.<\/p>\n<p>Danach wird die Prozedur mit <b>Cancel = True <\/b>verlassen, sodass das Formular gar nicht erst angezeigt wird.<\/p>\n<p>Anderenfalls schreibt sie einen Verweis auf das Recordset in <b>objAktuellesDatenblatt <\/b>in die Variable <b>rstDatenblatt <\/b>und aktiviert einen Timer, der alle 100 Millisekunden feuern soll (es ginge vermutlich auch ein gr&ouml;&szlig;eres Intervall). Diesen Timer schauen wir uns gleich an.<\/p>\n<p>Schlie&szlig;lich pr&uuml;ft die Prozedur noch das &Ouml;ffnungsargument. Enth&auml;lt dieses den Wert <b>Ersetzen<\/b>, wird <b>bolErsetzen <\/b>auf <b>True <\/b>eingestellt. Dies sorgt sp&auml;ter daf&uuml;r, dass neben dem <b>Suchen<\/b>&#8211; auch das <b>Ersetzen<\/b>-Tab im Formular angezeigt wird.<\/p>\n<p>Die Prozedur, die durch das Ereignis <b>Bei Zeitgeber <\/b>ausgel&ouml;st wird, pr&uuml;ft bei jedem Aufruf, ob das Datenblatt aus <b>rstDatenblatt <\/b>noch vorhanden ist. Dazu greifen wir einfach auf die <b>RecordCount<\/b>-Eigenschaft zu. L&ouml;st dies einen Fehler aus, sind das Recordset und somit wohl auch die Datenblattansicht, f&uuml;r die der <b>Suchen und Ersetzen<\/b>-Dialog ge&ouml;ffnet wurde, wohl nicht mehr vorhanden:<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>Form_Timer()\r\n     <span style=\"color:blue;\">Dim <\/span>lngRecordcount<span style=\"color:blue;\"> As Long<\/span>\r\n     On Error Resume <span style=\"color:blue;\">Next<\/span>\r\n     lngRecordcount = rstDatenblatt.RecordCount\r\n     <span style=\"color:blue;\">If <\/span><span style=\"color:blue;\">Not<\/span> Err.Number = 0<span style=\"color:blue;\"> Then<\/span>\r\n         <span style=\"color:blue;\">On Error GoTo<\/span> 0\r\n         Me.TimerInterval = 0\r\n         DoCmd.Close acForm, Me.Name\r\n     <span style=\"color:blue;\">End If<\/span>\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<h2>Einfachen Suchvorgang ausf&uuml;hren<\/h2>\n<p>Damit kommen wir zum eigentlichen Suchvorgang. Wir schauen uns zuerst einen einfachen Suchvorgang mit den Parametern aus Bild 2 an.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2025_05\/pic_1561_002.png\" alt=\"Einfache Suche\" width=\"499,5589\" height=\"258,239\"\/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 2: Einfache Suche<\/span><\/b><\/p>\n<p>Ein Klick auf die Schaltfl&auml;che <b>Weitersuchen<\/b> l&ouml;st die Prozedur aus Listing 3 aus. Diese holt sich den Suchbegriff aus dem Kombinationsfeld <b>cboSuchenNach <\/b>in die Variable <b>txtSuchbegriff<\/b>. Wenn dieser eine L&auml;nge von <b>0 <\/b>hat, bricht sie die Prozedur ab.<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>cmdWeitersuchen_Click()\r\n     <span style=\"color:blue;\">Dim <\/span>strFeld<span style=\"color:blue;\"> As String<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>strSuchbegriff<span style=\"color:blue;\"> As String<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>strKriterium<span style=\"color:blue;\"> As String<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>bolFound<span style=\"color:blue;\"> As Boolean<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>strMeldung<span style=\"color:blue;\"> As String<\/span>\r\n     strSuchbegriff = Nz(Me.cboSuchenNach.Column(1), \"\")\r\n     <span style=\"color:blue;\">If <\/span><span style=\"color:blue;\">Len<\/span>(strSuchbegriff) = 0<span style=\"color:blue;\"> Then<\/span> <span style=\"color:blue;\">Exit Sub<\/span>\r\n     Select Case Me.cboSuchenIn\r\n         <span style=\"color:blue;\">Case <\/span>\"Aktuelles Feld\"\r\n             <span style=\"color:blue;\">If <\/span>KriteriumAktuellesFeld(strSuchbegriff, strFeld) = <span style=\"color:blue;\">True<\/span><span style=\"color:blue;\"> Then<\/span>\r\n                 bolFound = <span style=\"color:blue;\">False<\/span>\r\n                 Select Case Me.cboSuchen\r\n                     <span style=\"color:blue;\">Case <\/span>\"Alle\"\r\n                         <span style=\"color:blue;\">Call<\/span> SuchenDatensatz(bolFound, strKriterium, strFeld, strSuchbegriff)\r\n                     <span style=\"color:blue;\">Case <\/span>\"Abw&auml;rts\"\r\n                         rstDatenblatt.Find<span style=\"color:blue;\">Next<\/span> strKriterium\r\n                         <span style=\"color:blue;\">If <\/span>rstDatenblatt.NoMatch<span style=\"color:blue;\"> Then<\/span>\r\n                             bolFound = <span style=\"color:blue;\">False<\/span>\r\n                         <span style=\"color:blue;\">Else<\/span>\r\n                             bolFound = <span style=\"color:blue;\">True<\/span>\r\n                         <span style=\"color:blue;\">End If<\/span>\r\n                     <span style=\"color:blue;\">Case <\/span>\"Aufw&auml;rts\"\r\n                         rstDatenblatt.FindPrevious strKriterium\r\n                         <span style=\"color:blue;\">If <\/span>rstDatenblatt.NoMatch<span style=\"color:blue;\"> Then<\/span>\r\n                             bolFound = <span style=\"color:blue;\">False<\/span>\r\n                         <span style=\"color:blue;\">Else<\/span>\r\n                             bolFound = <span style=\"color:blue;\">True<\/span>\r\n                         <span style=\"color:blue;\">End If<\/span>\r\n                 End Select    \r\n                 <span style=\"color:blue;\">If <\/span><span style=\"color:blue;\">Not<\/span> bolFound<span style=\"color:blue;\"> Then<\/span>\r\n                     lngAbsolutePositionStart = -1\r\n                     <span style=\"color:blue;\">MsgBox<\/span> \"Kein weiterer Eintrag gefunden.\"\r\n                 <span style=\"color:blue;\">Else<\/span>\r\n                     Select Case Me.cboVergleichen\r\n                         <span style=\"color:blue;\">Case <\/span>\"Teil des Feldinhalts\", \"Anfang des Feldinhalts\"\r\n                             <span style=\"color:blue;\">Call<\/span> SuchbegriffMarkieren(objAktuellesDatenblatt.ActiveControl, Me.cboSuchenNach.Column(1))\r\n                     <span style=\"color:blue;\">End Select<\/span>\r\n                 <span style=\"color:blue;\">End If<\/span>\r\n             <span style=\"color:blue;\">Else<\/span>\r\n                 <span style=\"color:blue;\">MsgBox<\/span> strMeldung, vbExclamation + vbOKOnly, \"Suche nicht erfolgreich\"\r\n             <span style=\"color:blue;\">End If<\/span>\r\n         <span style=\"color:blue;\">Case <\/span>\"Aktuelles Dokument\"\r\n             <span style=\"color:blue;\">MsgBox<\/span> \"Nicht implementiert.\"\r\n     <span style=\"color:blue;\">End Select<\/span>\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 3: Code hinter der Schaltfl&auml;che Weitersuchen<\/span><\/b><\/p>\n<p>Anderenfalls erfolgt eine Unterscheidung nach dem Umfang der Suche, der mit dem Kombinationsfeld <b>cboSuchenIn <\/b>festgelegt wird. Im Fall von <b>Aktuelles Feld <\/b>beginnt der Teil, den wir hier beschreiben wollen.<\/p>\n<p>Es folgt ein Aufruf der Funktion <b>KriteriumAktuellesFeld<\/b>, der als Ergebnis das Suchkriterium f&uuml;r die Suche liefern soll. Das ist recht aufwendig, da wir pr&uuml;fen m&uuml;ssen, welchen Datentyp das Feld enth&auml;lt, ob dieser zum eingegebenen Suchbegriff passt und so weiter &#8211; mehr dazu weiter unten. Wir gehen an dieser Stelle davon aus, dass wir zum Beispiel den Suchbegriff <b>adi <\/b>eingegeben haben und als Kriterium mit dem Parameter <b>strKriterium <\/b>den folgenden Ausdruck zur&uuml;ckerhalten:<\/p>\n<pre>Vorname LIKE ''*adi*''<\/pre>\n<p>Dann wird die Variable <b>bolFound <\/b>zun&auml;chst auf <b>False <\/b>eingestellt. Nun pr&uuml;fen wir den Inhalt von <b>cboSuchen <\/b>und steuern abh&auml;ngig davon einen der <b>Case<\/b>-Zweige f&uuml;r <b>Alle<\/b>, <b>Abw&auml;rts<\/b> oder <b>Aufw&auml;rts <\/b>an.<\/p>\n<h2>Suchen nach allen Vorkommen im aktuellen Feld<\/h2>\n<p>Wenn der Benutzer <b>Alle <\/b>gew&auml;hlt hat, haben wir die umfangreichste Ausgabe vor uns. W&auml;hrend wir bei Abw&auml;rts oder Aufw&auml;rts einfach vom aktuellen Datensatz aus nach oben oder unten suchen k&ouml;nnen, m&uuml;ssen wir in diesem Fall vom aktuellen Datensatz aus nach unten suchen, dann oben neu beginnen und vor dem aktuellen Datensatz stoppen. Da dies ein wenig aufwendiger ist, haben wir diesen Teil in eine eigene Prozedur namens <b>SuchenDatensatz <\/b>ausgelagert (siehe Listing 4).<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>SuchenDatensatz(bolGefunden<span style=\"color:blue;\"> As Boolean<\/span>, strKriterium<span style=\"color:blue;\"> As String<\/span>)\r\n     <span style=\"color:blue;\">Dim <\/span>bolStart<span style=\"color:blue;\"> As Boolean<\/span>\r\n     <span style=\"color:blue;\">If <\/span>lngAbsolutePositionStart = -1<span style=\"color:blue;\"> Then<\/span>\r\n         lngAbsolutePositionStart = rstDatenblatt.AbsolutePosition\r\n         bolVonVornGestartet = <span style=\"color:blue;\">False<\/span>\r\n         bolStart = <span style=\"color:blue;\">True<\/span>\r\n     <span style=\"color:blue;\">Else<\/span>\r\n         <span style=\"color:blue;\">If <\/span><span style=\"color:blue;\">Not<\/span> lngLetzteFundstelle = rstDatenblatt.AbsolutePosition<span style=\"color:blue;\"> Then<\/span>\r\n             lngAbsolutePositionStart = rstDatenblatt.AbsolutePosition\r\n             bolVonVornGestartet = <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;\">If <\/span>bolStart = <span style=\"color:blue;\">True<\/span><span style=\"color:blue;\"> Then<\/span>\r\n         rstDatenblatt.FindFirst strKriterium\r\n         bolStart = <span style=\"color:blue;\">False<\/span>\r\n     <span style=\"color:blue;\">Else<\/span>\r\n         rstDatenblatt.Find<span style=\"color:blue;\">Next<\/span> strKriterium\r\n     End If    \r\n     <span style=\"color:blue;\">If <\/span>rstDatenblatt.NoMatch = <span style=\"color:blue;\">False<\/span><span style=\"color:blue;\"> Then<\/span>\r\n         <span style=\"color:blue;\">If <\/span>bolVonVornGestartet = <span style=\"color:blue;\">True<\/span><span style=\"color:blue;\"> Then<\/span>\r\n             <span style=\"color:blue;\">If <\/span>rstDatenblatt.AbsolutePosition &gt; lngAbsolutePositionStart<span style=\"color:blue;\"> Then<\/span>\r\n                 rstDatenblatt.AbsolutePosition = lngLetzteFundstelle\r\n                 bolGefunden = <span style=\"color:blue;\">False<\/span>\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 If<\/span>\r\n         lngLetzteFundstelle = rstDatenblatt.AbsolutePosition\r\n         bolGefunden = <span style=\"color:blue;\">True<\/span>\r\n         <span style=\"color:blue;\">Exit Sub<\/span>\r\n     <span style=\"color:blue;\">Else<\/span>\r\n         <span style=\"color:blue;\">If <\/span>bolVonVornGestartet = <span style=\"color:blue;\">False<\/span><span style=\"color:blue;\"> Then<\/span>\r\n             bolVonVornGestartet = <span style=\"color:blue;\">True<\/span>\r\n             rstDatenblatt.FindFirst strKriterium\r\n             <span style=\"color:blue;\">If <\/span>rstDatenblatt.NoMatch = <span style=\"color:blue;\">False<\/span><span style=\"color:blue;\"> Then<\/span>\r\n                 <span style=\"color:blue;\">If <\/span>rstDatenblatt.AbsolutePosition &lt; lngAbsolutePositionStart<span style=\"color:blue;\"> Then<\/span>\r\n                     lngLetzteFundstelle = rstDatenblatt.AbsolutePosition\r\n                     bolGefunden = <span style=\"color:blue;\">True<\/span>\r\n                     <span style=\"color:blue;\">Exit Sub<\/span>\r\n                 <span style=\"color:blue;\">Else<\/span>\r\n                     rstDatenblatt.AbsolutePosition = lngLetzteFundstelle\r\n                     bolGefunden = <span style=\"color:blue;\">False<\/span>\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 If<\/span>\r\n         <span style=\"color:blue;\">Else<\/span>\r\n             bolGefunden = <span style=\"color:blue;\">False<\/span>\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 If<\/span>\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 4: Code zum Suchen nach einem Datensatz<\/span><\/b><\/p>\n<p>Dieser &uuml;bergeben wir verschiedene Parameter, die zum gr&ouml;&szlig;ten Teil auch als R&uuml;ckgabeparameter dienen:<\/p>\n<ul>\n<li><b>bolGefunden <\/b>gibt an, ob ein Datensatz gefunden wurde.<\/li>\n<li><b>strKriterium <\/b>nimmt das Kriterium entgegen.<\/li>\n<\/ul>\n<p>Die beiden folgenden Variablen m&uuml;ssen wir noch im Modulkopf deklarieren, da diese von mehreren Prozeduren genutzt werden:<\/p>\n<pre><span style=\"color:blue;\">Private <\/span>lngAbsolutePositionStart<span style=\"color:blue;\"> As Long<\/span>\r\n<span style=\"color:blue;\">Private <\/span>varLetzteFundposition<span style=\"color:blue;\"> As Variant<\/span><\/pre>\n<p>Beim Aufrufen des Formulars <b>frmSuchenUndErsetzen <\/b>wird der Wert von <b>lngAbsolutePositionStart <\/b>auf <b>-1 <\/b>eingestellt. Deshalb ist die erste Bedingung beim ersten Suchlauf nach dem &Ouml;ffnen immer wahr und wir stellen nun <b>lngAbsolutePositionStart <\/b>auf die aktuelle Position des Datensatzzeigers aus <b>rstDatenblatt.AbsolutePosition <\/b>ein.<\/p>\n<p>Au&szlig;erdem legen wir hier den Wert der Variablen <b>bolVonVornGestartet <\/b>auf <b>False <\/b>fest. Diese Variable gibt an, ob wir den Suchlauf bereits von vorn begonnen haben. Das ist wichtig, wenn wir mittendrin mit der Suche beginnen, damit auch die vor dem Startpunkt liegenden Datens&auml;tze noch durchsucht werden k&ouml;nnen.<\/p>\n<p>Wenn der Benutzer nach dem ersten Suchlauf noch weitere Suchvorg&auml;nge startet, hat <b>lngAbsolutePositionStart <\/b>bereits einen anderen Wert als <b>-1<\/b>. Also wird der zweite Teil der <b>If&#8230;Then<\/b>-Bedingung angesteuert.<\/p>\n<p>Hier pr&uuml;fen wir, ob sich der Datensatzzeiger aktuell auf der letzten Fundstelle befindet. Das sollte immer der Fall sein, wenn der Benutzer mehrere Suchvorg&auml;nge hintereinander aufruft. Wenn sich der Datensatzzeiger woanders befindet, gehen wir davon aus, dass der Benutzer diesen manuell an eine andere Stelle verschoben hat. In diesem Fall stellen wir <b>lngAbsolutePositionStart <\/b>wieder auf die aktuelle Position ein und <b>bolVonVornGestartet <\/b>auf <b>False<\/b>, da selbst ein Suchvorgang, der bis zum Ende lief und von vorn beginnt, nun zur&uuml;ckgesetzt werden soll.<\/p>\n<p>Damit k&ouml;nnen wir endlich suchen und nutzen daf&uuml;r entweder die <b>FindFirst<\/b>&#8211; oder die <b>FindNext<\/b>-Methode mit dem Kriterium aus <b>strKriterium<\/b>. <b>FindFirst <\/b>nutzen wir nur, wenn zuvor <b>bolStart <\/b>auf <b>True <\/b>eingestellt wurde, was der Fall ist, wenn die Funktion zum ersten Mal aufgerufen wird und nicht wiederholt f&uuml;r den gleichen Suchbegriff. Dann wird <b>bolStart <\/b>direkt auf <b>False <\/b>eingestellt. Bei den folgenden Aufrufen suchen wir dann mit <b>FindNext<\/b>.<\/p>\n<p>Die folgende <b>If&#8230;Then<\/b>-Bedingung pr&uuml;ft durch den Vergleich der Eigenschaft <b>NoMatch <\/b>mit dem Wert <b>False<\/b>, ob es einen Suchtreffer gab. In diesem Fall pr&uuml;fen wir, ob <b>bolVonVornGestartet <\/b>den Wert <b>True <\/b>hat, also ob wir die Suche bereits wieder ganz oben fortgesetzt haben. Ist das der Fall, kann es sein, dass wir mit der Suche ein zweites Mal auf dem gleichen Datensatz landen. Um das herauszufinden, ermitteln wir, ob die aktuelle Position des Datensatzzeigers aus <b>rstDatenblatt.AbsolutePosition <\/b>gr&ouml;&szlig;er ist als die Startposition aus <b>lngAbsolutePositionStart<\/b>. Ist diese Bedingung wahr, sind wir mehr als einmal durch die Datens&auml;tze navigiert. Dann verschieben wir den Datensatzzeiger wieder auf die Position der vorherigen Fundstelle, geben f&uuml;r <b>bolGefunden <\/b>den Wert <b>False <\/b>zur&uuml;ck und verlassen die Prozedur.<\/p>\n<p>Sind die letzten beiden Bedingungen nicht erf&uuml;llt, haben wir einen Suchtreffer. Wir speichern die Position des Datensatzzeigers f&uuml;r diesen Datensatz in der Variablen <b>lngLetzteFundstelle<\/b>, geben den Wert <b>True <\/b>f&uuml;r <b>bolGefunden <\/b>zur&uuml;ck und verlassen die Prozedur.<\/p>\n<p>Nun kommt der Fall, wo wir von der Startposition aus bereits alle Vorkommen des gesuchten Wertes gefunden haben. In diesem Fall pr&uuml;fen wir, ob wir die Suche bereits von vorn begonnen haben. Falls nicht, ist es nun an der Zeit. Wir stellen <b>bolVonVornGestartet <\/b>auf <b>True <\/b>ein. Danach rufen wir erneut <b>FindFirst<\/b> mit unserem Kriterium auf.<\/p>\n<p>Ist <b>NoMatch<\/b> danach <b>False<\/b>, haben wir einen erneuten Treffer. Dann pr&uuml;fen wir, ob wir gegebenenfalls bereits mehr als eine Runde durch die Datens&auml;tze gedreht haben.<\/p>\n<p>Dazu pr&uuml;fen wir, ob der Wert von <b>rstDatenblatt.AbsolutePosition <\/b>kleiner ist als <b>lngAbsolutePositionStart<\/b>. Ist das der Fall, sind wir noch im ersten Durchlauf und haben eine Fundstelle.<\/p>\n<p>Wenn nicht, stellen wir <b>AbsolutePosition <\/b>auf die Position des letzten Suchergebnisses ein, verschieben den Datensatzzeiger also zur&uuml;ck zum letzten regul&auml;ren Treffer. Au&szlig;erdem geben wir f&uuml;r <b>bolGefunden <\/b>den Wert <b>False <\/b>zur&uuml;ck.<\/p>\n<h2>Abw&auml;rts-Suche und Aufw&auml;rts-Suche<\/h2>\n<p>Die einfache Abw&auml;rts- und Aufw&auml;rts-Suche ist wesentlich einfacher zu programmieren, weil wir nicht pr&uuml;fen m&uuml;ssen, ob wir am Ende angekommen sind und gegebenenfalls noch Suchergebnisse in dem bisher nicht ber&uuml;cksichtigten Bereich vorhanden sind. Wir gehen also weiter in der Prozedur <b>cmdWeitersuchen_Click<\/b>. <\/p>\n<p>Hier folgen nun die beiden <b>Case<\/b>-Zweige <b>Abw&auml;rts <\/b>und <b>Aufw&auml;rts<\/b>. Im Abw&auml;rts-Zweig rufen wir die <b>FindNext<\/b>-Methode auf und &uuml;bergeben <b>strKriterium<\/b>. Dies liefert entweder einen Treffer (<b>NoMatch = False<\/b>) oder nicht. Abh&auml;ngig davon stellen wir <b>bolFound <\/b>auf <b>True <\/b>oder <b>False <\/b>ein. Im Aufw&auml;rts-Zweig rufen wir <b>FindPrevious <\/b>auf, um nach oben zu suchen.<\/p>\n<p>In beiden F&auml;llen wird der Datensatzzeiger jeweils auf der Fundstelle platziert.<\/p>\n<p>Danach untersuchen wir in der Prozedur f&uuml;r alle drei Suchf&auml;lle den Wert der Variablen <b>bolFound<\/b>. Hat es den Wert <b>False<\/b>, stellen wir <b>lngAbsolutePositionStart <\/b>auf <b>-1 <\/b>ein, damit wir uns bei der n&auml;chsten Suche &uuml;ber alle Daten wieder die korrekte Startposition merken k&ouml;nnen. Au&szlig;erdem erscheint eine Meldung, dass kein weiterer Eintrag gefunden werden konnte.<\/p>\n<p>Haben wir jedoch einen Treffer gelandet, pr&uuml;fen wir, welcher Wert in <b>cboVergleichen <\/b>ausgew&auml;hlt ist. In den F&auml;llen, wo wir nicht den vollst&auml;ndigen Feldinhalt untersuchen, wollen wir noch den gesuchten Inhalt markieren. Das erledigen wir in der Prozedur <b>SuchbegriffMarkieren<\/b>, der wir den Suchbegriff als Parameter &uuml;bergeben. Diese Prozedur ermittelt mit <b>ActiveControl <\/b>das durchsuchte Steuerelement f&uuml;r den Datensatz aus <b>objAktuellesDatenblatt<\/b>. Wir ermitteln den Inhalt des Steuerelements und schreiben diesen in <b>strFeldinhalt<\/b>. Dann lesen wir die Startposition des Suchbegriffs in dieser Zeichenkette aus und tragen sie in <b>lngStart <\/b>ein. Im Text des Steuerelements markieren wir nun mit der Eigenschaft <b>SelStart <\/b>und mit der L&auml;nge des Suchbegriffs f&uuml;r <b>SelLength <\/b>den Suchbegriff:<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>SuchbegriffMarkieren(strSuchbegriff<span style=\"color:blue;\"> As String<\/span>)\r\n     <span style=\"color:blue;\">Dim <\/span>lngStart<span style=\"color:blue;\"> As Long<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>strFeldinhalt<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;\">Set<\/span> ctl = objAktuellesDatenblatt.ActiveControl\r\n     strFeldinhalt = ctl.Value\r\n     lngStart = <span style=\"color:blue;\">InStr<\/span>(1, strFeldinhalt, strSuchbegriff) - 1\r\n     ctl.SelStart = lngStart\r\n     ctl.SelLength = <span style=\"color:blue;\">Len<\/span>(strSuchbegriff)\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p>Das Ergebnis sehen wir in Bild 3.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2025_05\/pic_1561_003.png\" alt=\"Markieren des Suchbegriffs im durchsuchten Feld\" width=\"499,5589\" height=\"342,9109\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 3: Markieren des Suchbegriffs im durchsuchten Feld<\/span><\/b><\/p>\n<h2>Aktuelles Dokument durchsuchen<\/h2>\n<p>Im zweiten <b>Case<\/b>-Fall der <b>Select Case<\/b>-Bedingung f&uuml;r das Kombinationsfeld <b>cboSuchenIn <\/b>k&ouml;nnen wir noch die Suche durch das gesamte Dokument implementieren. Hier m&uuml;ssen wir den gleichen Suchvorgang umsetzen, den wir bereits f&uuml;r ein einzelnes Feld realisiert haben. Dies erledigen wir im Rahmen dieses Beitrags jedoch aus Platzgr&uuml;nden nicht mehr.<\/p>\n<h2>Kriterium f&uuml;r das aktuelle Feld ermitteln<\/h2>\n<p>Damit kommen wir auf das Ermitteln des Kriteriums zur&uuml;ck, also das Zusammenstellen eines Ausdrucks wie <b>Vorname LIKE &#8220;M*&#8220;<\/b>.<\/p>\n<p>Dazu holt die Funktion <b>KriterumAktuellesFeld <\/b>das Kriterium f&uuml;r die aktuellen Einstellungen im Formular. Sie erwartet den Suchbegriff als Parameter, die &uuml;brigen Parameter sind R&uuml;ckgabeparameter &#8211; zum Beispiel f&uuml;r das zu durchsuchende Feld, das Kriterium und gegebenenfalls eine Meldung, falls kein Kriterium zusammengestellt werden konnte (siehe Listing 5).<\/p>\n<pre><span style=\"color:blue;\">Public Function <\/span>KriteriumAktuellesFeld(strSuchbegriff<span style=\"color:blue;\"> As String<\/span>, strFeld<span style=\"color:blue;\"> As String<\/span>, strKriterium<span style=\"color:blue;\"> As String<\/span>, _\r\n         lngSteuerelementAnzeigen<span style=\"color:blue;\"> As Long<\/span>, <span style=\"color:blue;\">Optional<\/span> strMeldung<span style=\"color:blue;\"> As String<\/span>)<span style=\"color:blue;\"> As Boolean<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>objAktuellesSteuerelement<span style=\"color:blue;\"> As <\/span>Control, fld<span style=\"color:blue;\"> As <\/span>DAO.Field\r\n     <span style=\"color:blue;\">Dim <\/span>strStart<span style=\"color:blue;\"> As String<\/span>, strEnde<span style=\"color:blue;\"> As String<\/span>\r\n     Select Case Me.cboVergleichen\r\n         <span style=\"color:blue;\">Case <\/span>\"Teil des Feldinhalts\"\r\n             strStart = \"*\"\r\n             strEnde = \"*\"\r\n         <span style=\"color:blue;\">Case <\/span>\"Ganzes Feld\"\r\n         <span style=\"color:blue;\">Case <\/span>\"Anfang des Feldinhalts\"\r\n             strEnde = \"*\"\r\n     <span style=\"color:blue;\">End Select<\/span>\r\n     <span style=\"color:blue;\">Set<\/span> objAktuellesSteuerelement = objAktuellesDatenblatt.ActiveControl\r\n     strFeld = objAktuellesSteuerelement.ControlSource\r\n     <span style=\"color:blue;\">Set<\/span> fld = rstDatenblatt(strFeld)\r\n     lngSteuerelementanzeigen = acTextBox\r\n     strSuchbegriff = SuchbegriffNachschlagefeldHolen(fld, strSuchbegriff, lngSteuerelementAnzeigen)\r\n     Select Case fld.Type\r\n         <span style=\"color:blue;\">Case <\/span>dbText, dbMemo\r\n             strKriterium = strFeld & \" LIKE ''\" & strStart & strSuchbegriff & strEnde & \"''\"\r\n         <span style=\"color:blue;\">Case <\/span>dbBoolean, dbInteger, dbLong, dbSingle, dbDouble\r\n             <span style=\"color:blue;\">If <\/span>IsNumeric(strSuchbegriff)<span style=\"color:blue;\"> Then<\/span>\r\n                 <span style=\"color:blue;\">If <\/span><span style=\"color:blue;\">Len<\/span>(strStart & strEnde) = 0<span style=\"color:blue;\"> Then<\/span>\r\n                     strKriterium = strFeld & \" = \" & strSuchbegriff\r\n                 <span style=\"color:blue;\">Else<\/span>\r\n                     strKriterium = strFeld & \" LIKE ''\" & strStart & strSuchbegriff & strEnde & \"''\"\r\n                 <span style=\"color:blue;\">End If<\/span>\r\n             <span style=\"color:blue;\">Else<\/span>\r\n                 strMeldung = \"Zahlenfeld kann nicht mit einer Zeichenkette verglichen werden.\"\r\n             <span style=\"color:blue;\">End If<\/span>\r\n         <span style=\"color:blue;\">Case <\/span>dbDate\r\n             <span style=\"color:blue;\">If <\/span>IsDate(strSuchbegriff)<span style=\"color:blue;\"> Then<\/span>\r\n                 strKriterium = strFeld & \" = \" & CDbl(strSuchbegriff)\r\n             <span style=\"color:blue;\">Else<\/span>\r\n                 <span style=\"color:blue;\">If <\/span><span style=\"color:blue;\">Len<\/span>(strStart & strEnde) = 0<span style=\"color:blue;\"> Then<\/span>\r\n                     strMeldung = \"Datumsfeld kann nicht mit einer Zeichenkette verglichen werden.\"\r\n                 <span style=\"color:blue;\">Else<\/span>\r\n                     strKriterium = strFeld & \" LIKE ''\" & strStart & strSuchbegriff & strEnde & \"''\"\r\n                 <span style=\"color:blue;\">End If<\/span>\r\n             <span style=\"color:blue;\">End If<\/span>\r\n         <span style=\"color:blue;\">Case Else<\/span>\r\n             <span style=\"color:blue;\">MsgBox<\/span> \"Felddatentyp nicht unterst&uuml;tzt\"\r\n             <span style=\"color:blue;\">Exit Function<\/span>\r\n     <span style=\"color:blue;\">End Select<\/span>\r\n     <span style=\"color:blue;\">If <\/span><span style=\"color:blue;\">Not<\/span> <span style=\"color:blue;\">Len<\/span>(strKriterium) = 0<span style=\"color:blue;\"> Then<\/span>\r\n         KriteriumAktuellesFeld = <span style=\"color:blue;\">True<\/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 5: Code zum Zusammenstellen des Kriteriums<\/span><\/b><\/p>\n<p>Sie untersucht zun&auml;chst den Inhalt des Kombinationsfeldes <b>cboVergleichen<\/b>. Soll nach einem Teil des Feldinhalts gesucht werden, werden die Variablen <b>strStart <\/b>und <b>strEnde <\/b>mit je einem Sternchen gef&uuml;llt. F&uuml;r das ganze Feld bleiben diese Variablen leer, f&uuml;r den Anfang des Feldinhalts wird nur <b>strEnde <\/b>auf das Sternchen eingestellt.<\/p>\n<p>Dann holt die Funktion einen Verweis auf das aktuell markierte Feld im Datenblatt und speichert es in <b>objAktuellesSteuerelement<\/b>, au&szlig;erdem wird der Name der gebundenen Spalte in <b>strFeld <\/b>eingetragen. Damit erstellt die Funktion in der Variablen <b>fld <\/b>einen Verweis auf das entsprechende Steuerelement.<\/p>\n<p>Nun gehen wir davon aus, dass wir ein Textfeld durchsuchen und stellen <b>lngSteuerelementAnzeigen <\/b>auf <b>acTextBox <\/b>ein. Die folgende Funktion <b>SuchbegriffNachschlagefeldHolen <\/b>untersucht dies genauer. Sie pr&uuml;ft, ob wir gerade ein Kombinationsfeld untersuchen.<\/p>\n<p>Falls ja, ist der angezeigte Wert ja nicht der gebundene Wert des Feldes, daher m&uuml;ssen wir hier einen Umweg gehen: Wir ermitteln dann den tats&auml;chlichen Wert, der sich hinter dem Kombinationsfeld verbirgt. Diesen Ablauf sehen wir uns im Anschluss an. Wenn wir beispielsweise im Feld <b>AnredeID <\/b>nach dem Wert Herr suchen sollen, m&uuml;ssen wir ja tats&auml;chlich nach dem Wert des Feldes <b>AnredeID <\/b>suchen und nicht nach Anrede, also zum Beispiel nach dem Wert <b>1<\/b>.<\/p>\n<p>Nach dem Aufruf der Funktion <b>SuchbegriffNachschlagefeldHolen <\/b>haben wir auf jeden Fall den richtigen Suchbegriff im Feld <b>strSuchbegriff<\/b>.<\/p>\n<p>Dann unterscheiden wir in einer <b>Select Case<\/b>-Bedingung nach dem Felddatentyp des zu untersuchenden Feldes auf <b>fld<\/b>. Im Falle von <b>dbText <\/b>oder <b>dbMemo<\/b>, also von Textfeldern, wird das Kriterium aus dem Feldnamen, dem <b>LIKE<\/b>-Operator, gegebenenfalls Sternchen aus <b>strStart <\/b>und <b>strEnde <\/b>und dem Suchtext zusammengestellt.<\/p>\n<p>Im Falle von <b>Boolean<\/b>, <b>Integer<\/b>, <b>Long<\/b>, <b>Single <\/b>und <b>Double <\/b>wird gepr&uuml;ft, ob der Suchbegriff ebenfalls numerisch ist. Falls ja, wird entweder ein direkter Vergleich mit dem Gleichheitszeichen verwendet oder einer mit dem <b>LIKE<\/b>-Ausdruck und eventuellen Sternchen-Platzhaltern. Falls der Datentyp nicht numerisch ist, wird <b>strMeldung <\/b>mit einem entsprechenden Text ausgestattet.<\/p>\n<p>Bei Datumsfeldern wird gepr&uuml;ft, ob der Suchbegriff ein Datumsformat hat. Dann wird mit dem in <b>Double <\/b>konvertierten Wert des Vergleichswerts verglichen.<\/p>\n<p>Auch hier wird eine Meldung zusammengestellt, wenn der Suchbegriff kein Datum ist.<\/p>\n<p>Alle anderen Felddatentypen werden aktuell nicht unterst&uuml;tzt, diese kann man gegebenenfalls noch erg&auml;nzen.<\/p>\n<p>Hat <b>strKriterium<\/b> nun nicht die L&auml;nge 0, wird der Wert True als Funktionswert zur&uuml;ckgegeben.<\/p>\n<h2>Suchbegriff im Nachschlagefeld holen<\/h2>\n<p>Wir haben oben bereits erw&auml;hnt, dass in Datenbl&auml;ttern auch Nachschlagefelder angezeigt werden k&ouml;nnen. Diese basieren meist auf Daten aus verkn&uuml;pften Tabellen wie im Beispiel des Feldes <b>AnredeID <\/b>und der Tabelle <b>tblAnreden<\/b>.<\/p>\n<p>Im Datenblatt wird zwar der Wert des Feldes <b>Anrede <\/b>dieser Tabelle angezeigt, aber tats&auml;chlich wird der Wert <b>AnredeID <\/b>gespeichert.<\/p>\n<p>Deshalb m&uuml;ssen wir in diesem Fall, wenn der Benutzer beispielsweise <b>Herr <\/b>als Suchbegriff eingibt, den Wert der gebundenen Spalte des Nachschlagefeldes ermitteln, damit wir zuverl&auml;ssig nach Eintr&auml;gen mit dem angezeigten Wert <b>Herr <\/b>suchen k&ouml;nnen. Dabei hilft die Funktion <b>SuchbegriffNachschlagefeldHolen<\/b> (siehe Listing 6).<\/p>\n<pre><span style=\"color:blue;\">Private Function <\/span>SuchbegriffNachschlagefeldHolen(fld<span style=\"color:blue;\"> As <\/span>DAO.Field, strSuchbegriff<span style=\"color:blue;\"> As String<\/span>, _\r\n         lngSteuerelementAnzeigen<span style=\"color:blue;\"> As Long<\/span>)<span style=\"color:blue;\"> As String<\/span>\r\n     On Error Resume <span style=\"color:blue;\">Next<\/span>\r\n     lngSteuerelementAnzeigen = fld.Properties(\"DisplayControl\")\r\n     <span style=\"color:blue;\">On Error GoTo<\/span> 0\r\n     Select Case lngSteuerelementAnzeigen\r\n         <span style=\"color:blue;\">Case <\/span>acComboBox, acListBox\r\n             SuchbegriffNachschlagefeldHolen = GebundenenWertHolen(fld, strSuchbegriff)\r\n         <span style=\"color:blue;\">Case Else<\/span>\r\n             SuchbegriffNachschlagefeldHolen = strSuchbegriff\r\n     <span style=\"color:blue;\">End Select<\/span>\r\n<span style=\"color:blue;\">End Function<\/span><\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 6: Suchbegriff aus einem Nachschlagefeld holen<\/span><\/b><\/p>\n<p>Sie erwartet einen Verweis auf das zu untersuchende Feld (zum Beispiel <b>AnredeID<\/b>), den Suchbegriff (<b>Herr<\/b>) und den bisher angenommenen Steuerelementtyp.<\/p>\n<p>Sie versucht, bei deaktivierter Fehlerbehandlung den Wert der Eigenschaft <b>DisplayControl <\/b>des Steuerelements zu ermitteln. Diese wird in der Regel nur gesetzt, wenn es sich nicht um ein Textfeld handelt. Dieser Wert wird in <b>lngSteuerelementAnzeigen <\/b>geschrieben.<\/p>\n<p>Wenn <b>lngSteuerelementAnzeigen<\/b> anschlie&szlig;end einen anderen Wert als <b>acTextBox <\/b>hat, der ja bereits mit diesem Parameter &uuml;bergeben wurde, ruft die Funktion eine weitere Funktion namens <b>GebundenenWertHolen <\/b>auf und &uuml;bergibt das Feld sowie den Suchbegriff. Das Ergebnis wird dann als Funktionswert zur&uuml;ckgegeben.<\/p>\n<h2>Gebundenen Wert eines Nachschlagefeldes holen<\/h2>\n<p>Die Funktion <b>GebundenenWertHolen<\/b> (siehe Listing 7) liest verschiedene Eigenschaften aus dem Feld aus <b>fld <\/b>aus: die Datensatzherkunft, die gebundene Spalte, die Spaltenanzahl und die Spaltenbreiten &#8211; also alles, was man zum Auslesen des Wertes der gebundenen Spalte f&uuml;r einen bestimmten Datensatz ben&ouml;tigt. Sie tr&auml;gt die Spaltenbreiten, die in einer Semikola-separierten Liste &uuml;bergeben werden, in ein Array namens <b>arrSpaltenbreiten <\/b>ein.<\/p>\n<pre><span style=\"color:blue;\">Private Function <\/span>GebundenenWertHolen(fld<span style=\"color:blue;\"> As <\/span>DAO.Field, strSuchbegriff<span style=\"color:blue;\"> As String<\/span>)\r\n     <span style=\"color:blue;\">Dim <\/span>strDatensatzherkunft<span style=\"color:blue;\"> As String<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>lngGebundeneSpalte<span style=\"color:blue;\"> As Long<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>lngSpaltenanzahl<span style=\"color:blue;\"> As Long<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>strSpaltenbreiten<span style=\"color:blue;\"> As String<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>arrSpaltenbreiten()<span style=\"color:blue;\"> As String<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>i<span style=\"color:blue;\"> As Integer<\/span>\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>rst<span style=\"color:blue;\"> As <\/span>DAO.Recordset\r\n     <span style=\"color:blue;\">Set<\/span> db = CurrentDb\r\n     strDatensatzherkunft = fld.Properties(\"RowSource\")\r\n     lngGebundeneSpalte = fld.Properties(\"BoundColumn\")\r\n     lngSpaltenanzahl = fld.Properties(\"ColumnCount\")\r\n     strSpaltenbreiten = fld.Properties(\"ColumnWidths\")\r\n     arrSpaltenbreiten = <span style=\"color:blue;\">Split<\/span>(strSpaltenbreiten, \";\")\r\n     For i = <span style=\"color:blue;\">LBound<\/span>(arrSpaltenbreiten) To <span style=\"color:blue;\">UBound<\/span>(arrSpaltenbreiten)\r\n         <span style=\"color:blue;\">If <\/span><span style=\"color:blue;\">Not<\/span> arrSpaltenbreiten(i) = 0<span style=\"color:blue;\"> Then<\/span>\r\n             <span style=\"color:blue;\">Exit For<\/span>\r\n         <span style=\"color:blue;\">End If<\/span>\r\n     <span style=\"color:blue;\">Next<\/span> i\r\n     <span style=\"color:blue;\">Set<\/span> rst = db.OpenRecordset(strDatensatzherkunft, dbOpenDynaset)\r\n     rst.FindFirst rst.Fields(i).Name & \" = ''\" & strSuchbegriff & \"''\"\r\n     <span style=\"color:blue;\">If <\/span><span style=\"color:blue;\">Not<\/span> rst.NoMatch<span style=\"color:blue;\"> Then<\/span>\r\n         GebundenenWertHolen = rst.Fields(lngGebundeneSpalte - 1)\r\n     <span style=\"color:blue;\">Else<\/span>\r\n         GebundenenWertHolen = 0\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: Gebundenen Wert f&uuml;r einen Suchbegriff in einem Nachschlagefeld holen<\/span><\/b><\/p>\n<p>Dieses durchl&auml;uft sie und ermittelt dann in einer Schleife &uuml;ber alle Werte den Index des ersten Eintrags, dessen Spaltenbreite nicht <b>0 <\/b>ist.<\/p>\n<p>Dann erstellt sie ein Recordset auf Basis der Datensatzherkunft und sucht nach dem ersten Datensatz, der in dem Feld mit diesem Index den Wert aus <b>strSuchbegriff <\/b>enth&auml;lt.<\/p>\n<p>Wenn ein Datensatz gefunden wird, ist der Wert der gebundenen Spalte dieses Datensatzes der gesuchte tats&auml;chliche Wert in diesem Feld, der dann als Funktionsergebnis zur&uuml;ckgegeben wird.<\/p>\n<h2>Suchen und Ersetzen<\/h2>\n<p>Damit kommen wir zum Suchen und Ersetzen von Inhalten. Dies l&auml;uft so ab, dass wir erst das Feld mit dem zu ersetzenden Inhalt finden m&uuml;ssen. Dazu nutzen wir die Schaltfl&auml;che <b>Weitersuchen<\/b>. Hat diese einen passenden Feldinhalt gefunden, k&ouml;nnen wir diesen mit der Schaltfl&auml;che <b>cmdErsetzen <\/b>gegen den Wert aus <b>cboErsetzenDurch <\/b>austauschen.<\/p>\n<p>Die Schaltfl&auml;che <b>cmdErsetzen <\/b>l&ouml;st die folgende Prozedur aus:<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>cmdErsetzen_Click()\r\n     <span style=\"color:blue;\">Call<\/span> InhaltErsetzen(Me.cboSuchenNach.Column(1), _\r\n         Me.cboErsetzenDurch.Column(1))\r\n     <span style=\"color:blue;\">Call<\/span> cmdWeitersuchen_Click\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p>Sie ruft eine weitere Prozedur namens <b>InhaltErsetzen <\/b>auf, welche das eigentliche Ersetzen durchf&uuml;hrt. Danach soll direkt der n&auml;chste zu ersetzende Eintrag gefunden werden, was durch den Aufruf der Prozedur <b>cmdWeitersuchen_Click <\/b>geschieht &#8211; also eigentlich durch das Simulieren eines Klicks auf <b>cmdWeitersuchen<\/b>.<\/p>\n<p>Die Prozedur <b>InhaltErsetzen <\/b>finden wir in Listing 8. Sie nimmt den zu ersetzenden Wert und den neuen Wert entgegen.<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>InhaltErsetzen(strZuErsetzen<span style=\"color:blue;\"> As String<\/span>, strErsetzenDurch<span style=\"color:blue;\"> As String<\/span>, bolTeil<span style=\"color:blue;\"> As Boolean<\/span>)\r\n     <span style=\"color:blue;\">Dim <\/span>strFeldinhalt<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;\">Set<\/span> ctl = objAktuellesDatenblatt.ActiveControl\r\n     Select Case Me.cboVergleichen\r\n         <span style=\"color:blue;\">Case <\/span>\"Teil des Feldinhalts\", \"Anfang des Feldinhalts\"\r\n             strFeldinhalt = ctl.Value\r\n             strFeldinhalt = <span style=\"color:blue;\">Replace<\/span>(strFeldinhalt, strZuErsetzen, strErsetzenDurch)\r\n             ctl.Value = strFeldinhalt\r\n         <span style=\"color:blue;\">Case <\/span>\"Ganzes Feld\"\r\n             ctl.Value = strErsetzenDurch\r\n     <span style=\"color:blue;\">End Select<\/span>\r\n     ctl.Parent.Dirty = <span style=\"color:blue;\">False<\/span>\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 8: Prozedur zum Ersetzen von Inhalten<\/span><\/b><\/p>\n<p>Das aktuelle Steuerelement, also das mit dem zu ersetzenden Inhalt, wird &uuml;ber die Eigenschaft <b>ActiveControl <\/b>des aktuellen Datensatzes von <b>objAktuellesDatenblatt <\/b>ermittelt.<\/p>\n<p>Wenn der Benutzer f&uuml;r <b>cboVergleichen<\/b> einen der Werte <b>Teil des Feldinhalts <\/b>oder <b>Anfang des Feldinhalts <\/b>ausgew&auml;hlt hat, lesen wir den aktuellen Inhalt des Steuerelements aus <b>ctl <\/b>in die Variable <b>strFeldinhalt <\/b>ein. Dann ersetzen wir die Teilzeichenkette durch den neuen Ausdruck und schreiben den neuen Wert zur&uuml;ck in das Feld.<\/p>\n<p>Im Falle der Wahl von <b>Ganzes Feld <\/b>tragen wir einfach <b>strErsetzenDurch <\/b>als Wert des Feldes ein.<\/p>\n<p>Danach speichern wir den Datensatz durch Einstellen der Eigenschaft <b>Dirty <\/b>auf den Wert <b>False<\/b>.<\/p>\n<h2>Zusammenfassung und Ausblick<\/h2>\n<p>In diesem Beitrag liefern wir die Suchen- und Ersetzen-Funktionen zu dem Dialog, den wir bereits im Beitrag <b>Optimierter &#8222;Suchen und Ersetzen&#8220;-Dialog: Grundger&uuml;st <\/b>(<b>www.access-im-unternehmen.de\/1560<\/b>) vorgestellt haben und f&uuml;r den wir in <b>Suchen und Ersetzen mit COM-Add-In <\/b>(<b>www.access-im-unternehmen.de\/1555<\/b>) ein COM-Add-In zum Starten &uuml;ber das Ribbon beschreiben.<\/p>\n<p>Dabei lernen Sie Einiges dar&uuml;ber, wie man die Suche in Datenbl&auml;ttern programmieren kann &#8211; inklusive Vorw&auml;rts- und R&uuml;ckw&auml;rtssuche sowie einer vollst&auml;ndigen Suche, die mittendrin gestartet werden kann und am Anfang des Recordsets fortgesetzt wird.<\/p>\n<h2>Downloads zu diesem Beitrag<\/h2>\n<p>Enthaltene Beispieldateien:<\/p>\n<p>amvSuchenUndErsetzen.accda<\/p>\n<p><a href=\"..\/fileadmin\/beispiele\/D58C5925-ACAC-49EC-845D-AC3843592119\/aiu_1561.zip\">Download<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Im Beitrag &#8222;Besserer &#8222;Suchen und Ersetzen&#8220;-Dialog: Grundger&uuml;st&#8220; haben wir das Grundger&uuml;st f&uuml;r einen Ersatz der eingebauten Suchen- und Ersetzen-Funktion von Access erstellt. Im vorliegenden Artikel wollen wir nun die Such- und Ersetzungsfunktionen mit Leben f&uuml;llen. Dabei werden Sie nicht nur die begonnene L&ouml;sung vervollst&auml;ndigen, sondern auch noch Einiges &uuml;ber das VBA-gesteuerte Suchen und Ersetzen in Datenbl&auml;ttern lernen.<\/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":[662025,66052025,44000025],"tags":[],"class_list":["post-55001561","post","type-post","status-publish","format-standard","hentry","category-662025","category-66052025","category-VBA_und_Programmiertechniken"],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v20.9 (Yoast SEO v27.4) - https:\/\/yoast.com\/product\/yoast-seo-premium-wordpress\/ -->\n<title>Optimierter &quot;Suchen und Ersetzen&quot;-Dialog: Funktionen - 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\/Optimierter_Suchen_und_ErsetzenDialog_Funktionen\/\" \/>\n<meta property=\"og:locale\" content=\"de_DE\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Optimierter &quot;Suchen und Ersetzen&quot;-Dialog: Funktionen\" \/>\n<meta property=\"og:description\" content=\"Im Beitrag &quot;Besserer &quot;Suchen und Ersetzen&quot;-Dialog: Grundger&uuml;st&quot; haben wir das Grundger&uuml;st f&uuml;r einen Ersatz der eingebauten Suchen- und Ersetzen-Funktion von Access erstellt. Im vorliegenden Artikel wollen wir nun die Such- und Ersetzungsfunktionen mit Leben f&uuml;llen. Dabei werden Sie nicht nur die begonnene L&ouml;sung vervollst&auml;ndigen, sondern auch noch Einiges &uuml;ber das VBA-gesteuerte Suchen und Ersetzen in Datenbl&auml;ttern lernen.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/access-im-unternehmen.de\/Optimierter_Suchen_und_ErsetzenDialog_Funktionen\/\" \/>\n<meta property=\"og:site_name\" content=\"Access im Unternehmen\" \/>\n<meta property=\"article:published_time\" content=\"2025-08-28T18:59:17+00:00\" \/>\n<meta property=\"og:image\" content=\"http:\/\/vg01.met.vgwort.de\/na\/e07774b1dfe648c2a12e29c4c2e2d145\" \/>\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=\"21\u00a0Minuten\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Optimierter_Suchen_und_ErsetzenDialog_Funktionen\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Optimierter_Suchen_und_ErsetzenDialog_Funktionen\\\/\"},\"author\":{\"name\":\"Andr\u00e9 Minhorst\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#\\\/schema\\\/person\\\/13395c4bcd7d7963efe33be9c584d93f\"},\"headline\":\"Optimierter &#8222;Suchen und Ersetzen&#8220;-Dialog: Funktionen\",\"datePublished\":\"2025-08-28T18:59:17+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Optimierter_Suchen_und_ErsetzenDialog_Funktionen\\\/\"},\"wordCount\":3234,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#organization\"},\"image\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Optimierter_Suchen_und_ErsetzenDialog_Funktionen\\\/#primaryimage\"},\"thumbnailUrl\":\"http:\\\/\\\/vg01.met.vgwort.de\\\/na\\\/e07774b1dfe648c2a12e29c4c2e2d145\",\"articleSection\":[\"2025\",\"5\\\/2025\",\"VBA und Programmiertechniken\"],\"inLanguage\":\"de\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/access-im-unternehmen.de\\\/Optimierter_Suchen_und_ErsetzenDialog_Funktionen\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Optimierter_Suchen_und_ErsetzenDialog_Funktionen\\\/\",\"url\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Optimierter_Suchen_und_ErsetzenDialog_Funktionen\\\/\",\"name\":\"Optimierter \\\"Suchen und Ersetzen\\\"-Dialog: Funktionen - Access im Unternehmen\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Optimierter_Suchen_und_ErsetzenDialog_Funktionen\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Optimierter_Suchen_und_ErsetzenDialog_Funktionen\\\/#primaryimage\"},\"thumbnailUrl\":\"http:\\\/\\\/vg01.met.vgwort.de\\\/na\\\/e07774b1dfe648c2a12e29c4c2e2d145\",\"datePublished\":\"2025-08-28T18:59:17+00:00\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Optimierter_Suchen_und_ErsetzenDialog_Funktionen\\\/#breadcrumb\"},\"inLanguage\":\"de\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/access-im-unternehmen.de\\\/Optimierter_Suchen_und_ErsetzenDialog_Funktionen\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"de\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Optimierter_Suchen_und_ErsetzenDialog_Funktionen\\\/#primaryimage\",\"url\":\"http:\\\/\\\/vg01.met.vgwort.de\\\/na\\\/e07774b1dfe648c2a12e29c4c2e2d145\",\"contentUrl\":\"http:\\\/\\\/vg01.met.vgwort.de\\\/na\\\/e07774b1dfe648c2a12e29c4c2e2d145\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Optimierter_Suchen_und_ErsetzenDialog_Funktionen\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/access-im-unternehmen.de\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Optimierter &#8222;Suchen und Ersetzen&#8220;-Dialog: Funktionen\"}]},{\"@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":"Optimierter \"Suchen und Ersetzen\"-Dialog: Funktionen - 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\/Optimierter_Suchen_und_ErsetzenDialog_Funktionen\/","og_locale":"de_DE","og_type":"article","og_title":"Optimierter \"Suchen und Ersetzen\"-Dialog: Funktionen","og_description":"Im Beitrag \"Besserer \"Suchen und Ersetzen\"-Dialog: Grundger&uuml;st\" haben wir das Grundger&uuml;st f&uuml;r einen Ersatz der eingebauten Suchen- und Ersetzen-Funktion von Access erstellt. Im vorliegenden Artikel wollen wir nun die Such- und Ersetzungsfunktionen mit Leben f&uuml;llen. Dabei werden Sie nicht nur die begonnene L&ouml;sung vervollst&auml;ndigen, sondern auch noch Einiges &uuml;ber das VBA-gesteuerte Suchen und Ersetzen in Datenbl&auml;ttern lernen.","og_url":"https:\/\/access-im-unternehmen.de\/Optimierter_Suchen_und_ErsetzenDialog_Funktionen\/","og_site_name":"Access im Unternehmen","article_published_time":"2025-08-28T18:59:17+00:00","og_image":[{"url":"http:\/\/vg01.met.vgwort.de\/na\/e07774b1dfe648c2a12e29c4c2e2d145","type":"","width":"","height":""}],"author":"Andr\u00e9 Minhorst","twitter_card":"summary_large_image","twitter_misc":{"Verfasst von":"Andr\u00e9 Minhorst","Gesch\u00e4tzte Lesezeit":"21\u00a0Minuten"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/access-im-unternehmen.de\/Optimierter_Suchen_und_ErsetzenDialog_Funktionen\/#article","isPartOf":{"@id":"https:\/\/access-im-unternehmen.de\/Optimierter_Suchen_und_ErsetzenDialog_Funktionen\/"},"author":{"name":"Andr\u00e9 Minhorst","@id":"https:\/\/access-im-unternehmen.de\/#\/schema\/person\/13395c4bcd7d7963efe33be9c584d93f"},"headline":"Optimierter &#8222;Suchen und Ersetzen&#8220;-Dialog: Funktionen","datePublished":"2025-08-28T18:59:17+00:00","mainEntityOfPage":{"@id":"https:\/\/access-im-unternehmen.de\/Optimierter_Suchen_und_ErsetzenDialog_Funktionen\/"},"wordCount":3234,"commentCount":0,"publisher":{"@id":"https:\/\/access-im-unternehmen.de\/#organization"},"image":{"@id":"https:\/\/access-im-unternehmen.de\/Optimierter_Suchen_und_ErsetzenDialog_Funktionen\/#primaryimage"},"thumbnailUrl":"http:\/\/vg01.met.vgwort.de\/na\/e07774b1dfe648c2a12e29c4c2e2d145","articleSection":["2025","5\/2025","VBA und Programmiertechniken"],"inLanguage":"de","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/access-im-unternehmen.de\/Optimierter_Suchen_und_ErsetzenDialog_Funktionen\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/access-im-unternehmen.de\/Optimierter_Suchen_und_ErsetzenDialog_Funktionen\/","url":"https:\/\/access-im-unternehmen.de\/Optimierter_Suchen_und_ErsetzenDialog_Funktionen\/","name":"Optimierter \"Suchen und Ersetzen\"-Dialog: Funktionen - Access im Unternehmen","isPartOf":{"@id":"https:\/\/access-im-unternehmen.de\/#website"},"primaryImageOfPage":{"@id":"https:\/\/access-im-unternehmen.de\/Optimierter_Suchen_und_ErsetzenDialog_Funktionen\/#primaryimage"},"image":{"@id":"https:\/\/access-im-unternehmen.de\/Optimierter_Suchen_und_ErsetzenDialog_Funktionen\/#primaryimage"},"thumbnailUrl":"http:\/\/vg01.met.vgwort.de\/na\/e07774b1dfe648c2a12e29c4c2e2d145","datePublished":"2025-08-28T18:59:17+00:00","breadcrumb":{"@id":"https:\/\/access-im-unternehmen.de\/Optimierter_Suchen_und_ErsetzenDialog_Funktionen\/#breadcrumb"},"inLanguage":"de","potentialAction":[{"@type":"ReadAction","target":["https:\/\/access-im-unternehmen.de\/Optimierter_Suchen_und_ErsetzenDialog_Funktionen\/"]}]},{"@type":"ImageObject","inLanguage":"de","@id":"https:\/\/access-im-unternehmen.de\/Optimierter_Suchen_und_ErsetzenDialog_Funktionen\/#primaryimage","url":"http:\/\/vg01.met.vgwort.de\/na\/e07774b1dfe648c2a12e29c4c2e2d145","contentUrl":"http:\/\/vg01.met.vgwort.de\/na\/e07774b1dfe648c2a12e29c4c2e2d145"},{"@type":"BreadcrumbList","@id":"https:\/\/access-im-unternehmen.de\/Optimierter_Suchen_und_ErsetzenDialog_Funktionen\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/access-im-unternehmen.de\/"},{"@type":"ListItem","position":2,"name":"Optimierter &#8222;Suchen und Ersetzen&#8220;-Dialog: Funktionen"}]},{"@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\/55001561","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=55001561"}],"version-history":[{"count":0,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/posts\/55001561\/revisions"}],"wp:attachment":[{"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/media?parent=55001561"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/categories?post=55001561"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/tags?post=55001561"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}