Dynamisch filteren in access Uitgebreid

Status
Niet open voor verdere reacties.

Basenburgen

Gebruiker
Lid geworden
25 feb 2011
Berichten
59
Hallo,

Ik wil graag een dynamisch filter om in meerdere velden tegelijk te zoeken.
Vaak is maar een deel van de gegevens voor handen en zoek ik een manier om toch met beperkte gegevens het juiste dossier te zoeken.
(Vervolgens wil ik het DossierID opslaan wat ik verder wil gebruiken. Maar daar moet ik wel uitkomen)

Helaas krijg ik het bestandje niet geupload in de bijlage (ongeveer 40 kb) Dus ik zal het nog iets uitgebreider beschrijven.

Ik heb een TBL_Klanten en een TBL_Dossiers.
TBL_Dossiers bestaat uit; DossierID(autnummering), Dossier (Tekst bijvoorbeeld; A-1234), Klant (gekoppeld met TBL_Klanten), Werk, Werknummer, Plaats en Actief (Ja/Nee om inactieve dossiers weg te filteren).
Vervolgens heb ik FRM_Dossiers aangemaakt met de velden uit TBL_Dossiers.
Deze staan in tabelindeling zodat ik in de kop bovenin de labels heb dan een regel met niet-afhankelijke tekstinvoervelden met in de details de tekstvelden die uit TBL_dossiers gehaald worden waarin gesorteerd moet worden. Rechts van iedere regel zit vervolgens een knop die de DossierID moet opslaan voor verdergebruik.

Ik heb de VBA code (waar ik erg slecht in ben helaas) uit het (laatste) voorbeeld bestandje van dit topic http://www.helpmij.nl/forum/showthread.php/552084-Dynamisch-filteren-in-Access aangepast.
Maar ik loop tegen flink wat problemen aan...

Code:
Option Compare Database
Option Explicit
Option Base 1
Dim rst As Recordset
Dim sNaam As String, sTag As String, tmp As String, sWaarde As String
Dim x As Integer, i As Integer

Private Sub Form_Current()
    CheckScrollbar
End Sub

Private Sub Form_Load()
    CheckScrollbar
End Sub

Private Sub cmdFilterLeeg_Click()
Dim sControl As String
''MsgBox TypeName(sControl)
    
    sControl = Screen.PreviousControl.Name
    Me.txtFilterDossierID = ""
    Me.txtFilterDossier = ""
    Me.txtFilterKlant = ""
    Me.txtFilterWerk = ""
    Me.txtFilterWerknummer = ""
    Me.txtFilterPlaats = ""
    Me.Filter = ""
    Me.FilterOn = False
    Me.Requery
    Me(sControl).SetFocus
    CheckScrollbar
''    Form_Current

End Sub

Private Sub fraOptie_AfterUpdate()
    CheckFilter
End Sub

Private Sub txtFilterDossierID_Change()
    sNaam = Screen.ActiveControl.Name
    sTag = Screen.ActiveControl.Tag
    sWaarde = Me.txtFilterDossierID.Text
    CheckFilter sNaam, sWaarde
    Me.txtFilterDossierID = sWaarde
    Me.txtFilterDossierID.SelStart = Me.txtFilterDossierID.SelLength
End Sub

Private Sub txtFilterDossier_Change()
    sNaam = Screen.ActiveControl.Name
    sTag = Screen.ActiveControl.Tag
    sWaarde = Me.txtFilterDossier.Text
    CheckFilter sNaam, sWaarde
    Me.txtFilterDossier = sWaarde
    Me.txtFilterDossier.SelStart = Me.txtFilterDossier.SelLength
End Sub

Private Sub txtFilterKlant_Change()
    sNaam = Screen.ActiveControl.Name
    sTag = Screen.ActiveControl.Tag
    sWaarde = Me.txtFilterKlant.Text
    CheckFilter sNaam, sWaarde
    Me.txtFilterKlant = sWaarde
    Me.txtFilterKlant.SelStart = Me.txtFilterKlant.SelLength
End Sub

Private Sub txtFilterWerk_Change()
    sNaam = Screen.ActiveControl.Name
    sTag = Screen.ActiveControl.Tag
    sWaarde = Me.txtFilterWerk.Text
    CheckFilter sNaam, sWaarde
    Me.txtFilterWerk = sWaarde
    Me.txtFilterWerk.SelStart = Me.txtFilterWerk.SelLength
End Sub

Private Sub txtFilterWerknummer_Change()
    sNaam = Screen.ActiveControl.Name
    sTag = Screen.ActiveControl.Tag
    sWaarde = Me.txtFilterWerknummer.Text
    CheckFilter sNaam, sWaarde
    Me.txtFilterWerknummer = sWaarde
    Me.txtFilterWerknummer.SelStart = Me.txtFilterWerknummer.SelLength
End Sub

Private Sub txtFilterPlaats_Change()
    sNaam = Screen.ActiveControl.Name
    sTag = Screen.ActiveControl.Tag
    sWaarde = Me.txtFilterPlaats.Text
    CheckFilter sNaam, sWaarde
    Me.txtFilterPlaats = sWaarde
    Me.txtFilterPlaats.SelStart = Me.txtFilterPlaats.SelLength
End Sub

Private Function CheckFilter(Optional Zoekveld As String, Optional Waarde As String)
Dim sFilter As String
Dim sFilters() As String, sTekst() As String
Dim ctl As Control
Dim sAndOr As String
Dim rst As Recordset
Dim iFltr As Integer

'Eerst de grootte van de matrix bepalen.... .......................... Vanaf hier is het abracadabra voor mij... :(
x = 0
iFltr = 0
For Each ctl In Controls
    With ctl
        If LCase(Left(.Name, 9)) = "txtFilter" Then
            .SetFocus
            iFltr = iFltr + 1
            On Error Resume Next
            If Not .Text = "" Then
                x = x + 1
                ReDim Preserve sTekst(x)
                sTekst(x) = .Text
            End If
        End If
    End With
Next ctl

'Als de tekstfilters leeg zijn, dan filter leegmaken en stoppen....
If x = 0 Then GoTo LeegFilter
'...... anders doorgaan, en matrix herdefiniëren.
ReDim sFilters(x, 3)

'Dan de variabelen vullen met gegevens
i = 0
x = 0
For Each ctl In Controls
    With ctl
        If LCase(Left(.Name, 9)) = "txtFilter" Then
            .SetFocus
''            MsgBox Asc(.Text)
            If Not sTekst((i + 1)) = "" Then
                i = i + 1
                sFilters(i, 1) = .Tag
                sFilters(i, 2) = sTekst(i)
                sFilters(i, 3) = .Name
                x = x + 1
            End If
        End If
    End With
Next ctl

'Dan op basis van de variabelen het filter opbouwen..................  Dit stukje snap ik denk ik weer maar moet altijd AND zijn
Select Case Me.fraOptie.Value
    Case 1
        sAndOr = " AND "
    Case 2
        sAndOr = " OR "
End Select


'.......................................................................Ik denk dat ik hier iets moet aanpassen naar de txtFilters?
For i = LBound(sFilters) To UBound(sFilters)
    If LBound(sFilters) = UBound(sFilters) Then
        sFilter = "[" & sFilters(i, 1) & "] Like ""*" & sFilters(i, 2) & "*"""
    Else
        sFilter = sFilter & "[" & sFilters(i, 1) & "] Like ""*" & sFilters(i, 2) & "*"""
        If i < UBound(sFilters) Then
            sFilter = sFilter & sAndOr
        End If
    End If
Next i

'Filter vervolgens op formulier toepassen.
Me.Filter = sFilter
Me.FilterOn = True

If Not Zoekveld = "" Then
    Me(Zoekveld).SetFocus
End If

Set rst = Me.RecordsetClone
With rst
    .Bookmark = Me.Bookmark
    Me!lblNavigate.Caption = "Record " & _
        .AbsolutePosition + 1 _
        & " of " & .RecordCount
    .MoveLast
    .MovePrevious
    If .RecordCount < 26 Then
        Me.ScrollBars = 0
    Else
        Me.ScrollBars = 2
    End If
End With

Exit Function

LeegFilter:
    Me.Filter = ""
    Me.FilterOn = False
    On Error Resume Next
    Me(Zoekveld).SetFocus

End Function

Function CheckScrollbar()
    
    Set rst = Me.RecordsetClone
    If Me.NewRecord Then
        Me!lblNavigate.Caption = "New Record"
    Else
        With rst
            .Bookmark = Me.Bookmark
            Me!lblNavigate.Caption = "Record " & _
                .AbsolutePosition _
                & " of " & .RecordCount
        End With
    End If
    On Error GoTo Stoppen
    rst.MoveLast
    rst.MovePrevious
    If rst.RecordCount < 26 Then
        Me.ScrollBars = 0
    Else
        Me.ScrollBars = 2
    End If

Stoppen:

End Function


Private Sub LeegFilter_Click()

End Sub

weet iemand raad?

alvast bedankt
 
De functie hoeft in beginsel niet aangepast te worden; tenzij je de objecten en variabelen een andere naam wilt geven. Maar daar is natuurlijk niet echt een reden voor te bedenken ;) Wat is het probleem met uploaden? Normaal gesproken mag 40 kb geen probleem zijn; probeer het bestand anders eerst te zippen, dan moet het vast wel lukken.
 
ik heb het als los bestand geprobeerd met en zonder code en ingepakt in rar en zip maar hij pakt geen van allen. hij geeft alleen upload failed... :s

De code in het vorige bestand heeft 2 filter invoerschermen en deze heeft er 6.
Ik heb de stukjes txtFilter1 nu gekopieerd en geplakt en de namen veranderd.
(de enige reden waarom ik de namen had veranders was om het iets overzichtelijker te maken voor deze VBA leek. Aangezien de functionaliteit toch niet aangepast wordt :) )

Daarnaast hoeft de en/of selectie voor mij niet aangezien ik graag wil dat hij zoekt op de invoer in de betreffende kolom.
In de code loopt hij nu vast op de and or selectie die ik er niet in heb zitten.
 
Dan is het simpel: de code weer terugzetten :) Overigens hoef je de functionaliteit niet te gebruiken natuurlijk; de code maakt gebruik van standaardinstellingen op de objecten. Als je ze op je formulier onzichtbaar maakt, kan de gebruiker er niks mee, en blijft de code toch gewoon werken.
Als je enig inzicht in de code hebt/krijgt, kun je daarna altijd de vba wel aanpassen.
De filters kun je onbeperkt uitbreiden, zolang de naamconventie maar consequent blijft. Daarom heten de filtervelden txtFilter1, txtFilter2 etc. Hetzelfde geld voor de keuzelijsten. Dus elk nieuw filterveld dat je toevoegt, wordt automatisch meegenomen.
 
Hmm klinkt een stuk logischer, ik heb de code weer braaf terug gezet.
Ik snap de code!
dank je wel!

Voor andere gebruikers/prutsers zoals ik met hetzelfde probleem: :-)
Je maakt een zoekveld aan bijvoorbeeld txtFilter1
Bij extra info typ je de naam van het veld waarin je wilt filteren.

Dus in mijn geval maak ik voor de kolom DossierID txtFilter1 aan en in extra info zet ik DossierID.
Zo werkt het fantastisch!
 
oeps toch te vroeg gejuicht ik ben bang dat ik dit stukje code ook nog aan moet passen?

Code:
For i = LBound(sFilters) To UBound(sFilters)
    If LBound(sFilters) = UBound(sFilters) Then
        sFilter = "[" & sFilters(i, 1) & "] Like ""*" & sFilters(i, 2) & "*"""
    Else
        sFilter = sFilter & "[" & sFilters(i, 1) & "] Like ""*" & sFilters(i, 2) & "*"""
        If i < UBound(sFilters) Then
            sFilter = sFilter & sAndOr
        End If
    End If
Next i
maar hoe...? :(
 
Laatst bewerkt door een moderator:
Ik vermoed dat DossierID een numerieke waarde is. De filters zijn gebouwd op tekst, wat de meest voorkomende zoekvraag is. Om op getallen te zoeken, moet het filter dus worden uitgebreid met een numerieke check. Die zit hier nu in verwerkt. Ook heb ik de AND filterwaarde vastgezet. Het frame kun je nu weggooien, of verbergen voor het geval je 'm ooit nog wil gaan gebruiken.

Code:
'[COLOR="seagreen"] Dan op basis van de variabelen het filter opbouwen..................
' Als je niet hoeft te kunnen filteren op AND of OR,
' dan kun je de variabele sAndOr ook vullen met een standaardwaarde.[/COLOR]
sAndOr = " AND "

[COLOR="seagreen"]' Wil je wel kunnen selecteren, dan gebruik je het frame met de selectieoptie.
' In dat geval moet de code weer actief gemaakt worden!
''Select Case Me.fraOptie.Value
''    Case 1
''        sAndOr = " AND "
''    Case 2
''        sAndOr = " OR "
''End Select

'..................................................................................................[/COLOR]
For i = LBound(sFilters) To UBound(sFilters)
    If LBound(sFilters) = UBound(sFilters) Then
[COLOR="seagreen"]        ' -----------------------------------------------------------------------------------------
        ' Extra check op numerieke waarden; het filter wordt dan anders.
        ' -----------------------------------------------------------------------------------------[/COLOR]
        If IsNumeric(sFilters(i, 2)) Then
            sFilter = "[" & sFilters(i, 1) & "] =" & sFilters(i, 2)
        Else
            sFilter = "[" & sFilters(i, 1) & "] Like ""*" & sFilters(i, 2) & "*"""
        End If
    Else
[COLOR="seagreen"]        ' -----------------------------------------------------------------------------------------
        ' Extra check op numerieke waarden; het filter wordt dan anders.
        ' -----------------------------------------------------------------------------------------[/COLOR]
        If IsNumeric(sFilters(i, 2)) Then
            sFilter = sFilter & "[" & sFilters(i, 1) & "] =" & sFilters(i, 2)
        Else
            sFilter = sFilter & "[" & sFilters(i, 1) & "] Like ""*" & sFilters(i, 2) & "*"""
        End If
        If i < UBound(sFilters) Then
            sFilter = sFilter & sAndOr
        End If
    End If
Next i
 
Laatst bewerkt:
Ja het is inderdaad een autonummering :-)
Wat ik echter bedoelde is dat in de code het tot txtFilter2 gaat en ik nu 6 txtFilters heb.
Dus daar loop ik nog meevast... :(
hij geeft nu een fout bij txtFilter 3
Ik heb txtFilter3-6 gekopieerd en geplakt maar ik heb het idee dat ik in het stukje van de vorige keer ook iets aan moet passen?

Code:
Option Compare Database
Option Explicit
Option Base 1
Dim rst As Recordset
Dim sNaam As String, sTag As String, tmp As String, sWaarde As String
Dim x As Integer, i As Integer

Private Sub Form_Current()
    CheckScrollbar
End Sub


Private Sub cmdFilterLeeg_Click()
Dim sControl As String
''MsgBox TypeName(sControl)
    
    sControl = Screen.PreviousControl.Name
    Me.txtFilter1 = ""
    Me.txtFilter2 = ""
    Me.txtFilter3 = ""
    Me.Filter = ""
    Me.FilterOn = False
    Me.Requery
    Me(sControl).SetFocus
    CheckScrollbar
''    Form_Current

End Sub

Private Sub fraOptie_AfterUpdate()
    CheckFilter
End Sub

Private Sub txtFilter1_Change()
    sNaam = Screen.ActiveControl.Name
    sTag = Screen.ActiveControl.Tag
    sWaarde = Me.txtFilter1.Text
    CheckFilter sNaam, sWaarde
    Me.txtFilter1 = sWaarde
    Me.txtFilter1.SelStart = Me.txtFilter1.SelLength
End Sub

Private Sub txtFilter2_Change()
    sNaam = Screen.ActiveControl.Name
    sTag = Screen.ActiveControl.Tag
    sWaarde = Me.txtFilter2.Text
    CheckFilter sNaam, sWaarde
    Me.txtFilter2 = sWaarde
    Me.txtFilter2.SelStart = Me.txtFilter2.SelLength
End Sub

Private Sub txtFilter3_Change()
    sNaam = Screen.ActiveControl.Name
    sTag = Screen.ActiveControl.Tag
    sWaarde = Me.txtFilter3.Text
    CheckFilter sNaam, sWaarde
    Me.txtFilter3 = sWaarde
    Me.txtFilter3.SelStart = Me.txtFilter3.SelLength
End Sub

Private Sub txtFilter4_Change()
    sNaam = Screen.ActiveControl.Name
    sTag = Screen.ActiveControl.Tag
    sWaarde = Me.txtFilter4.Text
    CheckFilter sNaam, sWaarde
    Me.txtFilter4 = sWaarde
    Me.txtFilter4.SelStart = Me.txtFilter4.SelLength
End Sub

Private Sub txtFilter5_Change()
    sNaam = Screen.ActiveControl.Name
    sTag = Screen.ActiveControl.Tag
    sWaarde = Me.txtFilter5.Text
    CheckFilter sNaam, sWaarde
    Me.txtFilter5 = sWaarde
    Me.txtFilter5.SelStart = Me.txtFilter5.SelLength
End Sub

Private Sub txtFilter3_Change()
    sNaam = Screen.ActiveControl.Name
    sTag = Screen.ActiveControl.Tag
    sWaarde = Me.txtFilter3.Text
    CheckFilter sNaam, sWaarde
    Me.txtFilter6 = sWaarde
    Me.txtFilter6.SelStart = Me.txtFilter6.SelLength
End Sub

Private Function CheckFilter(Optional Zoekveld As String, Optional Waarde As String)
Dim sFilter As String
Dim sFilters() As String, sTekst() As String
Dim ctl As Control
Dim sAndOr As String
Dim rst As Recordset
Dim iFltr As Integer

'Eerst de grootte van de matrix bepalen....
x = 0
iFltr = 0
For Each ctl In Controls
    With ctl
        If LCase(Left(.Name, 9)) = "txtFilter" Then
            .SetFocus
            iFltr = iFltr + 1
            On Error Resume Next
            If Not .Text = "" Then
                x = x + 1
                ReDim Preserve sTekst(x)
                sTekst(x) = .Text
            End If
        End If
    End With
Next ctl

'Als de tekstfilters leeg zijn, dan filter leegmaken en stoppen....
If x = 0 Then GoTo LeegFilter
'...... anders doorgaan, en matrix herdefiniëren.
ReDim sFilters(x, 3)

'Dan de variabelen vullen met gegevens
i = 0
x = 0
For Each ctl In Controls
    With ctl
        If LCase(Left(.Name, 9)) = "txtFilter" Then
            .SetFocus
''            MsgBox Asc(.Text)
            If Not sTekst((i + 1)) = "" Then
                i = i + 1
                sFilters(i, 1) = .Tag
                sFilters(i, 2) = sTekst(i)
                sFilters(i, 3) = .Name
                x = x + 1
            End If
        End If
    End With
Next ctl


' Dan op basis van de variabelen het filter opbouwen..................
' Als je niet hoeft te kunnen filteren op AND of OR,
' dan kun je de variabele sAndOr ook vullen met een standaardwaarde.
sAndOr = " AND "

' Wil je wel kunnen selecteren, dan gebruik je het frame met de selectieoptie.
' In dat geval moet de code weer actief gemaakt worden!
''Select Case Me.fraOptie.Value
''    Case 1
''        sAndOr = " AND "
''    Case 2
''        sAndOr = " OR "
''End Select

'..................................................................................................
For i = LBound(sFilters) To UBound(sFilters)
    If LBound(sFilters) = UBound(sFilters) Then
        ' -----------------------------------------------------------------------------------------
        ' Extra check op numerieke waarden; het filter wordt dan anders.
        ' -----------------------------------------------------------------------------------------
        If IsNumeric(sFilters(i, 2)) Then
            sFilter = "[" & sFilters(i, 1) & "] =" & sFilters(i, 2)
        Else
            sFilter = "[" & sFilters(i, 1) & "] Like ""*" & sFilters(i, 2) & "*"""
        End If
    Else
        ' -----------------------------------------------------------------------------------------
        ' Extra check op numerieke waarden; het filter wordt dan anders.
        ' -----------------------------------------------------------------------------------------
        If IsNumeric(sFilters(i, 2)) Then
            sFilter = sFilter & "[" & sFilters(i, 1) & "] =" & sFilters(i, 2)
        Else
            sFilter = sFilter & "[" & sFilters(i, 1) & "] Like ""*" & sFilters(i, 2) & "*"""
        End If
        If i < UBound(sFilters) Then
            sFilter = sFilter & sAndOr
        End If
    End If
Next i

'Filter vervolgens op formulier toepassen.
Me.Filter = sFilter
Me.FilterOn = True

If Not Zoekveld = "" Then
    Me(Zoekveld).SetFocus
End If

Set rst = Me.RecordsetClone
With rst
    .Bookmark = Me.Bookmark
    Me!lblNavigate.Caption = "Record " & _
        .AbsolutePosition + 1 _
        & " of " & .RecordCount
    .MoveLast
    .MovePrevious
    If .RecordCount < 26 Then
        Me.ScrollBars = 0
    Else
        Me.ScrollBars = 2
    End If
End With

Exit Function

LeegFilter:
    Me.Filter = ""
    Me.FilterOn = False
    On Error Resume Next
    Me(Zoekveld).SetFocus

End Function

Function CheckScrollbar()
    
    Set rst = Me.RecordsetClone
    If Me.NewRecord Then
        Me!lblNavigate.Caption = "New Record"
    Else
        With rst
            .Bookmark = Me.Bookmark
            Me!lblNavigate.Caption = "Record " & _
                .AbsolutePosition _
                & " of " & .RecordCount
        End With
    End If
    On Error GoTo Stoppen
    rst.MoveLast
    rst.MovePrevious
    If rst.RecordCount < 26 Then
        Me.ScrollBars = 0
    Else
        Me.ScrollBars = 2
    End If

Stoppen:

End Function
 
Het enige dat je aan zou moeten passen, is de code bij het leegmaken van de filters. Dat gebeurt nu op basis van de volledige naam. Verder kijkt de functie alleen naar de eerste letters van de naam; daarbij maakt het dus niet uit hoeveel tekstvakken je hebt. Zolang ze maar "txtfilter" en nog wat heten. Je mag de filters zelfs txtfilter_jaap of txtfilter_Hendrik_jan_de_tuinman noemen. Voor het gemak heb ik ze genummerd, maar dat boeit dus echt niet. daarom snap ik niet helemaal waarom hij bij jou niet werkt.

De code bij de verschillende tekstvakken kan overigens nog universeler. Dat moet dan zo:

Code:
Private Sub txtFilterDossierID_Change()
    sNaam = Screen.ActiveControl.Name
    sTag = Me(sNaam).Tag
    sWaarde = Me(sNaam).Text
    CheckFilter sNaam, sWaarde
    Me(sNaam) = sWaarde
    Me(sNaam).SelStart = Me(sNaam).SelLength
End Sub

De code kun je nu blindelings kopieëren naar elk tekstvak; hij haalt zelf de naam op van het tekstvak, en leest dan de Tag ervan uit. De tag, maar dat weet je al, bevat de Veldnaam die je wilt filteren.
 
Een reden waarom ik filtervakken een identieke naam geef is deze routine:

Code:
For i=1 to 6
    Me("txtFilter" & i) = ""
Next i

Heb je meer filters, dan verander je de TO waarde.
 
Hoe bedoel je dat je de TO waarde verandert?

Ik heb alleen in de eerste code de unieke namen gebruikt.
Ik gebruik nu ook braaf de txtFilter1-6 veldnamen (dit is toch sName), dat dit slimmer is had ik inmiddels door. :-)
Bij Extra Info vul ik vervolgens het veldnaam in wat ik gefilterd wil. (dit is toch de sTag waarde)
(wat ik vervolgens invoer is toch sWaarde)

vervolgens is CheckFilter een verwijzing naar de code CheckFilter
Dit stuk code is nog steeds abracadabra maar zorgt voor het effectieve filteren neem ik aan.

Hij lijkt desondanks toch een beete at Random te filteren.
Als ik in veld 6 iets invoer lijkt het te filteren op dossiernaam... (het 2e veld)
Zou er toch iets met de code die ik gebruik of het formulier dat ik gemaakt heb?

Code:
Option Compare Database
Option Explicit
Option Base 1
Dim rst As Recordset
Dim sNaam As String, sTag As String, tmp As String, sWaarde As String
Dim x As Integer, i As Integer

Private Sub Form_Current()
    CheckScrollbar
End Sub

Private Sub Form_Load()
    CheckScrollbar
End Sub

Private Sub cmdFilterLeeg_Click()
Dim sControl As String
''MsgBox TypeName(sControl)
    
    sControl = Screen.PreviousControl.Name
    Me.txtFilter1 = ""
    Me.txtFilter2 = ""
    Me.Filter = ""
    Me.FilterOn = False
    Me.Requery
    Me(sControl).SetFocus
    CheckScrollbar
''    Form_Current

End Sub

Private Sub fraOptie_AfterUpdate()
    CheckFilter
End Sub

Private Sub LeegFilter_Click()
Dim sControl As String
''MsgBox TypeName(sControl)
    sControl = Screen.PreviousControl.Name
    Me.txtFilter1 = ""
    Me.txtFilter2 = ""
    Me.Filter = ""
    Me.FilterOn = False
    Me.Requery
    Me(sControl).SetFocus
    CheckScrollbar
''    Form_Current
End Sub

Private Sub txtFilter1_Change()
    sNaam = Screen.ActiveControl.Name
    sTag = Me(sNaam).Tag
    sWaarde = Me(sNaam).Text
    CheckFilter sNaam, sWaarde
    Me(sNaam) = sWaarde
    Me(sNaam).SelStart = Me(sNaam).SelLength
End Sub

Private Sub txtFilter2_Change()
    sNaam = Screen.ActiveControl.Name
    sTag = Me(sNaam).Tag
    sWaarde = Me(sNaam).Text
    CheckFilter sNaam, sWaarde
    Me(sNaam) = sWaarde
    Me(sNaam).SelStart = Me(sNaam).SelLength
End Sub

Private Sub txtFilter3_Change()
    sNaam = Screen.ActiveControl.Name
    sTag = Me(sNaam).Tag
    sWaarde = Me(sNaam).Text
    CheckFilter sNaam, sWaarde
    Me(sNaam) = sWaarde
    Me(sNaam).SelStart = Me(sNaam).SelLength
End Sub

Private Sub txtFilter4_Change()
    sNaam = Screen.ActiveControl.Name
    sTag = Me(sNaam).Tag
    sWaarde = Me(sNaam).Text
    CheckFilter sNaam, sWaarde
    Me(sNaam) = sWaarde
    Me(sNaam).SelStart = Me(sNaam).SelLength
End Sub

Private Sub txtFilter5_Change()
    sNaam = Screen.ActiveControl.Name
    sTag = Me(sNaam).Tag
    sWaarde = Me(sNaam).Text
    CheckFilter sNaam, sWaarde
    Me(sNaam) = sWaarde
    Me(sNaam).SelStart = Me(sNaam).SelLength
End Sub

Private Sub txtFilter6_Change()
    sNaam = Screen.ActiveControl.Name
    sTag = Me(sNaam).Tag
    sWaarde = Me(sNaam).Text
    CheckFilter sNaam, sWaarde
    Me(sNaam) = sWaarde
    Me(sNaam).SelStart = Me(sNaam).SelLength
End Sub


Private Function CheckFilter(Optional Zoekveld As String, Optional Waarde As String)
Dim sFilter As String
Dim sFilters() As String, sTekst() As String
Dim ctl As Control
Dim sAndOr As String
Dim rst As Recordset
Dim iFltr As Integer

'Eerst de grootte van de matrix bepalen....
x = 0
iFltr = 0
For Each ctl In Controls
    With ctl
        If LCase(Left(.Name, 9)) = "txtFilter" Then
            .SetFocus
            iFltr = iFltr + 1
            On Error Resume Next
            If Not .Text = "" Then
                x = x + 1
                ReDim Preserve sTekst(x)
                sTekst(x) = .Text
            End If
        End If
    End With
Next ctl

'Als de tekstfilters leeg zijn, dan filter leegmaken en stoppen....
If x = 0 Then GoTo LeegFilter
'...... anders doorgaan, en matrix herdefiniëren.
ReDim sFilters(x, 3)

'Dan de variabelen vullen met gegevens
i = 0
x = 0
For Each ctl In Controls
    With ctl
        If LCase(Left(.Name, 9)) = "txtFilter" Then
            .SetFocus
''            MsgBox Asc(.Text)
            If Not sTekst((i + 1)) = "" Then
                i = i + 1
                sFilters(i, 1) = .Tag
                sFilters(i, 2) = sTekst(i)
                sFilters(i, 3) = .Name
                x = x + 1
            End If
        End If
    End With
Next ctl

' Dan op basis van de variabelen het filter opbouwen..................
' Als je niet hoeft te kunnen filteren op AND of OR,
' dan kun je de variabele sAndOr ook vullen met een standaardwaarde.
sAndOr = " AND "

' Wil je wel kunnen selecteren, dan gebruik je het frame met de selectieoptie.
' In dat geval moet de code weer actief gemaakt worden!
''Select Case Me.fraOptie.Value
''    Case 1
''        sAndOr = " AND "
''    Case 2
''        sAndOr = " OR "
''End Select

'..................................................................................................
For i = LBound(sFilters) To UBound(sFilters)
    If LBound(sFilters) = UBound(sFilters) Then
        ' -----------------------------------------------------------------------------------------
        ' Extra check op numerieke waarden; het filter wordt dan anders.
        ' -----------------------------------------------------------------------------------------
        If IsNumeric(sFilters(i, 2)) Then
            sFilter = "[" & sFilters(i, 1) & "] =" & sFilters(i, 2)
        Else
            sFilter = "[" & sFilters(i, 1) & "] Like ""*" & sFilters(i, 2) & "*"""
        End If
    Else
        ' -----------------------------------------------------------------------------------------
        ' Extra check op numerieke waarden; het filter wordt dan anders.
        ' -----------------------------------------------------------------------------------------
        If IsNumeric(sFilters(i, 2)) Then
            sFilter = sFilter & "[" & sFilters(i, 1) & "] =" & sFilters(i, 2)
        Else
            sFilter = sFilter & "[" & sFilters(i, 1) & "] Like ""*" & sFilters(i, 2) & "*"""
        End If
        If i < UBound(sFilters) Then
            sFilter = sFilter & sAndOr
        End If
    End If
Next i

'Filter vervolgens op formulier toepassen.
Me.Filter = sFilter
Me.FilterOn = True

If Not Zoekveld = "" Then
    Me(Zoekveld).SetFocus
End If

Set rst = Me.RecordsetClone
With rst
    .Bookmark = Me.Bookmark
    Me!lblNavigate.Caption = "Record " & _
        .AbsolutePosition + 1 _
        & " of " & .RecordCount
    .MoveLast
    .MovePrevious
    If .RecordCount < 26 Then
        Me.ScrollBars = 0
    Else
        Me.ScrollBars = 2
    End If
End With

Exit Function

LeegFilter:
    Me.Filter = ""
    Me.FilterOn = False
    On Error Resume Next
    Me(Zoekveld).SetFocus

End Function

Function CheckScrollbar()
    
    Set rst = Me.RecordsetClone
    If Me.NewRecord Then
        Me!lblNavigate.Caption = "New Record"
    Else
        With rst
            .Bookmark = Me.Bookmark
            Me!lblNavigate.Caption = "Record " & _
                .AbsolutePosition _
                & " of " & .RecordCount
        End With
    End If
    On Error GoTo Stoppen
    rst.MoveLast
    rst.MovePrevious
    If rst.RecordCount < 26 Then
        Me.ScrollBars = 0
    Else
        Me.ScrollBars = 2
    End If

Stoppen:

End Function
 
:)

Maak anders even een voorbeeldje van wat je nu hebt; bij mij werkt-ie primaa(logisch als je 'm zelf maakt :) ) dus het heeft niet zoveel zin als ik maar wat ga roepen. Voor zover ik het kan zien, moet het namelijk werken. Al moet je natuurlijk nooit je eigen werk controleren....
 
is het toegestaan hem op een andere site te uploaden en hier de link te plaatsen?
ik kan nog steeds niets uploaden hier :S. (meerdere bestandsformaten en het lukt niet met m'n pc en ook niet met mn laptop)
 
hmm ik zie bij de eigenschappen van mijn formulier dat mijn filter instelling leeg is en bij het voorbeeld bestandje staat hier... [Instelling] Like "* &*"
kan dit er nog iets mee te maken hebben?

VBA is leuk heb je misschien nog tips om het aan te leren?
(ik leer hier natuurlijk ook ontzettend van :-) )
 
Je mag elke databank gebruiken die je wilt. Dus doe eens een poging! Ben nog steeds benieuwd :)
 
hmm of zou de "gekoppelde" tabel Klanten er iets mee te maken kunnen hebben?
Ik wil in Dossiers gewoon de KlantID opslaan maar heb hem nu gelinked zodat de klantnaam wordt weergegeven...
(met een suf dropdownmenu'tje wat volgens mij ook anders moet kunnen)
 
Je hebt een formulier <Filteren> in je db, die het inderdaad niet doet. Maar die had ik binnen 12 seconden weer aan de praat: de velden die in de tabel zaten heb je een andere naam gegeven op de tekstvakken. Op zich mag dat wel, maar je filtert op de Tabelvelden, niet op de Formuliervelden. Dus door de <Extra Info> in de zoekvelden te koppen aan de tabelvelden, deed het filter het gelijk weer. Maar je laatste opmerking slaat vermoedelijk op een ander formulier?
 
Dat formulier Filteren is geimporteerd uit het voorbeeldbestandje dat je vorig jaar gemaakt hebt. ;-)
Door bij Extra Info Instellingen eruit te hjalen kwam ik erachter dat dit de Tag was. :-)
FRM_Dossiers is het "echte" formulier sorry voor de onduidelijkheid :(
Volgens mij heb ik bovenstaand daar wel goed gedaan.
Daar heb ik ook het probleem met de 6 filters.. :(
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan