Hallo zusammen,
in meiner Access-Datenbank gibt es eine Tabelle tblStandorte, in der verschiedene Standorte von Unternehmen gespeichert werden. Zudem habe ich ein Formular frmlStandorte erstellt, das es ermöglicht, neue Standorte hinzuzufügen oder bestehende zu bearbeiten. Gerade weil die Liste sehr lang werden wird, habe ich ein ungebundenes Kombinationsfeld cboSuche als Suchfeld erstellt. Das Kombinationsfeld hat als Herkunftstyp "Tabelle/Abfrage" eingestellt und als Datensatzherkunft greift es über die SQL-Abfrage
SELECT tblStandorte.StandortID, tblStandorte.Standort FROM tblStandorte ORDER BY tblStandorte.Standort;
auf die Tabelle Standorte zu, um in der Auswahl die Liste der alphabetisch sortierten Standorte anzuzeigen. Soweit funktioniert wie gesagt alles prima und ich kann mit dem Formular problemlos neue Standorte hinzufügen oder bearbeiten.
Mein Problem:
Da wie gesagt die Liste an Standorten bald sehr lang sein wird, möchte ich über das Suchfeld (Kombinationsfeld) schnell einen Standort suchen, um ihn zu bearbeiten. Allerdings funktioniert das bisher nur, wenn ich exakt die Anfangsbuchstaben eingebe. Als Beispiel kann der Ort "Ludwigshafen am Rhein" dienen. Das Kombinationsfeld findet den Standort, wenn ich "Ludw..." eingebe, allerdings nicht wenn ich "hafen" oder "Rhein" eingebe. Wie kann ich das umstellen, sodass auch Teile der Wörter oder Abfolgen von Buchstaben erkannt werden?
Gruß
ChemSim
Hallo,
Dazu musst du zuerst die Eigenschaft "Automatisch ergänzen" auf "Nein" einstellen,
und die Eigenschaft "Bei Änderung" auf "Ereignisprozedur" stellen.
Dann fügst du folgende Ereignisprozedur in das Formmodul ein
Private Sub DeinKombi_Change()
With Me
If Len(.DeinKombi.Text) > 0 Then
.DeinKombi.RowSource = _
"SELECT StandortID, Standort " _
& "FROM tblStandorte " _
& "WHERE Standort LIKE '*" & .DeinKombi.Text & "*'"
& "ORDER BY Standort"
.DeinKombi.Dropdown
End If
End With
End SubDas mit dem .Dropdown scheint allerdings nicht zuverlässig zu funktionieren. Beim
ersten Testen hat's geklappt, dann nicht mehr. Zeigt beim Aufklappen aber immer
die gefilterten DS an.
gruss ekkehard
Hallo Ekkehard,
sobald ich den Code (angepasst auf den Namen meines Kombinationsfeldes cboSuche):
Private Sub cboSuche_Change()
With Me
If Len(.cboSuche.Text) > 0 Then
.cboSuche.RowSource = _
"SELECT StandortID, Standort " _
& "FROM tblStandorte " _
& "WHERE Standort LIKE '*" & .cboSuche.Text & "*'"
& "ORDER BY Standort"
.cboSuche.Dropdown
End If
End With
End Sub
das Formular speichere und in die Suche gehe, bekomme ich einen Syntaxfehler.
Gruß
Simon
Zitatbekomme ich einen Syntaxfehler.
So, so ..., soll ich mir einen ausdenken?
Hallo,
der Syntaxfehler wird nicht genau beschrieben:
Unbenannt.PNG
Der Fehler tritt sowohl dann auf, wenn ich einen Eintrag aus dem Kombinationsfeld auswähle, als auch wenn ich versuche einen Buchstaben einzugeben.
Gruß,
Simon
Hallo,
starte mal das Kompilieren über den VBA Editor direkt.
Hallo,
wenn ich den Code direkt im VBA-Editor ausführen möchte
Unbenannt.PNG
ploppt dieses Feld auf:
Makro.PNG
obwohl die richtige Datenbank ausgewählt ist.
Zitatdas Formular speichere und in die Suche gehe, bekomme ich einen Syntaxfehler.
Edit: So wie ich das sehe, hat er ein Problem mit der Zeile:
& "ORDER BY Standort"Gruß
Simon
Der Fehler liegt an einem fehlenden Leerzeichen
& "WHERE Standort LIKE '*" & .cboSuche.Text & "*' "(ganz hinten das letzte)
Vielleicht sollte ich mein eigenes Tool (http://access-codelib.net/download/addins/SqlDebugPrint.zip) öfter mal benutzen.
ZitatDer Fehler liegt an einem fehlenden Leerzeichen
Auch mit dem Leerzeichen funktioniert es bei mir nicht. Sobald ich in das Kombifeld klicke und was mache, kommt der Debugger des VBA-Editors und er markiert mir immer die Zeile
& "ORDER BY Standort"als falsch?!
Oh man, wie peinlich, da fehlt noch das Zeilenumbruchzeichen
& "WHERE Standort LIKE '*" & .cboSuche.Text & "*'" _
Zitatda fehlt noch das Zeilenumbruchzeichen
Habe ich ergänzt und jetzt ist der vorherige Fehler weg. Wenn ich jetzt einen Standort auswähle, bekomme ich aber diesen Laufzeitfehler:
Unbenannt.PNG
und der Code stoppt hier:
VBA-Code.PNG
Die Suche würde aber funktionieren und der Fehler kommt nur, wenn ich auf einen Standort klicke.
Hallo,
ich habe gerade etwas weiter an dem Fehler gesucht und der folgende Code funktioniert jetzt:
Private Sub cboSuche_Change()
With Me
.cboSuche.SetFocus ' Setze den Fokus auf das Steuerelement
If Len(.cboSuche.Text) > 0 Then
.cboSuche.RowSource = _
"SELECT StandortID, Standort " _
& "FROM tblStandorte " _
& "WHERE Standort LIKE '*" & .cboSuche.Text & "*'" _
& "ORDER BY Standort"
.cboSuche.Dropdown
End If
End With
End Sub
Ich habe noch die Zeile
.cboSuche.SetFocus ' Setze den Fokus auf das Steuerelement
eingefügt.
Gruß,
Simon
Eine kleine Zusatzbetrachtung. Das Change-Event ist sehr dynamisch. Bei größeren Datenmengen und schlechteren Netzwerkverbindungen kann dass jeweilige Neuladen sehr anstrengend und inperformant sein, zumal die verwendete Filterung per Mustersuche keine Indexnutzung bietet.
Eine kleine Entspannung könnte es da sein, wenn man die RowSource der ComboBox anfangs leer lässt und erst nach Eingabe mehrerer Zeichen das Laden beginnt. Etwa
If Len(.cboSuche.Text) > 3 Then
sWhere = "WHERE Standort LIKE '*" & .cboSuche.Text & "*'"
Else
sWhere = "WHERE False"
End If
Hallo,
der Code
Private Sub cboSuche_Change()
With Me
.cboSuche.SetFocus ' Setze den Fokus auf das Steuerelement
If Len(.cboSuche.Text) > 3 Then
sWhere = "WHERE Standort LIKE '*" & .cboSuche.Text & "*'"
Else
sWhere = "WHERE False"
End If
End With
End Sub
funktioniert bei mir leider nicht, daher lasse ich es so.
Gruß,
Simon
Das mit dem Focus verstehe ich zwar nicht. Das Control muss doch den Focus
haben wenn das Change-Ereignis getriggert wird.
Ansonsten kannst du auch im funktionierenden Code erst ab dem 3. Zeichen
anfangen zu filtern.