VBA - checkbox à nom variable

Résolu/Fermé
Phoenellion Messages postés 116 Date d'inscription dimanche 14 septembre 2008 Statut Membre Dernière intervention 30 août 2012 - 15 déc. 2011 à 07:35
Phoenellion Messages postés 116 Date d'inscription dimanche 14 septembre 2008 Statut Membre Dernière intervention 30 août 2012 - 21 déc. 2011 à 00:49
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

pijaku Messages postés 12263 Date d'inscription jeudi 15 mai 2008 Statut Modérateur Dernière intervention 4 janvier 2024 2 744
15 déc. 2011 à 08:33
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...
0
lermite222 Messages postés 8702 Date d'inscription dimanche 8 avril 2007 Statut Contributeur Dernière intervention 22 janvier 2020 1 190
15 déc. 2011 à 10:37
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+
0
Phoenellion Messages postés 116 Date d'inscription dimanche 14 septembre 2008 Statut Membre Dernière intervention 30 août 2012 32
16 déc. 2011 à 11:50
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
0
pijaku Messages postés 12263 Date d'inscription jeudi 15 mai 2008 Statut Modérateur Dernière intervention 4 janvier 2024 2 744
16 déc. 2011 à 12:19
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.....
0
lermite222 Messages postés 8702 Date d'inscription dimanche 8 avril 2007 Statut Contributeur Dernière intervention 22 janvier 2020 1 190
Modifié par lermite222 le 16/12/2011 à 12:06
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.
0
lermite222 Messages postés 8702 Date d'inscription dimanche 8 avril 2007 Statut Contributeur Dernière intervention 22 janvier 2020 1 190
16 déc. 2011 à 12:16
Mais si tu tient absolument à des CheckBox tu peu t'inspirer de cette astuce en remplaçant les boutons par des ckeckBox.
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
lermite222 Messages postés 8702 Date d'inscription dimanche 8 avril 2007 Statut Contributeur Dernière intervention 22 janvier 2020 1 190
16 déc. 2011 à 12:28
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+
0
Phoenellion Messages postés 116 Date d'inscription dimanche 14 septembre 2008 Statut Membre Dernière intervention 30 août 2012 32
16 déc. 2011 à 13:08
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.
0
Phoenellion Messages postés 116 Date d'inscription dimanche 14 septembre 2008 Statut Membre Dernière intervention 30 août 2012 32
Modifié par Phoenellion le 16/12/2011 à 13:18
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 !!
0
pijaku Messages postés 12263 Date d'inscription jeudi 15 mai 2008 Statut Modérateur Dernière intervention 4 janvier 2024 2 744
16 déc. 2011 à 13:34
Je vous laisse lire ce tutos sur toutes sortes de contrôles et en particulier la listbox
Bonne continuation
0
lermite222 Messages postés 8702 Date d'inscription dimanche 8 avril 2007 Statut Contributeur Dernière intervention 22 janvier 2020 1 190
16 déc. 2011 à 13:47
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
0
Phoenellion Messages postés 116 Date d'inscription dimanche 14 septembre 2008 Statut Membre Dernière intervention 30 août 2012 32
16 déc. 2011 à 14:07
Merci !
0
lermite222 Messages postés 8702 Date d'inscription dimanche 8 avril 2007 Statut Contributeur Dernière intervention 22 janvier 2020 1 190
16 déc. 2011 à 13:44
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)
0
Phoenellion Messages postés 116 Date d'inscription dimanche 14 septembre 2008 Statut Membre Dernière intervention 30 août 2012 32
19 déc. 2011 à 02:11
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.

@+
0
Phoenellion Messages postés 116 Date d'inscription dimanche 14 septembre 2008 Statut Membre Dernière intervention 30 août 2012 32
Modifié par Phoenellion le 20/12/2011 à 23:37
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.
0
lermite222 Messages postés 8702 Date d'inscription dimanche 8 avril 2007 Statut Contributeur Dernière intervention 22 janvier 2020 1 190
20 déc. 2011 à 23:55
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+
0
Phoenellion Messages postés 116 Date d'inscription dimanche 14 septembre 2008 Statut Membre Dernière intervention 30 août 2012 32
Modifié par Phoenellion le 21/12/2011 à 00:49
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
0