VBA - checkbox à nom variable [Résolu/Fermé]

Signaler
Messages postés
116
Date d'inscription
dimanche 14 septembre 2008
Statut
Membre
Dernière intervention
30 août 2012
-
Messages postés
116
Date d'inscription
dimanche 14 septembre 2008
Statut
Membre
Dernière intervention
30 août 2012
-
Bonjour,

navré de poser une question aussi basique mais j'ai beau chercher... je ne trouve rien sur le forum. Ni même ailleurs.

J'aimerais connaître le code permettant de lier le nom d'une checkbox (propriété -> name) au contenu d'une cellule.
Je n'ai pas encore osé mettre de code vba dans le champ correspodant au nom dans les propriétés de ma checkbox...

J'ai bien pensé à contourner le problème mettant des checkbox directement sur une feuille mais je suis obligé de passer par un userform.

9 réponses

Messages postés
12184
Date d'inscription
jeudi 15 mai 2008
Statut
Modérateur
Dernière intervention
31 juillet 2020
2 475
Bonjour,
Ma question : pourquoi faire?

Ma réponse à ton problème : on ne peux pas définir la propriété name d'un contrôle déjà existant. Un code comme celui-ci plante :
CheckBox1.Name = "toto"

Par contre, il est possible d'ajouter dynamiquement des contrôles à un UserForm et donc de les nommer comme l'on veux. Le code suivant, au chargement de l'userform, va y ajouter un checkbox et le renommer...
Private Sub UserForm_Initialize()
Dim Ctrl As Control
    
Set Ctrl = Me.Controls.Add("forms.CheckBox.1")
If Range("A1") <> "" Then
    With Ctrl
        .Name = Range("A1")
    End With
End If
End Sub

Donc dis nous exactement le but et le pourquoi du comment de ce que tu souhaites réaliser...
Messages postés
8700
Date d'inscription
dimanche 8 avril 2007
Statut
Contributeur
Dernière intervention
22 janvier 2020
1 103
Bonjour,
Je ne comprend pas !!
Veux-tu expliciter..
J'aimerais connaître le code permettant de lier le nom d'une checkbox (propriété -> name) au contenu d'une cellule.
A+
Messages postés
116
Date d'inscription
dimanche 14 septembre 2008
Statut
Membre
Dernière intervention
30 août 2012
28
Salut, et merci de vos réponses (à tout le moins : de vous pencher sur le problème).

Pijaku, j'ai lu ton code, il pourrait suffire je pense, à ceci près que :
- j'ai quelque chose comme 100 fournisseurs.
- on ne définit pas la position de la checkbox, donc s'il faut en générer plusieurs, il faut pouvoir préciser l'emplacement précis de la checkbox créée
- la longueur du nom d'un fournisseur est très variable (entre 5 et 30 caractères)

Pour l'explication en détail, voilà le topo (bonne lecture !):

D'un côté, j'ai une basse de donnée compilée sur Excel (2007) qui compte 55 000 lignes pour 254 colonnes (pas le choix, ça ne dépend pas de moi, je fais avec).
Dans cette bdd, j'ai une colonne "fournisseur" qui indique le numéro de fournisseur de l'article.

De l'autre côté, j'ai un classeur "liste des fournisseurs", avec donc un nom qui correspond à chaque numéro de fournisseur.
/!\ Piège, cette liste évolue avec le temps sans que j'en sois informé /!\

J'ai déjà codé une macro qui permet d'extraire et de mettre dans un nouveau classeur les lignes d'articles correspondant au(x) fournisseur(s) qui m'intéresse(nt).

Mon problème le voici :
Actuellement, voici comme agit la macro :
1 - je vais dans le classeur "liste de fournisseurs" je mets 1 devant les fournisseurs qui m'intéressent, j'enregistre et je ferme.
2 - je lance la macro qui va lire la "liste des fournisseurs"
3 - pour chaque fournisseur pour lesquelles la colonne "choix" comporte "1", elle mémorise le numéro de fournisseur correspondant
4 - la macro va ensuite la colonne fournisseur de ma bdd et copie toutes les lignes correspondantes dans un nouveau classeur "extraction par fournisseurs".

Cela pose donc un problème majeur :
je suis le seul (sachant comment la macro fonctionne) à pouvoir faire ces extractions.
Or, je dois créer un outils d'utilisation simple pour que n'importe qui (des gens qui ne veulent que cliquer et attendre, disons-le) puisse faire une extraction à sa convenance.
Si je commence à leur dire "tu ouvres ce ficher, tu mets 1 dans "cette" colonne devant ton fournisseur,tu enregistres, tu fermes et tu ouvres ce fichier et tu attends". On va me regarder avec des yeux ronds.

Une seule solution s'impose : sélectionner les fournisseurs à extraire via un userform et des checkbox à cocher. C'est simple, esthétique, et efficace. (non ?)

Ce que je veux faire :
1 - L'utilisateur ouvre un classeur excel pour lequel je paramètre le lancement d'une macro à l'ouverture. (je sais faire)
2 - L'utilisateur voit une fenêtre (userform de sélection) et coche les fournisseurs qui l'intéressent
/!\ Il y a plusieurs catégories de fournisseurs, donc un onglet par catégorie serait l'idéal), mais l'extraction doit pouvoir englober des fournisseurs de toues catégories)/!\
3 - L'utilisateur clique sur un bouton "Extraire" qui va alors lancer l'extraction de tous les articles correspondant à sa sélection.

MAIS, comme la liste de fournisseurs peut changer à tout moment, le userform qui contient les fournisseurs à extraire DOIT IMPÉRATIVEMENT être généré en fonction de la liste de fournisseurs.

Je dois donc faire en sorte que :
- la macro affiche autant de checkbox que de fournisseurs
- que le nom de la checkbox comporte le numéro de fournisseur
- que chaque checkbox créer apparaisse dans le bon onglet (catégorie) s'il vous plaît.

En ce qui concerne la taille de la userform, elle doit de toute manière occuper tout l'écran donc pas de soucis de place.

Voilà, j'espère que j'ai été assez claire. N'hésitez pas si vous avez besoin d'éclaircissements. Et encore merci d'essayer de m'aider. Il y a encore 1 mois je ne savais même pas pas faire un "Cells(x,y).Select"...

D'après le code que Pijaku m'a mis, voici ce qui me vient à l'esprit :

Private Sub UserForm_Initialize()
Dim Ctrl As Control
Dim CbName, x, y, z as Byte ' CbName as byte car il sera en fait le numéro de fournisseur
y = 0
Set Ctrl = Me.Controls.Add("forms.CheckBox." & CbName)
If Range("A1") <> "CbName" Then
    With Ctrl
        .Name = Range("A1")
        .Height = x
        .Top = y
    End With
        . z = z +1
End If
End Sub


Après, je peux me débrouiller avec des conditions qui ferons que suivant la valeur de z, x et y varient pour placer la checkbox au bon endroit.

Reste encore à créer les onglets, les nommer, et envoyer chaque checkbox dans le bon onglet
Messages postés
12184
Date d'inscription
jeudi 15 mai 2008
Statut
Modérateur
Dernière intervention
31 juillet 2020
2 475
Bonjour,
la solution proposée par Lermitte est la mieux adaptée.
Par contre, 100 fournisseurs dans une unique Listbox ne sera pas ergonomique pour l'utilisateur.
Par contre tu parles de catégorie de fournisseurs... Combien de catégories et combien de fournisseurs maxi par catégorie?

Je te propose, non pas de créer un userform multipage, mais, dans ton userform d'intégrer une listbox par catégorie.....
Messages postés
8700
Date d'inscription
dimanche 8 avril 2007
Statut
Contributeur
Dernière intervention
22 janvier 2020
1 103
Re,
Y a beaucoup plus simple que ça.
1°) Un Userform avec un bouton OK
2°) une listBox
La listBox peu facilement être remplie en déterminant la plage des fournisseurs
Avec la propriété MultiSelect = True l'utilisateur peu sélectionner les fournisseurs qui l'intéresse.
Tu peu aussi en faire des option avec la propriété ListStyle
Ensuite tu peu actualiser ta macros avec les items sélectionner.
A+
Si tu te cognes à un pot et que ça sonne creux, c'est pas forcément le pot qui est vide. ;-)(Confucius)
NOTE : Je ne répond pas aux MP pour les questions techniques.
Messages postés
8700
Date d'inscription
dimanche 8 avril 2007
Statut
Contributeur
Dernière intervention
22 janvier 2020
1 103
Mais si tu tient absolument à des CheckBox tu peu t'inspirer de cette astuce en remplaçant les boutons par des ckeckBox.
Messages postés
8700
Date d'inscription
dimanche 8 avril 2007
Statut
Contributeur
Dernière intervention
22 janvier 2020
1 103
Bonjour Pijaku,
100 fournisseurs dans une unique Listbox ne sera pas ergonomique pour l'utilisateur.
Je ne trouve pas que c'est trop, regarde un peu la listbox avec les polices des textes.
Par contre, plusieurs listbox vont rendre la sélection beaucoup plus complexe, sans dire que c'est impossible.
A+
Messages postés
116
Date d'inscription
dimanche 14 septembre 2008
Statut
Membre
Dernière intervention
30 août 2012
28
Comme quoi, les solutions les plus simples répondent souvent aux problèmes les plus complexes...

Je vais essayer une listbox en choix multiple extended, et je vous tiens au courant.

Merci pour vos réponses si rapides.
Messages postés
116
Date d'inscription
dimanche 14 septembre 2008
Statut
Membre
Dernière intervention
30 août 2012
28
Hem... lermite222, tu peux me mettre un exemple de code d'une listbox remplie avec un plage de cellule stp ? je ne connais pas la syntaxe et je ne trouve pas dans l'aide vba...

je dois te paraître un vrai débutant, je te rassure c'est le cas, il y a un mois je ne savais même pas faire un Cells( x,y).Select... c'est tout dire !!
Messages postés
12184
Date d'inscription
jeudi 15 mai 2008
Statut
Modérateur
Dernière intervention
31 juillet 2020
2 475
Je vous laisse lire ce tutos sur toutes sortes de contrôles et en particulier la listbox
Bonne continuation
Messages postés
8700
Date d'inscription
dimanche 8 avril 2007
Statut
Contributeur
Dernière intervention
22 janvier 2020
1 103
Ont ne fait pratiquement jamais de Cells( x,y).Select ont l'emploi directement.
par exemple : Cells( x,y).Offset(0,6).Value = Cells( x,y).Value
Messages postés
116
Date d'inscription
dimanche 14 septembre 2008
Statut
Membre
Dernière intervention
30 août 2012
28
Merci !
Messages postés
8700
Date d'inscription
dimanche 8 avril 2007
Statut
Contributeur
Dernière intervention
22 janvier 2020
1 103
Commençons par le début..
    ListBox1.MultiSelect = fmMultiSelectMulti
    ListBox1.RowSource ="'NomDuClasseur+Extention'!A1:A100"

Mais la plage doit être dynamique ?
Si oui, donne le nom du classeur et la colonne où se trouve les fournisseurs je t'aiderais à définir la plage dynamiquement.
Pense aussi à l'aide en ligne.
Si tu est dans le VBA double clic sur le mot par exemple MultiSelect, il se met en surimpression, taper F1.
Dans les propriétés d'un contrôle, idem, clic sur la propriété (dans la fenêtre propriété) et tape F1.
PS : Quand une solution a été donnée à une question pense à taguer le topic en résolut, (Cliquer sur marquer comme résolu en haut à gauche)
Messages postés
116
Date d'inscription
dimanche 14 septembre 2008
Statut
Membre
Dernière intervention
30 août 2012
28
Hello,

merci pour ton aide, j'ai cherché un peu de mon côté, pour changer, et voici comment j'arrive à mes fins :

Private Sub UserForm_Initialize()

Dim a, b As Long
a = Cells(2, 1).Row
b = Cells(2, 1).End(xlDown).Row
Names.Add Name:="Plage_Fourn", RefersTo:="=fourniss!R" & a & "C1:R" & b & "C1"

With ListBox1
    .AddItem
    .MultiSelect = fmMultiSelectExtended
    .RowSource = "fourniss!Plage_Fourn"
End With

End Sub


Je me doute que j'ai fait des pirouettes inutiles mais bon... je suis arrivé à mes fins, c'est pas si mal

Par contre, j'ai cherché creusé dans mes différentes tables de fournisseurs, et la plus grande monte à 259 lignes...

CkeckBox ou ListBox, je pense que c'est la quantité d'informations qui pose problème. De deux maux le moindre, je vais donc rester sur ta sage propositiion, la List Box

Par conte, cela pose un problème autre : je ne sais pas quelles informations renvoi une ListBox...

je vais gratter un peu et si je bute je reviens te voir.

@+
Messages postés
116
Date d'inscription
dimanche 14 septembre 2008
Statut
Membre
Dernière intervention
30 août 2012
28
Bon, je pense que ce topic peut être fermé, j'ai trouvé un moyen d'utiliser des CheckBox à nom variable en travaillant sur un autre programme (plus simple) où j'en avais aussi besoin.
Comme on n'a pas donné d'exemple précis, je mets un petit bout de code simple pour ceux qui passeraient après nous, avec le raisonnement qui m'a permi de comprendre.

C'est un peu fastidieux mais ça marche et j'ai une préférences pour les variables numériques, notamment car je travaille essentiellement avec des boucles :

Private Sub UserForm_Initialize()  
Dim i As Byte  
Dim Mois As String  

For i = 34 To 45  
    If i = 34 Then Mois = "Janvier"  
    If i = 35 Then Mois = "Février"  
    If i = 36 Then Mois = "Mars"  
    If i = 37 Then Mois = "Avril"  
    If i = 38 Then Mois = "Mai"  
    If i = 39 Then Mois = "Juin"  
    If i = 40 Then Mois = "Juillet"  
    If i = 41 Then Mois = "Août"  
    If i = 42 Then Mois = "Septembre"  
    If i = 43 Then Mois = "Octobre"  
    If i = 44 Then Mois = "Novembre"  
    If i = 45 Then Mois = "Décembre"  
    If Month(Now) - (i - 33) > 0 Then Me.Controls("Checkbox" & i).Caption = Mois & " " & Year(Now)  
    If Month(Now) - (i - 33) <= 0 Then Me.Controls("Checkbox" & i).Caption = Mois & " " & Year(Now) - 1  
Next i  
End Sub


On peut aussi avoir une CheckBox dont le nom entier est une variable :
Me.Controls(ma_variable).Caption
Le tout est de comprendre qu'on interroge/nomme une CheckBox ou tout autre Control directement dans la partie objet.
Il faut bien différencier le nom du Control, qui n'apparait que pour le développeur dans les propriétés, et l'intitulé (Caption) qui lui est visible pour l'utilisateur de la userform.
Les deux peuvent être totalement différents, et heureusement.

Ensuite, pour tester la valeur d'une CheckBox, comme elle renvoie une valeur booléenne, pas le choix, il faut tester sa valeur.

[...]  
For x = 1 To 10  
[...] 
If Me.Controls("CheckBox" & x).Value = True Then  
[...]
Next x


Lermite222, je ne sais pass si c'est ce qu'expliquait ton tuto, mais comme je ne télécharge jamais quoi que ce soit sur les forum, je n'ai pas tout vu.
Messages postés
8700
Date d'inscription
dimanche 8 avril 2007
Statut
Contributeur
Dernière intervention
22 janvier 2020
1 103
Tu fais une grossière erreur en disant "A nom variable" c'est d'ailleurs pour cela que l'ont ne t'a pas compris.
En fait ce n'est pas le NOM que tu veux changer mais sont CAPTION (ce qui est vu par l'utilisateur).
Et j'espère que l'ont ne suivra pas l'exemple de code que tu met, il est... heuuu.
Enfin, puisque ça te convient.
Et a titre d'info, il n'y a rien à télécharger sur le forum, mes astuces sont mise sur une page perso dont je communique la clé.
A+
Messages postés
116
Date d'inscription
dimanche 14 septembre 2008
Statut
Membre
Dernière intervention
30 août 2012
28
par la commande

Me.Controls("CheckBox" & x).***

je fais bien appel à une checkbox dont le nom varie non ?

pour mon code, je me doute que c'est spécial rassure toi