none
Filtrer un formulaire sur plusieurs champs en VBA RRS feed

  • 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éAnalytique

    J'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


    mercredi 22 mai 2019 11:23

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

    mercredi 22 mai 2019 14:56
  • 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 requery

    Merci pour votre aide
    Pierre

    Private 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

    mercredi 22 mai 2019 18:06