Je suis entrain de construire un tableau Excel assez important en terme de ligne.
J'ai crée un UserForm avec des cases à cocher.
On va dire que j'ai Plusieurs colonne dont une qui répertorie mes Types de Produits : "TOTO1", "TOTO2" et "TOTO3".
J'aimerais que mon tableau soit filtrer sur cette colonne en fonction des cases que j'ai cochées dans mon UserForm.
J'ai trouvé un sujet pas très éloigné du miens dans le forum, j'ai éssayé d'adapter mais sans succès.
Ci-joint mon fichier
Petite difficultée supplémentaire : Si je coche TOTO1 ET TOTO2 j'aimerais que les deux catégories apparaissent.
J'ai revu entièrement la "philosophie" du problème afin de contourner les arcanes de la programmation des ContrôleX.
Quelques précisions:
- Le clic sur une des cases à cocher inscrit son Caption dans la plage de cellules E1:I1, si la case est cochée. Si non, la cellule est effacée. La cellule A1 compte le nombre de cellules remplies et renseignera ainsi la variable n.
- J'ai conservé la couleur par défaut du contenu de A1, mais il serait préférable de la masquer en lui donnant la même couleur que le fond.
- La condition Select Case n ... End Select se trouve de fait très simplifiée puisqu'elle s'adapte au nombre de cases cochées.
Enfin, si tu dois ajouter ou supprimer des cases par la suite, il ne faudra pas oublier d'adapter les cellules liées sur Feuil1.
En te souhaitant un bon WE.
Cordialement.
PS: tu ne tires pas sur la corde, le but n'est-il pas de mener à bout toute discussion entamée (du moins, dans la mesure du possible)? D'autant que tu fais toi-même l'effort de chercher à comprendre et ne te contentes pas d'une solution clé en main.
Alors effectivement on change pas mal de ce sur quoi on était partis (en philosophie de macro).
Suite à ton premier post (j'attendais la fin du weekend pour te solliciter à nouveau), j'allais te demander si on pouvait choisir un affichage dynamique (je n'avais pas encore vu le dernier post). En plus de répondre à la moindre de mes questions, tu m'anticipe ("Si je m'efforce de penser tout mes dires, dois-je pour autant dire tout ce que je pense. Et puis-je lire vos pensées sans que vous les disiez?").
Comme tu dois t'en douter, je ne comprend encore une fois pas tout, je comprend le fonctionnement général, tu nomme les cellules derrière les CheckBox en fonction de l'argument "True" de celles-ci, puis tu réccupère ça dans la formule NB.SI en [A1].
Tu utilises ensuite le résultat de cette somme pour définir les arguments de Tri.
VB:
If .Range("A1") = 0 Or .Range("A1") > 4 Then
.Range("A4:C10000").AutoFilter
Ici tu demande à Excel de ne pas filtrer si tout est coché ou décoché.
Les points qui me donnent du mal :
VB:
For Each cel In .Rows(1).SpecialCells(xlCellTypeConstants)
n = n + 1
Opt(n) = cel.Value
Ici je pense que tu définis le Opt en fonction de chaque cellules de la première ligne de la feuille. Ce que je ne m'explique pas c'est pourquoi n = n + 1. Je pense que c'est pour faire une sorte de boucle mais je ne comprend pas exactement ce que signifie cette ligne.
VB:
Select Case n
Case 1
.Range("A4:C10000").AutoFilter Field:=2, Criteria1:=Opt(1)
Case 2
.Range("A4:C10000").AutoFilter Field:=2, Criteria1:=Array(Opt(1), Opt(2)), Operator:=xlFilterValues
Case 3
.Range("A4:C10000").AutoFilter Field:=2, Criteria1:=Array(Opt(1), Opt(2), Opt(3)), Operator:=xlFilterValues
Case 4
.Range("A4:C10000").AutoFilter Field:=2, Criteria1:=Array(Opt(1), Opt(2), Opt(3), Opt(4)), Operator:=xlFilterValues
End Select
Alors la, encore une fois, je comprend en gros le code mais plusieurs subtilités m'échappent. Je vois que tu définis les arguments du filtres en fonction du nombre contenu en A1.
Si une case coché alors 1 argument, si 2 alors 2 arguments...
Ce que je ne comprend pas c'est que [A1] = 1 si une case est cochée, mais cela peut être TOTO1, TOTO2...
Donc ma question : à quel moment tu demandes à Excel de choisir le bon argument de Tri, et non pas l'argument TOTO1 ?
Ici je pense que tu définis le Opt en fonction de chaque cellules de la première ligne de la feuille. Ce que je ne m'explique pas c'est pourquoi n = n + 1. Je pense que c'est pour faire une sorte de boucle mais je ne comprend pas exactement ce que signifie cette ligne.
C'est effectivement une boucle qui sert à remplir le tableau variable Opt(). Si j'incrémente n en début de boucle, c'est parce que sa valeur est nulle suite à sa déclaration Dim n As Byte. Par ailleurs, la boucle lit toutes les cellules de la ligne 1 qui contiennent une valeur (A1 qui contient une formule n'est pas concernée). Donc, si 3 cases sont cochées, le tableau contiendra dans l'ordre les 3 références de tri.
Exemple:
Si les cases cochées sont TOTO1, TOTO3 et TOTO4, alors le tableau Opt contiendra:
On se fout donc de repérer la position respective des options choisies.
Je vois que tu définis les arguments du filtres en fonction du nombre contenu en A1.
Si une case coché alors 1 argument, si 2 alors 2 arguments...
Ce que je ne comprend pas c'est que [A1] = 1 si une case est cochée, mais cela peut être TOTO1, TOTO2...
Donc ma question : à quel moment tu demandes à Excel de choisir le bon argument de Tri, et non pas l'argument TOTO1 ?
Je te remercie pour tes compliments, j'y suis sensible même si je n'ai fait que me conformer à la philosophie de ce forum qui est de venir en aide de façon désintéressée.
C'est une macro évènementielle écrite obligatoirement dans la page de code de la feuille concernée.
Elle est lancée automatiquement lors d'une sélection.
Ici, seules les cellules de la page E2:I2 amèneront une action de Filtre.
Il faut aussi rejeter le cas d'une sélection multiple (plus d'une cellule) avec l'instruction If R.CountLarge > 1 Then Exit.
Dans cette plage les cellules contiennent au départ ¨ le caractère spécial qui, avec la police Wingdings, ressemble à une case vide.
Lors de la sélection de l'une d'elles le caractère change. Celui qui donne une case cochée est þ et il a effet bascule avec l'instruction R = IIf(R = "þ", "¨", "þ")
La ligne Dim Tb(4), n As Byte permet de déclarer un tableau de dimension 4, celui qui contiendra le nom situé au dessus d'une cellule "cochée"
La boucle For n = 0 To 4
If Cells(2, 5 + n) = "þ" Then Tb(n) = Cells(1, 5 + n)
Next
fait ce travail. Elle commence par 0 car au départ et par défaut, les éléments du tableau commencent à 0.
Maintenant, avec If Application.CountIf([E2:I2], "þ") = 0 Then [T].AutoFilter Else [T].AutoFilter 2, Tb, 7
on compte le nombre de cellules qui semblent cochées. Si aucune cellule ne contient þ alors on filtre le tableau de la feuille (celui nommé T)avec tous le critères (donc on a tout) sinon on filtre à partir de la colonne 2 avec les critères relevés dans le tableau Tb.
L'intérêt de cette méthode est, comme je l'ai déjà dit, de ne pas utiliser de boutons et d'avoir des instructions classiques donc simples (quand on les connait ).