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

Papou-net

XLDnaute Barbatruc
Re : Filtre de tableau par UserForm CheckBox

Bonjour AntoineM,

Modifie ton code comme ceci:

Code:
Private Sub CommandButton1_Click()
With Sheets("Feuil1")
            .AutoFilterMode = False
            .Range("A:C").AutoFilter
        If CheckBox1 * CheckBox2 * CheckBox3 Then
          .Range("A:C").AutoFilter Field:=2
          Exit Sub
        End If
        If CheckBox1 * CheckBox2 Then
          .Range("A:C").AutoFilter Field:=2, Criteria1:="=TOTO1", Operator:=xlOr, Criteria2:="=TOTO2"
          Exit Sub
        End If
        If CheckBox1 * CheckBox3 Then
          .Range("A:C").AutoFilter Field:=2, Criteria1:="=TOTO1", Operator:=xlOr, Criteria2:="=TOTO3"
          Exit Sub
        End If
        If CheckBox2 * CheckBox3 Then
          .Range("A:C").AutoFilter Field:=2, Criteria1:="=TOTO2", Operator:=xlOr, Criteria2:="=TOTO3"
          Exit Sub
        End If
        If CheckBox1 Then
          .Range("A:C").AutoFilter Field:=2, Criteria1:="TOTO1"
        End If
        If CheckBox2 Then
          .Range("A:C").AutoFilter Field:=2, Criteria1:="TOTO2"
        End If
         If CheckBox3 Then
           .Range("A:C").AutoFilter Field:=2, Criteria1:="TOTO3"
        End If
    End With
End Sub
Cordialement.
 

AntoineM

XLDnaute Junior
Re : Filtre de tableau par UserForm CheckBox

Bonjour Papou,

Merci pour ta réponse :)

Je me permets de prendre encore un peu de ton temps, car j'essaye de progresser sur le VBA :

Avec ce code tu balayes donc toutes les options de choix de cases c'est ça?
Pour signaler à Excel le choix de plusieurs CheckBox tu utilise "*" entre le nom de celles-ci ?

Merci encore,

Bonne journée à toi,

Antoine
 

Papou-net

XLDnaute Barbatruc
Re : Filtre de tableau par UserForm CheckBox

Bonjour Papou,

Merci pour ta réponse :)

Je me permets de prendre encore un peu de ton temps, car j'essaye de progresser sur le VBA :

Avec ce code tu balayes donc toutes les options de choix de cases c'est ça?
Pour signaler à Excel le choix de plusieurs CheckBox tu utilise "*" entre le nom de celles-ci ?

Merci encore,

Bonne journée à toi,

Antoine

RE:

Oui, c'est bien ça: je récapitule toutes les possibilités de coche des cases.

L'astérisque (*) est, entre autre, le symbole de multiplication d'Excel. Je multiplie donc la valeur des CheckBox. Si le résultat est Vrai (-1) c'est que les contrôles testés sont cochés. Sinon, on obtiendrait la valeur Faux (0).

Pour mieux comprendre, j'aurais dû écrire, par exemple:

Code:
If CheckBox1.Value * CheckBox2.Value = True then...
Mais comme la propriété par défaut des CheckBox est .Value, et que le résultat par défaut d'une multiplication booléenne est considérée comme étant à True, on peut donc simplifier comme suit:
Code:
If CheckBox1 * CheckBox2 then...

Tout ceci parce que je suis soucieux d'économiser les touches de mon clavier.

Espérant avoir répondu.

Cordialement.
 

Papou-net

XLDnaute Barbatruc
Re : Filtre de tableau par UserForm CheckBox

RE:

Je suis heureux que tu aies compris la logique du code.

Pour "pousser" un peu le raisonnement, voici une autre façon de faire un peu plus technique:

Code:
Private Sub CommandButton1_Click()
Dim m As Byte, n As Byte, Opt(1 To 3) As String

n = IIf(CheckBox1, 1, 0) + IIf(CheckBox2, 2, 0) + IIf(CheckBox3, 4, 0)
For i = 1 To 3
  If Me.Controls("CheckBox" & i) Then
    m = m + 1
    Opt(m) = Me.Controls("CheckBox" & i).Caption
  End If
Next
With Sheets("Feuil1")
  .AutoFilterMode = False
  .Range("A:C").AutoFilter
  Select Case n
    Case 1, 2, 4
      .Range("A:C").AutoFilter Field:=2, Criteria1:=Opt(1)
    Case 3, 5, 6
      .Range("A:C").AutoFilter Field:=2, Criteria1:=Opt(1), Operator:=xlOr, Criteria2:=Opt(2)
    Case Else
    .Range("A:C").AutoFilter Field:=2
  End Select
End With
End Sub
NB: pour simplifier le code, j'ai intégré les désignations des CheckBox dans leur propriété Caption et j'ai supprimé les Labels correspondants (voir fichier joint).

Bonne journée.

Cordialement.
 

Pièces jointes

  • EssaiUserFormTri-2.xlsm
    24.7 KB · Affichages: 69
Dernière édition:

AntoineM

XLDnaute Junior
Re : Filtre de tableau par UserForm CheckBox

Alors, je vais essayer de comprendre (pas gagné d'avance)

Si je comprends bien,
VB:
Dim m As Byte, n As Byte, Opt(1 To 3) As String

n = IIf(CheckBox1, 1, 0) + IIf(CheckBox2, 2, 0) + IIf(CheckBox3, 4, 0)
Ici tu déclare les variables en numérique, et tu définis la variable 'n' avec une fonction IIF (argument, valeur renvoyé si vrai, ... si faux). Du coup, tu pourrais ecrire IIf(CheckBox3, 3, 0) ?

VB:
For i = 1 To 3
  If Me.Controls("CheckBox" & i) Then
    m = m + 1
    Opt(m) = Me.Controls("CheckBox" & i).Caption
  End If
Next
Ici tu crées une boucle pour définir le nom de chaque critère si la case est cochée (ici pour les checkbox de 1 à 3).
Après on définit sur quelle feuille et quelle plage le filtre va s'appliquer.

Ce que je ne comprend pas, c'est la suite :
VB:
 Select Case n
    Case 1, 2, 4
      .Range("A:C").AutoFilter Field:=2, Criteria1:=Opt(1)
    Case 3, 5, 6
      .Range("A:C").AutoFilter Field:=2, Criteria1:=Opt(1), Operator:=xlOr, Criteria2:=Opt(2)
    Case Else
    .Range("A:C").AutoFilter Field:=2
  End Select
On demande de tester 'n' avec la fonction Select mais je ne comprend pas le reste.
Case 1, 2, 4 correspond au résultat renvoyé si les CheckBox1, 2 ou 3 sont cochés je pense.
Mais je ne sais pas ce qu'est case 3, 5, 6.
Et je ne m'explique pas pourquoi il n'y a pas de Opt(3).

Merci encore pour le temps que tu m'accordes :)

Bien à toi,

Antoine
 

Papou-net

XLDnaute Barbatruc
Re : Filtre de tableau par UserForm CheckBox

RE:

Du coup, tu pourrais ecrire IIf(CheckBox3, 3, 0) ?
Effectivement, mais si j'ai mis 4 au lieu de 3, c'est pour pouvoir effectuer des calculs en mode binaire (voir ci-dessous).

Case 1, 2, 4 correspond au résultat renvoyé si les CheckBox1, 2 ou 3 sont cochés je pense.
Mais je ne sais pas ce qu'est case 3, 5, 6.
Et je ne m'explique pas pourquoi il n'y a pas de Opt(3).
Voici donc l'explication de la numérotation 1, 2, 4:

Si CheckBox1=True, n=1
Si CheckBox2=True, n=2
Si CheckBox3=True, n=4
Si CheckBox1=True et CheckBox2=True, n=3 (1+2)
Si CheckBox1=True et CheckBox3=True, n=5 (1+4)
Si CheckBox2=True et CheckBox3=True, n=6 (2+4)
etc...

Cette façon de calculer exclut toute redondance.

En effet, n=3 aurait 2 possibilités:

- soit CheckBox1 et CheckBox2
- soit tout simplement CheckBox3

Cordialement.
 

AntoineM

XLDnaute Junior
Re : Filtre de tableau par UserForm CheckBox

Merci, les explications sont super. Je pense avoir compris, je vais essayer de faire la meme chose mais sur 5 CheckBox pour voir si j'ai bien saisi le truc, je poste dans un petit moment pour dire si j'ai réussis.

Autre question un petit peu lier, si je veux faire ça sans userform, cad en insérant des champs ActiveX directement sur ma feuille par le mode création, ça peut fonctionner. Car j'aimerais que le choix du filtre soit disponible tout le temps et ne bloque pas d'autres action dans le classeur.

Merci encore, encore, encore, pour ton temps et tes réponses,

bien à toi,

Antoine
 

Papou-net

XLDnaute Barbatruc
Re : Filtre de tableau par UserForm CheckBox

RE:

Si tu ajoutes des TextBox, il ne faut pas oublier de multiplier la valeur précédente par 2. Exemple:

n = IIf(CheckBox1, 1, 0) + IIf(CheckBox2, 2, 0) + IIf(CheckBox3, 4, 0)+ IIf(CheckBox4, 8, 0) + IIf(CheckBox5, 16, 0)

Pour avoir le formulaire disponible en permanence, je pense qu'il vaut mieux le conserver mais en l'affichant de façon non modale, ce qui permet d'accéder à la feuille de calcul. Elle reste déplaçable à tout moment pour ne pas gêner l'accès aux cellules. J'ai désactivé la croix de fermeture car elle s'efface si une autre feuille que la première est sélectionnée et se réaffiche automatiquement avec Feuil1. J'ai donc ajouté en option un bouton de fermeture en cas de besoin.

J'en ai profité pour ajouter du code au bouton Réinitializer.

Cordialement.
 

Pièces jointes

  • EssaiUserFormTri-3.xlsm
    25.9 KB · Affichages: 47
  • EssaiUserFormTri-3.xlsm
    25.9 KB · Affichages: 62
  • EssaiUserFormTri-3.xlsm
    25.9 KB · Affichages: 72

AntoineM

XLDnaute Junior
Re : Filtre de tableau par UserForm CheckBox

Re ;)

Alors j'avais bon pour le choix des nombres, mon erreur vient apparement dès que je choisis plus de deux arguments de filtres

VB:
Private Sub CommandButton1_Click()
Dim m As Byte, n As Byte, Opt(1 To 5) As String

n = IIf(CheckBox1, 1, 0) + IIf(CheckBox2, 2, 0) + IIf(CheckBox3, 4, 0) + IIf(CheckBox4, 8, 0) + IIf(CheckBox5, 16, 0)
For i = 1 To 5
  If Me.Controls("CheckBox" & i) Then
    m = m + 1
    Opt(m) = Me.Controls("CheckBox" & i).Caption
  End If
Next
With Sheets("Feuil1")
  .AutoFilterMode = False
  .Range("A:C").AutoFilter
  Select Case n
    Case 1, 2, 4, 8, 16
      .Range("A:C").AutoFilter Field:=2, Criteria1:=Opt(1)
    Case 3, 5, 6, 9, 10, 12, 17, 18, 20, 24
      .Range("A:C").AutoFilter Field:=2, Criteria1:=Opt(1), Operator:=xlOr, Criteria2:=Opt(2)
    Case 7, 11, 13, 14, 19, 21, 22, 25, 26, 28
      .Range("A:C").AutoFilter Field:=2, Criteria1:=Opt(1), Operator:=xlOr, Criteria2:=Opt(2), Operator:=xlOr, Criteria3:=Opt(3)
     Case 15, 23, 27, 29, 30
      .Range("A:C").AutoFilter Field:=2, Criteria1:=Opt(1), Operator:=xlOr, Criteria2:=Opt(2), Operator:=xlOr, Criteria3:=Opt(3), Operator:=xlOr, Criteria4:=Opt(4)
    Case Else
    .Range("A:C").AutoFilter Field:=2
  End Select
End With
End Sub

Je suppose que je ne peux pas utiliser Operator:=xlOr plusieurs fois.
C'est ca ou alors je me suis trompé ailleurs ?

Merci encore pour ton aide ;)

Antoine
 

Pièces jointes

  • EssaiUserFormTri-3.xlsm
    22.2 KB · Affichages: 57
  • EssaiUserFormTri-3.xlsm
    22.2 KB · Affichages: 75
  • EssaiUserFormTri-3.xlsm
    22.2 KB · Affichages: 91

Papou-net

XLDnaute Barbatruc
Re : Filtre de tableau par UserForm CheckBox

RE:

Il faut noter les clés de tri dans un tableau de type Array.

Ex:

Code:
Private Sub CommandButton1_Click()
Dim m As Byte, n As Byte, Opt(1 To 5) As String

n = IIf(CheckBox1, 1, 0) + IIf(CheckBox2, 2, 0) + IIf(CheckBox3, 4, 0) + IIf(CheckBox4, 8, 0) + IIf(CheckBox5, 16, 0)
For i = 1 To 5
  If Me.Controls("CheckBox" & i) Then
    m = m + 1
    Opt(m) = Me.Controls("CheckBox" & i).Caption
  End If
Next
With Sheets("Feuil1")
  .AutoFilterMode = False
  .Range("A:C").AutoFilter
  Select Case n
    Case 1, 2, 4, 8, 16
      .Range("A:C").AutoFilter Field:=2, Criteria1:=Opt(1)
    Case 3, 5, 6, 9, 10, 12, 17, 18, 20, 24
      .Range("A:C").AutoFilter Field:=2, Criteria1:=Array(Opt(1), Opt(2)), Operator:=xlFilterValues
    Case 7, 11, 13, 14, 19, 21, 22, 25, 26, 28
      .Range("A:C").AutoFilter Field:=2, Criteria1:=Array(Opt(1), Opt(2), Opt(3)), Operator:=xlFilterValues
     Case 15, 23, 27, 29, 30
      .Range("A:C").AutoFilter Field:=2, Criteria1:=Array(Opt(1), Opt(2), Opt(3), Opt(4)), Operator:=xlFilterValues
    Case Else
    .Range("A:C").AutoFilter Field:=2
  End Select
End With
End Sub
Restant à ta disposition.

Cordialement.
 

AntoineM

XLDnaute Junior
Re : Filtre de tableau par UserForm CheckBox

Effectivement, ca marche niquel.

La fonction Array permet donc de créer une liste d'éléments, sans doute très utile pour la suite.

Bon, je pense avoir compris la solution que tu m'as proposé, merci énormément de ton aide.
Je vais quand même essayé de créer des boutons ActiveX sur ma feuille car j'aime l'idée que les CheckBox soient intégrés à mon onglet. En plus cela me permettra d'intégrer un peu plus ce que tu m'as transmis.

J'aurais sans doute besoin de ton aide encore, mais je te remercie encore pour toute celle que tu m'as offert jusqu'a présent !

En plus de m'apporter la solution, tu me l'expliques, ROYAL.

Merci pour tout,

Antoine
 

AntoineM

XLDnaute Junior
Re : Filtre de tableau par UserForm CheckBox

Re bonjour Papou !

Alors, je bloque a une étape, la macro que tu as construit fonctionne avec un userform, la dénomination "Me.controls" fais donc appel à tous les controls de UserForm1 je pense.

Comment redéfinir ce bout de code :
VB:
For i = 1 To 5
   If Me.Controls("CheckBox" & i) Then
     m = m + 1
     Opt(m) = Me.Controls("CheckBox" & i).Caption
   End If
 Next

Pour qu'Excel comprenne "tous les inputbox de la feuille" et non pas "tous les inputbox du UserForm" ?

Je pensais partir sur un truc du style :

VB:
Dim m As Byte, n As Byte, Opt(1 To 5) As String, obj As OLEObject
 For Each obj In ActiveSheet.OLEObjects
   For i=1 to 5
      m = m + 1
      Opt(m) = obj("CheckBox" & i).Caption
     End If
    Next i
Next

C'est un début de piste ou je me suis perdu en route ?

Merci en tout cas, le fichier que j'ai construis grâce à toi (et à d'autre du forum aussi quand même) fonctionne super bien !


Bien à toi,

Antoine
 
Dernière édition:

Discussions similaires

Statistiques des forums

Discussions
312 305
Messages
2 087 083
Membres
103 458
dernier inscrit
Vulgaris workshop