Encore des checkbox à problèmes

  • Initiateur de la discussion Lindoo
  • Date de début
L

Lindoo

Guest
Bonjour le forum :)

Voilà c’est un problème de CheckBox que je n’arrive pas à résoudre (parce que je suis qu’en rodage).
Sur un Userform j’ai 3 frames, contenant chacune des CheckBox ( 5, 6 et 2) : l’utilisateur peut choisir toutes les réponses (à chaque frame, une au minimum). Mon problème c’est comment traiter les données recueillies pour qu’elles puissent être exploitables (sous qu’elle variable etc. ), car après je compare les options choisies (par les checkbox) avec les données d’un tableau (plus de 15000 lignes). Chaque frame correspond à un type de donné et donc à une colonne de mon tableau. En fonction du checkbox coché, je compte le nombre de donnée correspondant, pour le mettre dans un tableau.
Pour le moment j’utilise des chaînes de char puis des boucles si, mais je ne peux cocher qu’une seul checkbox par frame.

Merci de votre aide.

PS : J’avais déjà ouvert un sujet il y 3-4 jours mais je n’ai pas eu la chance d’avoir de réponse.
 
@

@+Thierry

Guest
Bonjour Lindoo,

Désolé pour toi si tu n'as pas eu de réponse, il y a une grosse affluence sur le Forum... Difficile de répondre à tous etr toutes.

Pour ta question, je voudrais déjà savoir si on parle rééllement de Control ActiveX "CheckBox" car ta phrase "mais je ne peux cocher qu’une seul checkbox par frame semble faire ressortir que tu parles de Control ActiveX "OptionButton" ...

Car les CheckBox, en Frame ou Non, ne posent pas ce genre de problème...

Donc avant toute chose il est primordial de connaître les dénominations des Objets VB et de les utiliser correctement, car sinon on risque de ne pas pouvoir te donner de réponse.

Sinon pour le type de Variable qui récupèrera la valeur des "CheckBox" (ou OptionButton, c'est idem à ce niveau) sont des Variables de type Boolean (Vrai/Faux) ...

Pour le reste, je ne comprends pas trop ce que tu cherches à faire, donc soies plus explicite...

Bonne Journée
@+Thierry
 
L

Lindoo

Guest
Bonjour @+Thierry

Oui le forum est en pleine activité, j’ai vu ça, c’est d’ailleurs pourquoi je me suis adressé ici... Enfin il y a aussi une autre raison, j’avais lu pas mal de tes productions ;)

Je parle bien de contrôles "case à cocher" (checkbox), c’est justement parce que les réponses peuvent se cumuler que j’ai utilisé des checkbox et non des OptionButton.
Et j’ai bien des booléens à la sortie (case cochée ou non).

Bon je me suis mal exprimé... Je ne sais pas comment expliquer, mais je peux toujours poster des bouts de code ça va sans doute aider :
Par exemple la frame avec 2 checkbox :
‘ CB[truc] désigne mes checkbox et production est une chaîne
If CBsmaAna = True Then
If CBsmaNum = True Then
Production = "Analogique et Numerique"
Else: Production = "Analogique"
End If
ElseIf CBsmaNum = True Then
Production = "Numerique"
Else: MsgBox "Selectionner au moins 1 type de ligne.", vbOKOnly, "Erreur : selection du type de ligne"
Exit Sub
End If

Ca ça ne pose pas de problème. Je réutilise ensuite Production dans mes entêtes de tableau. Mais le problème se pose plus loin, lorsque je compare des colonnes contenant des chaînes de caractères. Si l’utilisateur a caché Analogique et Numérique, mon prog devrait chercher dans une colonne deux chaînes différentes (ANA et NUM). Bon quand il n’y en a que deux, en bidouillant ça passe... Mais le problème se corse avec 6 checkbox.
Je ne sais pas si j’ai été plus clair... mais je peux toujours en rajouter ;)

Merci Thierry de te pencher sur mon cas, j’en avais grand besoin.
 
L

Lindoo

Guest
Un exemple sans doute plus parlant, pour les département :

Depart = "" ‘ string
If CBdep44 = True Then ‘ CB désigne un CheckBox
Depart = Depart & "Loire Atlantique "
Dep = 44 ‘ string
End If
If CBdep49 = True Then
Depart = Depart & "Maine et Loire "
Dep = 49
End If
If CBdep53 = True Then
Depart = Depart & "Mayenne "
Dep = 53
End If
If CBdep72 = True Then
Depart = Depart & "Sarthe "
Dep = 72
End If
If CBdep85 = True Then
Depart = Depart & "Vendée "
Dep = 85
End If

L’utilisateur peut cocher entre 1 et 5 départements. Le problème se situe ensuite au niveau de ma boucle :

For i = 1 To X
If Worksheets("Feuil1").Range("B" & i) = Prod Then
If Worksheets("Feuil1").Range("C" & i) = Marc Then ‘ autre string issue d’un CB
If Worksheets("Feuil1").Range("F" & i) = Dep Then
If Worksheets("Feuil1").Range("D" & i) = "X01" Then
Compteur1 = Compteur1 + 1
ElseIf Worksheets("Feuil1").Range("D" & i) = "X02" Then
Compteur2 = Compteur2 + 1
ElseIf Worksheets("Feuil1").Range("D" & i) = "X03" Then
Compteur3 = Compteur3 + 1
ElseIf Worksheets("Feuil1").Range("D" & i) = "X04" Then
Compteur4 = Compteur4 + 1
ElseIf Worksheets("Feuil1").Range("D" & i) = "X10" Then
Compteur5 = Compteur5 + 1
End If
End If
End If
End If
Next

La variable Dep (string) ne prend en compte qu’une seule valeur. La recherche s’effectue donc sur un seul département, quel que soit le choix de l’utilisateur (pb) :(

En espérant que vous pourez m’aider ;)
 
@

@+Thierry

Guest
=> DEMO (Redif) UserForm de Stastistiques (Methode New Collection et Evaluate)

RE Bonjour Lindo, le Forum

Ouh La Ouh La Ouh La La !! (LudVig Von 88)

C'est vraiment tordu de s'y prendre comme ceci, je ne pense pas que tu puisses t'en sortir facilement de la sorte... Et le pire c'est que tu te condamnes toi-même à être en permanence en train de trafiquer un programme dont la conception empêche toute évolution...

Imagine qu'on te rajoute un Départment ?? et paf !! Hop tout à refaire !!!

Non Moi je vois ceci en ListBox MultiSelect plutot que CheckBox....

Bon sinon pour la Boucle, pas nette non plus, en plus une cascade de IF comme ceci doit être horriblement long si tu as beaucoup de lignes ....
Regarde ces deux démos cousines :

=> Démo Téléchargeable Lien supprimé

=> Démo Téléchargeable Lien supprimé (24k)

=> Fil de Discussion Lien supprimé

Tu y trouveras des moyens de comptabiliser des Items par VBA ...

Car pour l'instant je pars déjeuner !!!
Bon Appétit (et merci des compliments)

@+Thierry
 
L

Lindoo

Guest
Re :)

Bon normalement on ne rajoutera pas de département ou quoi que ce soit, donc pour ce qui est d’être évolutif on s’en fiche. Par contre pur le temps d’exécution c’est une autre histoire...

Pour ce qui est des ListBox MultiSelect (un listbox normal :doute: ), je ne m’en suis jamais servi, est-ce pratique pour l’utilisateur ?

C’est bien ceci, qu’il fallait que je remarque dans tes démos :
Set Users = New Collection

With Database
L = .Range("A65536").End(xlUp).Row
Plage = .Range("A2:A" & L)
End With

For i = 1 To L
On Error Resume Next
Users.Add Plage(i, 1), Plage(i, 1) ’ tu fais quoi là exactement ?
Next i

For Each Item In Users
Me.ListBox1.AddItem Item
Next

En fait, tu as créé un nouveau type que tu incrémente après, non ?
Pour la boucle je ne sais pas quoi faire... En fait, j’suis perdu :(
 
@

@+Thierry

Guest
Re Salut Lindoo, le Forum

Si tu es certain que tu ne rajouteras rien, on peut se lancer dans des CheckBox mais de toute manière le retour des info en fonction de celles qui seront True ou False va t'obliger à te casser la tête pour gérer une telle histoire soit par cascasdes de If ou autre Select Case... Alors qu'une ListBox en MultiSelect fait ceci naturellement... En plus elle peut s'incrémenter automatiquement, ce qui est vraiment un vrai plus pour l'évolution, puisque sans maintenance !

Je te rassure c'est bien de ListBox MSForm 2.0 dont il s'agit, il suffit de lui octroyer la propriété Multi comme suit :

ListBox1.MultiSelect = fmMultiSelectMulti (Selection par Simple Clicks)

ou .MultiSelect = fmMultiSelectExtended (Sélection avec CTRL et ou MAJ, comme Windows le gère)


Pour te montrer "live" va dans ce Fil : Lien supprimé la seconde démo que je viens d'y déposer contient une ListBox en Mode "fmMultiSelectMulti "...

Pour tes autres questions...
For i = 1 To L
On Error Resume Next
Users.Add Plage(i, 1), Plage(i, 1) ’ tu fais quoi là exactement ?
Next i

Je profite de la particularité "Key" d'une Collection, qui refuse toute Clef en double (ce qui est normal) et par conséquent j'incrémente ma Collection avec le nom de User en Item, et aussi en Key ce qui provoque une erreur si la clef existe déjà, donc avec "On Error Resume Next" je passe l'erreur et par conséquent je n'ai pas de Doublon !!!

Ensuite j'incrémente ma ListBox en Item Unique de ma Collection...

En fait tout ceci te permet de faire une ListBox contenant des Items uniques d'une colonne de la base de données et ensuite grace à cette ListBox tu peux utiliser des fonction avec "Evaluate" par exemple pour retourner le nombre de tel ou tel item dans ta Base... Pour faire en Multi ce serait sur le même principe... (Voir la démo pour les Feuilles en lien dans ce Post)...

Voilà pour une première approche

Bon Courage
@+Thierry
 
L

Lindoo

Guest
Merci Thierry pour les listbox multiselect, je vais tout refaire avec ça.
A propos, comment récupère t’on le résultat de ses listbox et avec quoi je peux les exploiter, s’il te plait ?

Et merci pour tes explications, même si j’ai un peu de mal à tout comprendre.

Je travail ça et je repasse pour d’autres questions :p
 
@

@+Thierry

Guest
=> DEMO UserForm Rudiments Basics "ListBox.MultiSelect" récupération des Items

Bonjour Lindoo, le Forum

Pour les Collections, fait des recherches dans ce Forum avec mon Nick et "Collection" tu auras d'autres explications et Démos...

Pour les ListBox en MultiSelect dans le lien que je t'ai mis plus haut tu as déjà un exemple, mais bon comme c'est une question qui revient souvent souvent, voici une démo dans la Ligné "Rudiments Basics" avec "FullComments" explicatifs...

Bon Week End
@+Thierry
 

Pièces jointes

  • USF_ListBox_Rudiments_Basics_V03.zip
    17.1 KB · Affichages: 35
L

Lindoo

Guest
Bonjour @+Thierry et le forum :)

Encore merci pour ton aide Thierry ;)

J’ai une question à te poser. Sur tes démos tu places des boutons (commandbutton) directement sur les feuilles excel. J’ai tenté de regarder le code (pour faire quelque chose de similaire) mais je n’ai pas trouvé (ou pas compris).

En fait au départ je voulais créer un raccourci du userform (qui lance excel ou non)... Comme je n’ai pas trouvé, j’ai fait un raccourci de ma feuille excel (avec une macro qui te demande ou tu veux le placer etc.) et sur ma feuille excel je place un bouton lien vers mon userform.

Pour le moment j’utilise ce code que j’ai mis dans ThisWorkbook :

Private Sub Workbook_Open()
Dim objWorksheet As Worksheet
Set objWorksheet = ThisWorkbook.Worksheets("FeuilleSource")
objWorksheet.Shapes.AddOLEObject "Forms.CommandButton.1", , , , , , , 320, 50, 150, 25
End Sub

Mais je ne sais pas comment entrer du code sur ce bouton... Je sais juste le redimensionner et le cadrer.
... en fait j’aimerais y mettre un peu de couleur (comme tu sais si bien le faire) et un lien vers le userform.
Pour la couleur j’ai testé ça :

With objWorksheet.Shapes.AddOLEObject("Forms.CommandButton.1", , , , , , , 350, 50, 150, 25)
.Name = "Accéder au programme"
.Line.DashStyle = msoLineDashDot
.Fill.ForeColor.RGB = RGB(128, 0, 0)
.Fill.BackColor.RGB = RGB(170, 170, 170)
.Fill.TwoColorGradient msoGradientHorizontal, 1
End With

Mais là non plus ce n’est pas le résultat esconté... J’ai qu’un contour de « taché »... Je dois mal utiliser les propriétés...
Mais, mon plus gros souci reste de mettre du code dans ce bouton...

Merci si tu peux me répondre (toi ou un autre ;) )
 
L

Lindoo

Guest
Pour le bouton j’ai trouvé :

Dans la barre d'outils Formulaires il y a la possibilité de créer un bouton. Ensuite on y affecte une macro. Et j’ai juste placé le code :

Sub Bouton1_QuandClic()
UserForm1.Show
End Sub

Mais bien sur cette macro se place dans un Module. Alors que @+Thierry n’en utilise pas, il place son code directement dans la feuil1. J’ai testé mais il ne reconnaît plus ma macro dans ce cas là. Si quelqu’un sait quelque chose la-dessus, je suis preneur ;)
 
P

Plon-plon

Guest
Re: => DEMO UserForm Rudiments Basics "ListBox.MultiSelect" récupération des Items

Bonsoir à tous

Dans la demo de @+Thierry => Démo Téléchargeable USF-XLD-Stats-V01-00
et-il possible de filtrer la colonne A pour retrouver juste les éléments du filtres dans la listbox1
Je travail sur une applie qui y resemble Bcp mais je plante un tio peneu.

Merci d'avence

@ trés bientôt
Le plon-plon
 

Discussions similaires

Réponses
3
Affichages
149

Statistiques des forums

Discussions
314 205
Messages
2 107 201
Membres
109 776
dernier inscrit
dadi chawki