2017-03-08 3 views
0

J'essaie de créer un filtre qui utilise 3 zones de texte (tbLastNameFilter, tbFirstNameFilter et tbCompanyFilter.) J'ai réussi à le faire fonctionner avec un, mais je ne suis pas sûr de savoir comment je le ferais. aller à obtenir pour travailler à l'unisson avec les deux autres. J'ai essayé deux façons.VBA Filter Contious Form - Multiples boîtes de texte

Private Sub bttnSearch_Click() 
Dim strFilter As String 

If IsNull(Me.tbLastNameFilter & Me.tbFirstNameFilter & Me.tbCompanyFilter) Then 
MsgBox ("No Search Information Entered") 
Me.FilterOn = False 
Else 
strFilter = "LastName Like '*" & Replace(Me.tbLastNameFilter, "'", "''") & "*'" 
Me.Filter = strFilter 
Me.FilterOn = True 
End If 

J'ai essayé de changer le strFilter à

strFilter = "LastName Like '*" & Replace(Me.tbLastNameFilter, "'", "''") & "*'" & _ 
"FirstName Like '*" & Replace(Me.tbFirstNameFilter, "'", "''") & "*'" & _ 
"Company Like '*" & Replace(Me.tbCompanyFilter, "'", "''") & "*'" 

Si je laisse une des cases vides Je reçois une utilisation invalide de null et si je mets une lettre dans chaque I ge t Erreur de syntaxe (opérateur manquant). Je voudrais être en mesure d'entrer n'importe quoi dans une ou toutes les boîtes, cliquez sur Rechercher et voir les critères correspondants.

+0

vous avez besoin du mot ET aussi je crois. –

+0

@Nathan_Sav ET au lieu de & ou & ET &? –

Répondre

1

Il vous manque le AND dans la requête. Mais vous devez également vérifier si la zone de texte est vide avant de l'ajouter au filtre. Je suggère de le faire avec deux sous-marins. Le premier addToFilter manipule le contrôle et l'ajoute au filtre s'il n'est pas vide, et il ajoute le AND seulement si nécessaire. Cette approche simplifie le code car il factorise certaines des manipulations de chaînes courantes.

Sub addToFilter(ByRef sFilter As String, ctrl As Object, fieldName As String) 
    If IsNull(ctrl.Value) Then Exit Sub 
    If Len(Trim(ctrl.Value)) = 0 Then Exit Sub 
    If Len(sFilter) <> 0 Then sFilter = sFilter & " AND " 
    sFilter = sFilter & fieldName & " Like '*" & Replace(Trim(ctrl.Value), "'", "''") & "*'" 
End Sub 

Private Sub bttnSearch_Click() 
    Dim strFilter As String 
    addToFilter strFilter, Me.tbLastNameFilter, "LastName" 
    addToFilter strFilter, Me.tbFirstNameFilter, "FirstName" 
    addToFilter strFilter, Me.tbCompanyFilter, "Company" 

    If Len(strFilter) = 0 Then 
     MsgBox ("No Search Information Entered") 
     Me.FilterOn = False 
    Else 
     Me.filter = strFilter 
     Me.FilterOn = True 
    End If 
End Sub 
+0

Cela fonctionne très bien, cependant, si je laisse l'une des cases vides, je reçois toujours l'utilisation invalide de Null. Y at-il un moyen que je peux seulement appeler certains addToFilter basé sur si la boîte est vide ou non –

+0

@ MatthewKelsay s'il vous plaît essayer cette édition. Je passe maintenant l'objet texbox à la routine et vérifie là s'il est nul ... Le problème est que dans l'accès vba une texbox vide ne donne pas une chaîne vide mais une variante nulle. Maintenant, la routine traite correctement avec cela ... –

+0

qui fonctionne magnifiquement! Merci pour cela et les informations sur la zone de texte aussi, n'était pas au courant de cela. –