Auteur de questions
Filtrer un formulaire sur plusieurs champs en VBA

Question
-
Bonjour à tous
J'ai un formulaire que je souhaite filtrer sur quatre valeurs issues de quatre listes déroulantes nommées Sélect
SélectCaisse
SélectAnnéeMois
SélectTiers
et SélectCléAnalytiqueJ'ai créé le code ci après et tout marche bien
Private Function MonFiltrage() If IsNull(Me.SélectCaisse) Then SCaisse = "Cm_Clé_Caisse like '*'" Else SCaisse = "Cm_Clé_Caisse = " & Me.SélectCaisse End If If IsNull(Me.SélectAnnéeMois) Then SAnnéeMois = "AnnéeMois like '*'" Else SAnnéeMois = "AnnéeMois = " & Me.SélectAnnéeMois End If If IsNull(Me.SélectTiers) Then STiers = "Cm_Tiers like '*'" Else STiers = "Cm_Tiers like '" & Me.SélectTiers & "'" End If If IsNull(Me.SélectCléAnalytique) Then SAna = "Cm_Clé_Analytique like '*'" Else SAna = "Cm_Clé_Analytique = " & Me.SélectCléAnalytique End If Me.Filter = SCaisse & " And " & SAnnéeMois & " And " & STiers & " And " & SAna Me.FilterOn = True Me.Requery End Function
Tout marche bien, sauf que les champs Cm_Tiers et Cm_Clé_Analytique ne sont pas tous remplis
et mon filtre pour les sélections vides, ne sélectionne que les enregistrements avec une valeur à cause de like '*'"je souhaiterais trouver le moyens d'afficher tous les enregistrements même ceux dont l'enregistrement est vide pour les Sélect vides,
j'ai essayéSCaisse = "Cm_Clé_Caisse like '*'" or "Cm_Clé_Caisse= " & null
La syntaxe n'est pas bonne, c'est évident, mais je ne sais pas l'écrire !
Merci par avance pour votre aide
Pierre Foucaud
- Modifié possible924 mercredi 22 mai 2019 11:26
Toutes les réponses
-
Premièrement, les 'Like ...' sont à éviter.
Deuxièement, si aucune sélection n'est fait, il n'y a pas de raison d'appliquer un filtre pour ce critère puisqu'il n'y en existe aucun.
Troisièmement, la ligne
"Cm_Tiers like '" & Me.SélectTiers & "'"
ne semble pas bien conçu et devrait plutot être
"Cm_Tiers = '" & Me.SélectTiers & "'"
ou
"Cm_Tiers like '*" & Me.SélectTiers & "'"
ou
"Cm_Tiers like '" & Me.SélectTiers & "*'"
ou
"Cm_Tiers like '*" & Me.SélectTiers & "*'"
tout dépendant de ce que tu fais.
Dernièrement, il ne devrait pas avoir de raison d'utiliser la ligne
Me.Requery
Personnellement, je ferrais probablement quelque chose plus du genre
Private Function MonFiltrage() Dim sFilter As String If IsNull(Me.SélectCaisse) = False Then sFilter = AppendString(sFilter, "(Cm_Clé_Caisse = " & Me.SélectCaisse & ")", " AND ") End If If IsNull(Me.SélectAnnéeMois) = False Then sFilter = AppendString(sFilter, "(AnnéeMois = " & Me.SélectAnnéeMois & ")", " AND ") End If If IsNull(Me.SélectTiers) = False Then sFilter = AppendString(sFilter, "(Cm_Tiers = '" & Me.SélectTiers & "')", " AND ") End If If IsNull(Me.SélectCléAnalytique) = False Then sFilter = AppendString(sFilter, "(Cm_Clé_Analytique = " & Me.SélectCléAnalytique & ")", " AND ") End If Me.Filter = sFilter If Len(sFilter) = 0 Then Me.FilterOn = False Else Me.FilterOn = True End If End Function Function AppendString(ByVal sString As String, ByVal sAppendValue As String, ByVal sConcatenator As String) As String If Len(Trim(sString & vbNullString)) = 0 Then AppendString = sAppendValue Else AppendString = sString & sConcatenator & sAppendValue End If End Function
Daniel Pineault, 2010-2018 Microsoft MVP
Professional Support: http://www.cardaconsultants.com
MS Access Tips and Code Samples: http://www.devhut.net -
Merci pour la réponse détaillée.
J'ai résolu le problème de cette façon et ça marche bien.
j'ai supprimé le requeryMerci pour votre aide
PierrePrivate Function MonFiltrage() Me.RechercheLibell? = Null Me.RechercheMontant = Null If IsNull(Me.S?lectCaisse) Then SCaisse = "Cm_Cl?_Caisse like '*'" Else SCaisse = "Cm_Cl?_Caisse = " & Me.S?lectCaisse End If If IsNull(Me.S?lectAnn?eMois) Then SAnn?eMois = "Ann?eMois like '*'" Else SAnn?eMois = "Ann?eMois = " & Me.S?lectAnn?eMois End If If IsNull(Me.S?lectTiers) Then STiers = "Nz(Cm_Tiers,'*') like '*' " 'STiers = "Cm_Tiers like '*'" Else STiers = "Cm_Tiers like '" & Me.S?lectTiers & "'" End If If IsNull(Me.S?lectCl?Analytique) Then SAna = "Nz(Cm_Cl?_Analytique,'*') like '*' " 'SAna = "Cm_Cl?_Analytique like '*'" Else SAna = "Cm_Cl?_Analytique = " & Me.S?lectCl?Analytique End If Me.Filter = SCaisse & " And " & SAnn?eMois & " And " & STiers & " And " & SAna Me.FilterOn = True 'Me.Requery End Function
Pierre Foucaud