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 ?
- Messages
- 9'246
- Excel
- Vista Office 2007FR
- Inscrit
- 08/12/2007
- Emploi
- retraité Sce.Méthodes
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.
- Messages
- 9'246
- Excel
- Vista Office 2007FR
- Inscrit
- 08/12/2007
- Emploi
- retraité Sce.Méthodes
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
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.
- Messages
- 9'246
- Excel
- Vista Office 2007FR
- Inscrit
- 08/12/2007
- Emploi
- retraité Sce.Méthodes
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 ?
- Messages
- 9'246
- Excel
- Vista Office 2007FR
- Inscrit
- 08/12/2007
- Emploi
- retraité Sce.Méthodes
re,
exemple: lis l'aide (bouton)
édit: ton fichier remanié
Lire le commentaire explicatif en A1
claude
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 !
- Messages
- 9'246
- Excel
- Vista Office 2007FR
- Inscrit
- 08/12/2007
- Emploi
- retraité Sce.Méthodes
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à !
- -------------------------------------------------
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
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
- 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.
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]