checkbox et classement auto

romainchu78

XLDnaute Occasionnel
Bonjour a tout le forum,

J'ai une grille de données. 10 colonnes correspondantes à 10 familles de produits différentes. J'ai des produits classes en lignes, chacun peut appartenir à une ou plusieurs familles.

Dans une grille (lignes de produits + colonnes de familles de produits) j’ai la quantité de chaque produit pour chacune des familles.

L’idée: grâce à un jeu de check box, 10 exactement (1 pour chaque famille de produits/colonnes) trier les quantités de produits pour des familles correspondantes.
En d’autre terme, je souhaite mettre en évidence l'effectivité des produits dans les familles de produits tout ceci au-travers les quantités, c'est à dire regrouper en communs les produits (donc les lignes) qui sont dans des familles de données.

Par exemple: le type veux savoir quels sont tous les produits qui sont au moins une fois dans les familles de produits 1, 2 et 5.
Le type coche donc la check box 1, 2 et 5 et appuie sur compute. Alors il voie apparaitre en début de liste, les produits qui sont au moins une fois dans les trois familles listées.
Bien évidemment, les colonnes de bougnent pas, ce sont les lignes (donc les produits) qui bougent (rappel 1 ligne = 1 produit).

J’ai vraiment besoin d’une gestion auto (macro Visual Basic) pour éviter de ce tapé à la main les plus de 13000 produits d’une liste.

Le fichier exemple en pièce jointe de comprend que 11 produits pour 10 familles de produits.

J’ai réussi à développer un trieur similaire mais je ne pouvais choisir qu'une seule famille de produit a la fois grâce a des options box (1 seule choix possible). Grâce a une boucle for qui balayait toutes les lignes du fichier et des boucles if imbriquées pour repéraient le choix de la option box cochées. En fonction de ca, il générerait un caractère dans la même ligne du produit concerne dans une colonne tierce. Ensuite grâce à la fonction
“Selection.Sort” je regroupais toutes les lignes en début de liste.

Je n’arrive pas à adapter ce code pour des multi-sélections, c’est pour cela que je demande de l’aide. Toutes les idées seront les bienvenues.

Merci et bonne semaine.

Romain
 

Pièces jointes

  • checkbox.zip
    25.7 KB · Affichages: 25
  • checkbox.zip
    25.7 KB · Affichages: 20
  • checkbox.zip
    25.7 KB · Affichages: 22

Hervé

XLDnaute Barbatruc
Re : checkbox et classement auto

bonjour :)

en piece jointe une tentative de réponse, si j'ai bien tout compris bien sur.

salut
 

Pièces jointes

  • checkbox.zip
    30.7 KB · Affichages: 48
  • checkbox.zip
    30.7 KB · Affichages: 46
  • checkbox.zip
    30.7 KB · Affichages: 47

romainchu78

XLDnaute Occasionnel
Re : checkbox et classement auto

Merci pour ta reponse.
Effectivement c'est un truc comme ca que je veux a part qu'il me prend plus de produits que prevu.

Par exemple, je veux savoir les produits des familles 1, 2 et 10. alors je clique sur les checkbox correpondantes mais il m'affiche ceux qui sont sont au moins dans ces familles mais m'affiche aussi ceux qui sont partout.
il y a t'il un moyen de changer cela.

merci d'avance
 

romainchu78

XLDnaute Occasionnel
Re : checkbox et classement auto

re-
J'ai une autre suggestion, je te propose de me commenter ton code de maniere a ce que je le reprenne moi-meme. Et en particulier je ne comprend pas ceci:

tablo(i) = "t": cpt = cpt + 1 ‘comment fonctionne cette ligne ?

If Cells(i, j) <> "" Then ‘jai pas compris le process ?
If tablo(j - 1) = "t" Then ‘jai pas compris le process ?
aconserver = aconserver + 1 ‘jai pas compris le process ?
End If
End If

If aconserver <> cpt Then ‘jai pas compris le process ?
If plage Is Nothing Then ‘jai pas compris le process ?
Set plage = Rows(i) ‘jai pas compris le process ?
Else
Set plage = Union(plage, Rows(i)) ‘jai pas compris le process ?
End If
End If

If Not plage Is Nothing Then ‘jai pas compris le process ?
plage.EntireRow.Hidden = True ‘jai pas compris le process ?
End If

merci beaucoup pour ton aide.

romain
 

Hervé

XLDnaute Barbatruc
Re : checkbox et classement auto

bonjour :)

je te fournis un nouveau code (tres proche du précédent) pour mieux coller à ta demande, j'ai essayé de placer des commentaires afin de t'aider à comprendre le principe général :

Private Sub CommandButton1_Click()
Dim i As Long
Dim j As Byte
Dim tablo(1 To 10) As String
Dim plage As Range
Dim aconserver As Integer, cpt As Byte

Application.ScreenUpdating = False

Rows.Hidden = False


'on stock dans un tableau les EF cochés
'donc, on boucle sur les checkbox, si celui ci est coché
'on place un "t" sur la ligne du tableau, et on alimente la variable CPT
'cpt=le nombre de chekbox cochés

For i = 1 To 10
If ActiveSheet.OLEObjects("EF" & i).Object.Value = True Then
tablo(i) = "t": cpt = cpt + 1
End If
Next i


'ensuite on boucle sur toutes les lignes et toutes les colonnes
'on utilise une variable à 0 (aconserver) puis on la fait varier suivant deux criteres :
'1) la cellule n'est pas vide
'2) un "t" à été trouvé dans le tableau au meme emplacement
'si les deux condtions sont respectées, on ajoute 1 à la variable aconserver
'sinon on retire 1

For i = 2 To Range("a65536").End(xlUp).Row 'boucles sur toutes les lignes
aconserver = 0
For j = 2 To 11 'boucles sur les colonnes 2 à 11
If Cells(i, j) <> "" Then
If tablo(j - 1) = "t" Then
aconserver = aconserver + 1
Else
aconserver = aconserver - 1
End If

End If
Next j


'a ce stade, si ta variable aconserver est egale à la variable cpt
'c'est que cette ligne ne doit pas etre masquée
'sinon on l'ajoute à la variable plage qui représentera toutes les lignes à masquées

If aconserver <> cpt Then
If plage Is Nothing Then
Set plage = Rows(i)
Else
Set plage = Union(plage, Rows(i))
End If
End If
Next i


'si plage n'est pas vide, alors on masques les lignes
If Not plage Is Nothing Then
plage.EntireRow.Hidden = True
End If

Application.ScreenUpdating = True

End Sub


en espérant que mes explications seront clairs, sinon, n'hésites pas à revenir.

salut
 

Discussions similaires

Réponses
9
Affichages
321

Membres actuellement en ligne

Statistiques des forums

Discussions
314 078
Messages
2 105 468
Membres
109 375
dernier inscrit
anderson2