Filtre de tableau par UserForm CheckBox

AntoineM

XLDnaute Junior
Bonjour,

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.

Merci à tous ceux qui me liront
 

Pièces jointes

  • EssaiUserFormTri.xlsm
    21.2 KB · Affichages: 68

AntoineM

XLDnaute Junior
Re : Filtre de tableau par UserForm CheckBox

J'ai reçu un mail me disant que tu avais répondu mais je ne vois pas de message :confused:

Une erreur ? Ou l'édition d'un de mes messages a annulé le tiens ?

EDIT : Penser à vérifier la page 2 avant de poster :eek:
 
Dernière édition:

AntoineM

XLDnaute Junior
Re : Filtre de tableau par UserForm CheckBox

Bien sur,

Merci de ton aide encore !
Etant donné la grande aide que tu m'as déjà apporté n'hésite pas a me dire si je tire trop sur la corde :)

En tout cas mon fichier est en pièce jointe

Bien à toi,

Antoine
 

Pièces jointes

  • Classeur1.xlsm
    36.8 KB · Affichages: 53
  • Classeur1.xlsm
    36.8 KB · Affichages: 59
  • Classeur1.xlsm
    36.8 KB · Affichages: 62

Papou-net

XLDnaute Barbatruc
Re : Filtre de tableau par UserForm CheckBox

RE:

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.
 

Pièces jointes

  • EssaiUserFormTri-4.xlsm
    39.4 KB · Affichages: 54
Dernière édition:

AntoineM

XLDnaute Junior
Re : Filtre de tableau par UserForm CheckBox

Bonjour Papou,

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 ?

Merci encore pour ce que tu as fais pour moi,

Bien à toi,

Antoine
 
Dernière édition:

Papou-net

XLDnaute Barbatruc
Re : Filtre de tableau par UserForm CheckBox

Bonjour Antoine,

Voici les réponses à tes questions:

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:

Opt(1)=TOTO1
Opt(2)=TOTO3
Opt(3)=TOTO4
Opt(4)=""
Opt(5)=""

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 pense donc y avoir répondu ci-dessus.

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.

Restant à ta disposition.

Bien cordialement.
 

AntoineM

XLDnaute Junior
Re : Filtre de tableau par UserForm CheckBox

Bonjour Papou,

Merci pour ces explications, elles m'ont aidé à comprendre ton travail et je pense avoir compris toutes les choses que tu m'as proposé grâce à toi.

Je n'ai pas d'autre question, même si je repasserai sur ce forum (j'éspère qu'un jour ce sera dans le but d'aider quelqu'un).

C'est plutôt à moi de te remercier, tu m'as consacré beaucoup de temps, et je t'en suis reconnaissant.

Merci encore,

Bonne journée à toi.

Antoine
 

Si...

XLDnaute Barbatruc
Re : Filtre de tableau par UserForm CheckBox

salut

avec tous les problèmes de ces derniers temps avec les boutons on peut s'en dispenser et même alléger la programmation comme dans l'exemple joint.

Si... le nombre de critères augmente sensiblement, l'adapation sera trés simple.
 

Pièces jointes

  • Autre Filtre.xlsm
    23.1 KB · Affichages: 37

AntoineM

XLDnaute Junior
Re : Filtre de tableau par UserForm CheckBox

Bonjour Si...

Alors je ne comprends pas du tout ce que tu as proposé (malgré le fait que tu ais fais l'effort de mettre des commentaires).

Pour le coup avec les solutions de papou je comprennais une partie, mais la je ne comprend rien :eek:

Peux-tu s'il te plait me faire un pas à pas pour que je comprenne ? (même si effectivement, la macro fonctionne super bien).

Merci,

Bien à toi,

Antoine
 

Si...

XLDnaute Barbatruc
Re : Filtre de tableau par UserForm CheckBox

re

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 :D).
 

AntoineM

XLDnaute Junior
Re : Filtre de tableau par UserForm CheckBox

[Re-bonjour,

Professeurs de longue date.
Je suis retombé sur ce sujet, je n'avais pas vu/été attentif au dernier message.

Je me permet de le réouvrir, sur ce bout de code :

If Application.CountIf([E2:I2], "þ") = 0 Then [T].AutoFilter Else [T].AutoFilter 2, Tb, 7

A quoi correspond le [T].Autofilter 2, Tb, 7

Bien à vous,

Antoine
 

Discussions similaires

Statistiques des forums

Discussions
312 492
Messages
2 088 899
Membres
103 982
dernier inscrit
krakencolas