Filtre avancé : Comment inhiber un critère ?

Bonjour,

est-il possible d'inhiber un critère de filtre pour un filtre avancé,

si oui, quel est le caractère ??

En faite, je sais que si on laisse la case où le critère doit être rentré vide, cela inhibe donc ce critère.

Mais mon problème c'est que mes cases de critères sont générés automatiquement et contiennent donc des formules.

Par exemple :

si A1=1, alors je veux filtrer en utilisant le critère X.

Par contre, si A1=0, je ne souhaite pas utiliser le critère X.

Dans ma case de critère je rentre donc : =SI($A$1=1;"X";"")

Cependant, quand A1=0, cela me filtre quand même les cellules vides, ce que je ne veux pas.

J'ai aussi essayé avec "*", mais c'est la même chose...

Quelqu'un a t'il la solution ?

Bonjour à tous,

Peux-tu nous faire voir ta BDD

quelques lignes suffit

Amicalement

Claude

Bonjour dubois,

voici le fichier en pièce jointe au message :

Critères de filtre à entrer en ligne 9

La ligne 8 est celle utilisée ensuite pour effectuer le filtre.

Merci pour l'aide.

re,

En fait je crois comprendre que c'est en cliquant le bouton "Regénérer Critères"

que tu as problème (les lignes vides sont filtrées)

c'est parce que avec ta formule "", le critère n'est pas vide mais contient une apostrophe.

une solution est d'effacer le filtre avec :

Sub AffiherTout()
    Application.ScreenUpdating = False
    Application.EnableEvents = False
    On Error Resume Next
        ActiveSheet.ShowAllData
    On Error GoTo 0
        Range("a9:g9").ClearContents
            Application.Goto [a11], Scroll:=True
    Application.EnableEvents = True
End Sub

voir bouton "Afficher tout"

Amicalement

Claude

29piratman.xlsm (74.22 Ko)

Re,

les lignes vides sont effectivement filtrées, quand une valeur de A9:G9 est modifiée.

Le problème, c'est que je ne veux pas annuler le filtre, mais je veux filtrer que sur les critères renseignés :

Car même avec ce bouton annulant le filtre, ça ne pallie pas au problème :

Par exemple si je filtre avec comme Pays : "Corée Du Sud", j'ai 0 résultat, hors le film "Fighter in the wind" est dans ma base inscrit avec comme pays "Corée Du Sud. Il n'apparait pas car aucun acteur n'est renseigné pour ce film,

et du coup il est filtré par la case E7 : =SI($E$9<>"";CONCATENER("*";$E$9);"")

Comment modifier cette formule en ligne 7 pour que si le critère associé n'est pas rempli en ligne 8, on ne filtre pas les vides ???

Je sais que c'est ce "" qui n'est pas considérer comme rien, mais je ne sais pas quoi mettre à la place pour que ça marche.

re,

Je sais que c'est ce "" qui n'est pas considérer comme rien, mais je ne sais pas quoi mettre à la place pour que ça marche.

Le mieux est de ne rien mettre !

pour filtrer, il te suffit d'entrer la 1ère lettre (ou + pour affiner) directement en ligne 8,

tu mets éventuellement des listes Validation sur cette ligne et tu vire la ligne 9 qui ne sert plus à rien.

Re,

non ça ne marcherait pas, car si je ne concatene pas les critères avec "*", ils seront filtrés quand même si le critère ne se trouve pas au début.

Peut être faut il que je filtre en disant "comprend" le terme, mais comment faire ?

re,

exemple: lis l'aide (bouton)

21film4.zip (49.25 Ko)

édit: ton fichier remanié

Lire le commentaire explicatif en A1

claude

15piratman-2.xlsm (62.61 Ko)

bonjour dubois,

merci bien de t'occuper de "ma cause", c'est vraiment sympa de prendre du temps pour m'aider !

Le fichier "piratman_2" est super, cependant 2 petites choses :

  • Lignes 294 à 376 toujours masquées, même s'il n'y a aucun filtre, même si je clique sur "Afficher tout"
  • Si un filtre est en cours, et qu'on appuie sur "Afficher tout", le nombre de films affiché devient systématiquement "284/367", alors que si on supprime manuellement les filtres, on a bien 367/367

PS : Le code est très bien organisé, et un débutant comme moi s'y retrouve, bravo !

re,

Petite explication:

Au départ je n'avais pas ces 4 lignes de code dans macro "Initialise"

    Range("b8:h8").ClearContents
        On Error Resume Next
            ActiveSheet.ShowAllData
        On Error GoTo 0

si bien qu'on initialisait la Base avec les lignes du dernier filtre

tu remarquera le: "ActiveSheet.ShowAllData", qui efface le filtre (mais ne démasque pas les lignes)

  • En rajoutant ces 4 lignes, je n'ai pas vérifié et voilà !
  • -------------------------------------------------
Sur cette version, j'en ai profité pour nommer la colonne Titre, afin de sécuriser la formule NBVAL

Si tu n'y vois pas d'inconvénient, je vais conservé ce fichier comme exemple en remplacement de

"film4" qui commençait à dater.

Version zip en 2003

Amicalement

Claude

31piratman-3.xlsm (62.76 Ko)
12piratman-3-xlsm.zip (50.36 Ko)

Bonjour,

merci pour la correction,

je ne vois aucun inconvénient à ce que tu conserves ce fichier comme exemple.

Etant perfectionniste et obstiné (ben oui, on a tous des défauts ), j'ai ajouté quelques modifications :

- Rajout du "tri de la base de données" par titre de films quand on lance la Macro "Initialise".

Car sinon les nouvelles entrées dans la base se trouve à la fin, ça faisait un peu "désordre".

- La cellule sélectionnée remonte comme critère de tri pour toute la base : que ce soit un Titre, Genre, Pays, Année, Acteurs, Réalisateur, Durée.

- Insertion d'une ligne (vide) entre "les critères pour filtrage" et "la base" (Ligne 9)

But : ne pas exécuter la macro "Remonter dans critère" quand on tape "Entrer" après avoir rentré un critère de filtre en ligne 8, car du coup on sélectionnait la 1° entrée de la base, et ça remplaçait le filtre qui vient d'être rentré.

Donc ça, c'était pour mon coté "perfectionniste", voici mon coté "obstiné" :

J'aimerai utiliser une liste déroulante de tous les acteurs en case F8, comme c'était le cas dans mon fichier initial.

j'ai donc ce code en main :

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
Dim Cel As Range
Dim MesActeurs As Object
Dim Tmp
Dim I As Integer
If Target.Address <> "$A$2" Or Target.Count > 1 Then Exit Sub ' si la cellule sélectionnée n'est pas A2
                                                              ' ou que tu as sélectionné plusieurs cellules
                                                              ' on quitte
Range("B8:H8").Select                                   ' Sélectionnez la plage de critères de filtrage
Selection.ClearContents                                 ' et effacer tous les critères

Set MesActeurs = CreateObject("Scripting.Dictionary")   ' création d'un objet "Dictionnary" qui nous permettra
                                                        ' d'y intégrer tous les noms d'acteurs sans doublons

For Each Cel In Range("F11:E" & [F65000].End(xlUp).Row)  ' pour chaque cellule de E11 à Bxx (dernière ligne remplie)
    Tmp = Split(Cel.Value, ",")                         ' dans le tableau à une dimension, on "splitte" la valeur
                                                        ' de la cellule, chaque nom séparé par une virgule se trouvant
                                                        ' dans le tableau (tmp(o), pour le 1er nom, tmp(1) pour le 2ème...
    For I = LBound(Tmp) To UBound(Tmp)                  ' de la 1ère valeur du tableau tmp à la dernière
        If Not MesActeurs.Exists(Trim(Tmp(I))) Then MesActeurs.Add Trim(Tmp(I)), Trim(Tmp(I))
                                                        ' c'est ici qu'on utilise l'object dictionnary
                                                        ' si le nom n'y existe pas, on le rajoute dans l'objet
                                                        ' Trim permettant de supprimer les espaces en début
                                                        ' et fin du nom
    Next I                                              ' au suivant
Next Cel                                                ' cellule suivante
Tmp = MesActeurs.Items                                  ' on rentre toutes les valeurs de l'objet dictionnary dans
                                                        ' un tableau à une dimension
Call tri(Tmp, LBound(Tmp), UBound(Tmp))                 ' on effectue le tri de ce tableau (voir dans Module1)
Columns(9).ClearContents                                ' on vide la liste des acteurs qu'il y avait dans la colonne I
Application.EnableEvents = False                        ' on interdit tout déclenchement d'évènement afin d'éviter des boucles
For I = LBound(Tmp) To UBound(Tmp)                      ' de la première valeur du tableau à la dernière
    Cells(I + 1, 9) = Tmp(I)                            ' on remplit la colonne I des noms des acteurs, qui sont dans le tableau Tmp
Next I
    Range("$F$8").Select
    With Selection.Validation                           ' avec la validation des données de la cellule F8
    .Delete                                             ' on supprime l'ancienne "Données/Validation"
    .Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop, Operator:= _
        xlBetween, Formula1:="=$I$1:$I$" & [I65000].End(xlUp).Row ' on en créé une nouvelle, avec les noms de la colonne F
End With
Application.EnableEvents = True                         ' on ré-autorise les déclenchements d'évènements
End Sub
Sub tri(a, gauc, droi) ' Quick sort
'code de tri de JBoisgontier (http://boisgontierj.free.fr/)
'code hyper rapide
  ref = a((gauc + droi) \ 2)
  g = gauc: d = droi
  Do
    Do While a(g) < ref: g = g + 1: Loop
    Do While ref < a(d): d = d - 1: Loop
    If g <= d Then
      Temp = a(g): a(g) = a(d): a(d) = Temp
      g = g + 1: d = d - 1
    End If
  Loop While g <= d
  If g < droi Then Call tri(a, g, droi)
  If gauc < d Then Call tri(a, gauc, d)
End Sub

Mais je n'arrive pas à le mettre en place, car mes compétences sont trop limités.

Le simple fait de devoir renommer "Private Sub Worksheet_SelectionChange" car il existe déja est bloquant pour moi, car si je change de nom, la Private sub ne s'execute même plus...

Pourrais-tu m'aider ?

PS : dans le code que j'ai mis ici, la liste des acteurs est (censé) être créé en colonne I, mais il parait bien plus propre qu'elle le soit dans le 2° onglet ou sont déja les autres listes.

28piratman-4.xlsm (63.96 Ko)

Hello,

je n'avais pas eu de réponse, mais j'ai de mon coté continuer à chercher,

et je suis finalement arrivé à mes fins.

La méthode : Lire des cours de base sur le VBA, apprendre les bases !

Merci pour l'aide en tout cas.

[Sujet Clos]

Rechercher des sujets similaires à "filtre avance comment inhiber critere"