me.filter fout 2185

Status
Niet open voor verdere reacties.

Nico84

Gebruiker
Lid geworden
21 jul 2011
Berichten
191
Goedemiddag,

Gebruik onderstaande code om een klant te zoeken.
Ik heb 1 Veld (Zoekklant) om in 2 kolommen (Naam en Plaats) te zoeken

Als ik zoek op het woord Rotterdam en ik tik in het veld Zoekklant rotti in dan komt na het intoetsen van de i de error.
Fout 2185 tijdens uitvoering.

Hoe kan ik deze error afvangen met een msgbox "Er zijn geen resultaten, Begin opnieuw"
Vervolgens het filter leegmaken en alle records weer zien.


Code:
Private Sub txtZoekklant_Change()
Dim sFilter

    sFilter = "[tblDebiteur.Debiteurnaam] & [tblDebiteur.Plaats] Like ""*" & Me.txtZoekklant.Text & "*"""

    Me.Filter = sFilter
    Me.FilterOn = True
    Me.txtZoekklant.SelStart = Me.txtZoekklant.SelLength
    

End Sub
 
Ik ken dit probleem niet, heb ‘m nooit gehad met dit soort zoekacties. Al doe ik het nooit op jouw manier, waarbij je zo twee velden tegelijk probeert te filteren. Met deze combi vind je namelijk ook de familie TaROT uit TIel, en dat kan nooit de bedoeling zijn. Plaatsnamen combineren met achternamen vind ik sowieso onzinnig, en maakt de zoekactie alleen maar minder snel. Als je dit al wil combineren, zorg er dan op zijn minst voor dat je altijd volledig in het veld zoekt, bijvoorbeeld zo:
Code:
sFilter = "[Debiteurnaam] & "|" & [Plaats] Like ""*" & Me.txtZoekklant.Text & "*"""
Door een teken tussen de twee velden te zetten, zoek je ofwel in het linker veld, ofwel in het rechter veld, maar nooit meer in de overgang.
Misschien lost dat ook gelijk je probleem op. Zelf maak ik dus altijd in de query een zoekveld met daarin de gewenste zoekvelden. En dáár zet ik dan het filter op.
 
Als ik het filter probeer krijg ik een compileerfout ongeldig teken | (pipe teken)
 
Daarom zei ik ook dat ik het in een query zo doe :).
 
OctaFish kan je me verder helpen. Snap niet wat ik moet doen.
Voorbeeld van de db heb ik toegevoegd.
 

Bijlagen

Ik heb er gisteren naar gekeken, en goed nieuws en slecht nieuws. Het goede nieuws: ik kan het reproduceren, ook als ik 'mijn oplossing' gebruik, dus het zoekveld in de query zet. Het slechte nieuws kan je dan denk ik zelf wel bedenken :). Wordt vervolgd dus. Ik zit aan een check te denken die het aantal gevonden records denkt, en op basis daarvan de zoektekst terugbrengt naar het laatste teken dat wél resultaat oplevert.
 
Gebruik 's deze code
Code:
Private Sub txtZoekklant_Change()
On Error GoTo Err_txtZoekklant_Change
'Uitvoerende VBA code
Dim sFilter

    sFilter = "[tblDebiteur.Debiteurnaam] & [tblDebiteur.Plaats] Like ""*" & Me.txtZoekklant.Text & "*"""
    
    Me.Filter = sFilter
    Me.FilterOn = True
    Me.txtZoekklant.SelStart = Me.txtZoekklant.SelLength
Exit_txtZoekklant_Change:
     Exit Sub
Err_txtZoekklant_Change:
     Select Case Err.Number
            Case 20 'Resume zonder Error
                    Resume Next
            Case 94 'Ongeldig gebruik van Null
                    MsgBox "Er zijn geen resultaten, Begin opnieuw", vbCritical + vbOKOnly, "Opgelet!"
                    Me.FilterOn = False
                    Me.Requery
                    Resume Next
            Case 3021 ' Geen huidige record
                    Resume Next
            Case 3077  'Geen criteria
                    MsgBox "Er zijn geen resultaten, Begin opnieuw", vbCritical + vbOKOnly, "Opgelet!"
                    Me.FilterOn = False
                    Me.Requery
                    Resume Next
            Case 3167  'Record is al verwijderd
                    Resume Next
            Case 9999
                    Resume Next
            Case 999
                    Resume Exit_txtZoekklant_Change
            Case Else
                    MsgBox "Er zijn geen resultaten, Begin opnieuw", vbCritical + vbOKOnly, "Opgelet!"
                    Me.FilterOn = False
                    Me.Requery
                    Resume Exit_txtZoekklant_Change
     End Select
End Sub
 
En een oplossing met een recordset, zoals beloofd. Let wel: ik heb er een extra veld voor gemaakt in de onderliggende query, met de volgende formule: Zoekveld: [Debiteurnaam] & "|" & [Plaats]

Code:
Private Sub txtZoekklant_Change()
Dim sFilter As String, sZoekTekst As String
Dim rs As DAO.Recordset

    sZoekTekst = Me.txtZoekklant.Text
    If Len(Me.txtZoekklant.Text) > 0 Then
        sFilter = "[Zoekveld] Like ""*" & sZoekTekst & "*"""
        Set rs = Me.RecordsetClone
        With rs
            .FindFirst sFilter
            If .NoMatch = True Then
                MsgBox "Er zijn geen resultaten, Begin opnieuw", vbCritical + vbOKOnly, "Opgelet!"
                With Me.txtZoekklant
                    .SetFocus
                    .Text = Left(sZoekTekst, Len(sZoekTekst) - 1)
                    Me.Filter = ""
                    Me.FilterOn = False
                End With
            Else
                Me.Filter = sFilter
                Me.FilterOn = True
                With Me.txtZoekklant
                    .SetFocus
                    .SelStart = Me.txtZoekklant.SelLength
                End With
            End If
        End With
    End If
End Sub
 
Johan en OctaFish bedankt alvast. Zal beide oplossingen proberen morgen .
Was zelf ook al aardig in de goede richting .
 
Beide oplossingen geprobeerd en allebei werken ze prima.
Zelf had ik onderstaande code bedacht en werkt ook.
Dus wordt kiezen nu :p

Octafish: snap nu wat je bedoelde met het zoekveld in de query.

Code:
Private Sub txtZoekklant_Change()
Dim sFilter

On Error GoTo Fout

    sFilter = "[tblDebiteur.Debiteurnaam] & [tblDebiteur.Plaats] Like ""*" & Me.txtZoekklant.Text & "*"""
    Me.Filter = sFilter
    Me.FilterOn = True
    Me.txtZoekklant.SetFocus
    Me.txtZoekklant.SelStart = Len(Me.txtZoekklant.Text)
    
Fout:
    If Err.Number = 2185 Then
        MsgBox "Geen records gevonden"
        Me.FilterOn = False
        Me.txtZoekklant.SetFocus
        Me.txtZoekklant = ""
    End If

End Sub

Bedankt!!
 
Voordeel van mijn oplossing (met dus het zoekveld) is dat je nooit op onzinnige combinaties kan zoeken van laatste letters van veld A en eerste letters van veld B. Dus dat zou ik in ieder geval implementeren. Zelf prefereer ik oplossingen die zonder foutafvanging werken; die zijn toch wat stabieler in mijn ogen. Die foutcontrole zit er niet voor niks :).
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan