Dynamisch filteren

Status
Niet open voor verdere reacties.

jarsky

Gebruiker
Lid geworden
19 feb 2009
Berichten
36
Hallo,

ik heb een klein tooltje gebouwd die bij ons live op een netwerkschijf kijkt en in een listbox de gevonden mappen weergeeft, waarna er verdere stappen kunnen worden gedaan.

Hoe heb ik dit gedaan:
Met een combo box wordt eerst een regio geselecteerd en aan de hand hiervan wordt een tabel "Enduser_Name" gevuld met de namen van de gevonden mappen in die regio.
Een listbox die als rowsource de tabel "Tbl_Enduser_name" heeft wordt hiermee gevoed. Gewoon de naam van een map bijvoorbeeld "Testmap" etc

Wat wil ik bereiken:
Omdat de lijst die nu in de listbox staat steeds langer wordt en je behoorlijk moet scrollen, heb ik een unbound textveld boven de listbox gezet en die moet tijdens het intikken van een woord de listbox gaan filteren, zodat er een lijst overblijft waar je dan vervolgens uit kunt kiezen, Ik heb al veel gegoogeld etc maar nog steeds geen werkende versie kunenn vinden met aanpassingen.
Het is dus de bedoeling dat als je bijvoorbeeld een T intikt alleen nog maar de mapnamen worden getoond die ergens een T in hun naam hebben staan. tik je vervolgens een e in dan alleen nog maar de mappen met "Te" in de naam.
Waarbij dan dus bijvoorbeeld de genoemde "Testmap" zichtbaar wordt en de rest niet meer.
Het moet dus echt live zijn, dus intikken en meteen filteren, zoiets alsbij google zoeken.

ik hoor graag of dit mogelijk is en/of hulp om dit in vba te bouwen

gr Jan
 
Laatst bewerkt:
Dat kan uiteraard, maar ik zou zeggen: post eerst eens wat je zelf hebt gemaakt; dat scheelt een hoop voorwerk, en dubbel werk.
 
Dat kan uiteraard, maar ik zou zeggen: post eerst eens wat je zelf hebt gemaakt; dat scheelt een hoop voorwerk, en dubbel werk.

Dat wil ik best doen, maar wat wil je dan dat ik post. Ik heb nog geen vba code hiervoor. wel wat geprobeerd maar niets werkend gekregen, of wat er in de buurt kwam.
Ik had onder andere die van jou gebruikt in een ander topic met deze code:
Code:
Dim sFilter

    sFilter = "[List2] Like ""*" & Me.txtFilter.Text & "*"""
    Me.Filter = sFilter
    Me.FilterOn = True
    Me.txtFilter.SelStart = Me.txtFilter.SelLength
    Me.List2.Requery

Echter werkte dit niet en hierbij kwam dat als ik in de textbox wat intikte de woorden er achterstevoren in kwamen te staan. Oftewel 1e letter bijv een H 2e letter een A dan stond de A voor de H?

Toen bedacht ik misschien dat ik iets moest doen met de rowsource eigenschap van de list box maar ook dat werkte niet of maar voor de heelft.
Ik heb onderstaand gebruikt:

Code:
Me.List2.RowSourceType = "Table/Query"
Me.List2.RowSource = "SELECT Tbl_Enduser_naam.id, Tbl_Enduser_naam.Enduser_naam " & _
"From Tbl_Enduser_naam WHERE (((Tbl_Enduser_naam.Enduser_naam)   Like ""* " & [txtFilter] & " *""))" & _
"ORDER BY Tbl_Enduser_naam.Enduser_naam"
Me.List2.Requery

Ik kan dus ergens niet de juiste vingenr op de plek krijgen en heb het idee dat ik totaal verkeerd kijk.
Vandaar de vraag op het forum.

gr Jan
 
Je hebt een verkeerd voorbeeld opgezocht :)
Wat je moet doen, is een filter op de keuzelijst maken op de gebeurtenis <Bij wijzigen> van het tekstvak dat je gebruikt. Dit tekstvak filtert dan de keuzelijst. Ik heb een voorbeeldcode die een postcode keuzelijst filtert; dat is ook zo'n voorbeeld van een lijst die nogal groot kan zijn.
Code:
    If Not IsNumeric(Me.fltrPostcode.Text) Then
        If Len(Me.fltrPostcode.Text) > 0 Then Me.fltrPostcode.Text = Left(Me.fltrPostcode.Text, Len(Me.fltrPostcode.Text) - 1)
    Else
        strSQL = "SELECT Postcode, Van, Tem, Soort, StraatID FROM Postcodes " _
            & "WHERE Postcode Like '" & Me.fltrPostcode.Text & "*'" _
            & "ORDER BY Postcode, Soort, Van"
        Me.cboPostcode.RowSource = strSQL
        Me.cboPostcode.Requery
    End If
Deze keuzelijst filtert op het begin van de keuzelijst, en op getallen. Je zult hem dus een beetje moeten aanpassen als je op naam wilt filteren, en op elke plek in de tekst. De check hoeft er uiteraard niet bij als je op tekst filtert.
 
Je hebt een verkeerd voorbeeld opgezocht :)
Wat je moet doen, is een filter op de keuzelijst maken op de gebeurtenis <Bij wijzigen> van het tekstvak dat je gebruikt. Dit tekstvak filtert dan de keuzelijst. Ik heb een voorbeeldcode die een postcode keuzelijst filtert; dat is ook zo'n voorbeeld van een lijst die nogal groot kan zijn.
Code:
    If Not IsNumeric(Me.fltrPostcode.Text) Then
        If Len(Me.fltrPostcode.Text) > 0 Then Me.fltrPostcode.Text = Left(Me.fltrPostcode.Text, Len(Me.fltrPostcode.Text) - 1)
    Else
        strSQL = "SELECT Postcode, Van, Tem, Soort, StraatID FROM Postcodes " _
            & "WHERE Postcode Like '" & Me.fltrPostcode.Text & "*'" _
            & "ORDER BY Postcode, Soort, Van"
        Me.cboPostcode.RowSource = strSQL
        Me.cboPostcode.Requery
    End If
Deze keuzelijst filtert op het begin van de keuzelijst, en op getallen. Je zult hem dus een beetje moeten aanpassen als je op naam wilt filteren, en op elke plek in de tekst. De check hoeft er uiteraard niet bij als je op tekst filtert.

Oke, ga hem morgen even uitproberen en wat aanpassen. Je hoort nog of het is gelukt.

gr Jan
 
Om het je makkelijk te maken, hier de versie op tekst:
Code:
Private Sub fltrStraat_Change()
        strSQL = "SELECT StraatID, Straat FROM Straat WHERE (Straat Like '*" & Me.fltrStraat.Text & "*');"
        Me.cboStraat.RowSource = strSQL
        Me.cboStraat.Requery
        Me.cboStraat.SetFocus
        Me.cboStraat.Dropdown
End Sub
Deze heeft een extra grapje: hij opent gelijk de keuzelijst waarop je filtert. Niet erg handig overigens, want bij elke letter die je extra wilt filteren moet je weer terug naar het tekstvak, maar het geeft een beetje een idee wat er mogelijk is.
 
En doe ons een lol, en quoot alleen als dat nodig is; in het vorige bericht is de quoot volkomen overbodig, omdat mijn berichtje er pal boven staat. En dat niet alleen: een heel stuk leesbaarder ook. Het is een innerlijke drang die maar moeilijk is af te leren, maar probeer het toch :)
 
Laatst bewerkt:
Hoi,

aangepast en werkt uitstekend. :) Bedankt voor het meedenken.

Code:
Private Sub txtFilter_Change()

        strSQL = "SELECT Tbl_Enduser_naam.id, Tbl_Enduser_naam.Enduser_naam FROM Tbl_Enduser_naam " & _
            "WHERE Tbl_Enduser_naam.Enduser_naam  Like '*" & Me.txtFilter.Text & "*' " & _
            "ORDER BY Tbl_Enduser_naam.Enduser_naam "
        Me.List2.RowSource = strSQL
        Me.List2.Requery
End Sub

Gr Jan
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan