Selection button objet Dynamiquement via variable
Bonjour,
Avant de poser ma question je me dois de vous dire un GRAND merci pour ce super site web qui m'a vraiment appris a "coder" en VBA sur le tas.
J'arrive a la toute fin de mon projet et je sèche....
J'ai plusieurs bouton sur ma page (Case option d'Active X).
Je souhaite sélectionner chaque bouton a la suite en utilisant une boucle.
Leurs noms ont tous la même base (optionButton1, OptionButton2. ect...)
Donc je souhaite scripter de manière a ce qu'une action soit faisable sur chacun d'entre eux a la suite.
Quelque chose comme :
while Num_bouton < Total_button
Num_bouton = 1
OptionButton(Num_bouton).visible = True
Num_bouton = Num_bouton + 1
Wend
Bien évidement cela ne fonctionne pas.
J'ai aussi pensé a faire quelque chose du genre :
Button = "OptionButton" & Num_bouton
Button.visible = True
Bon la c'est sur que cela ne fonctionnera jamais puisque "visible" attaque une variable, mais bon il y a de l'idée...
Comment donc procéder pour sélectionner des objets dynamiquement ?
Merci a vous !
Bonjour,
Un exemple, à adapter évidemment :
Dim i As Integer
For i = 1 To ActiveSheet.Shapes.Count
ActiveSheet.Shapes("OptionButton" & i).Visible = True
Next iRapide, simple, net et précis.
Un grand merci Oyobran
Ca marche du tonner.
Bénie soit la commande ActiveSheet.Shapes.
Je me permets une question supplémentaire.
Je sais a présent sélectionner dynamiquement un bouton option mais j'ai énormément de mal a interagir avec.
En effet avant de les sélectionner je souhait les créer dynamiquement, ce code fonctionne :
With OLEObjects.Add(ClassType:="Forms.OptionButton.1", _
Link:=False, _
DisplayAsIcon:=False, _
Left:=18.75, _
Top:=6.75, _
Width:=108, _
Height:=19.5).Select
End WithDonc la je creer et je selectionne mon petit bouton option.
Le hic, c'est que ce code ne permet pas de renseigner Caption (Texte affiché) le nom de la box ou encore son groupe.
En effet, même si j'ai selectionner le bouton je n'arrive pas a y injecter les infos.
Le seul moyen que j'ai trouvé est de créer une variable et de l'appeler de la sorte :
Dim Bouton(180) As Variant
Set Bouton(1) = OLEObjects.Add(ClassType:="Forms.OptionButton.1", _
Link:=False, _
DisplayAsIcon:=False, _
Left:=18.75, _
Top:=6.75, _
Width:=108, _
Height:=19.5)
Bouton(1).Object.Caption = "C2E"
Bouton(1).Object.GroupName = "Group1"Donc en gros avant ".caption" je dois indiquer la cible.
Sauf que j'ai l'intention de générer entre 2 et 360 boutons, c'est trop de variable.
Il me faut un moyen d’interagir avec ma box avec "with" sans variable, pour le problème de la cible sauriez vous s'il existe quelque chose a incruster dans le "With" pour designer cette box, un truc équivalent a "Thisworksheet" mais pour les objets ?.
Encore merci a vous.
Il faudrait voir ce que tu veux vraiment faire, il faudra de toute façon appeler les boutons un par un pour leur affecter un caption, quoi qu'il en soit. Il y a 181 éléments dans ton tableau, la numérotation commence à 0, sinon :
Dim Bouton(1 to 180) As VariantSi tu pouvais stocker les caption dans un autre tableau, tu pourrais avoir un truc du genre :
Sub Macro1()
Dim Boutons(1 To 180) As Variant
Dim i As Integer
For i = 1 To UBound(Boutons)
Set Boutons(i) = ActiveSheet.OLEObjects.Add(ClassType:="Forms.OptionButton.1", _
Link:=False, _
DisplayAsIcon:=False, _
Left:=18.75, _
Top:=6.75 + (28 * (i - 1)), _
Width:=108, _
Height:=19.5)
Boutons(i).Object.Caption = Legendes(i)
'Boutons(i).Object.Caption = "Légende n° " & i
Next i
End Subavec Legendes que tu pourrais remplir à partir d'une plage de cellules, mais bon, pas assez d'éléments pour te répondre convenablement.
Encore merci pour ta réponse, c'est bien plus que convenable.
Navrés si je n'ai pas été asses claire, je vais faire un effort ^^
J'ai bien compris les indications, mettons cela en pratique:
Donc je veux créer dynamiquement des boutons en fonction d'une variable Total_sites (2 par site a vrai dire, un "Gauche" et un "droite").
Comme tu le dit je dois les appeler un par un donc autant fonctionner avec des variables.
Ainsi, en m'appuyant sur les pistes que tu as eu la gentillesse de me communiquer j'ai opté pour le code suivant:
Dim num_site as Integer
Dim Total_sites as Integer
Dim V_Offset as Integer
Dim Bouton(360) As Variant
Dim techno(180) As String
Public Sub Creation_button()
'################################ Creation de boutons
Total_sites = 5
num_site = 1
V_offset = 0
Dim PosG As Integer 'Paramettres Position boutons
Dim PosH As Integer
Dim Hauteur As Integer
Dim Longueur As Integer
While num_site <= Total_sites
With Range("E20").Offset(V_offset) 'ici je prépare les variables pour la position des boutons option en fonction des cellules
PosG = .Left
PosH = .Top
Hauteur = .Height
Longueur = .Width
End With
Range("B20").Offset(V_offset) = "Site" & num_site 'Ca c'est le texte a gauche de chaque boutons
'On creer un bouton "Gauche" dans un tableau Bouton()
Set Bouton(Num_bouton) = OLEObjects.Add(ClassType:="Forms.OptionButton.1", _
Link:=False, _
DisplayAsIcon:=False, _
Left:=PosG, _
Top:=PosH, _
Width:=Longueur, _
Height:=Hauteur)
Bouton(Num_bouton).Object.Caption = "C2E"
Bouton(Num_bouton).Object.GroupName = "Group" & num_site
With Range("G20").Offset(V_offset)
PosG = .Left
PosH = .Top
Hauteur = .Height
Longueur = .Width
End With
'On creer un bouton "Droite " dans un tableau Bouton()
Set Bouton(Num_bouton) = OLEObjects.Add(ClassType:="Forms.OptionButton.1", _
Link:=False, _
DisplayAsIcon:=False, _
Left:=PosG, _
Top:=PosH, _
Width:=Longueur, _
Height:=Hauteur)
Bouton(Num_bouton).Object.Caption = "DSLE"
Bouton(Num_bouton).Object.GroupName = "Group" & num_site
num_site = num_site + 1
V_offset = V_offset + 2
Wend
'Donc dans tableau, les chiffres impaire sont des boutons "gauche" et paire sont "droite".
'------------------------------- Fin Creation de bouton C2E & DSLE --------------
End Sub
Public Sub ButtonExecuter_Click()
'####### A l'appuie du bouton executer on scan les boutons pour les stocker dans un autre tableau Techno() ######
num_site = 1
Tampon = 1
While num_site <= Total_sites
If Bouton(Tampon) = True Then
Techno(num_site) = "Gauche"
End If
Tampon = Tampon + 1
If Bouton(Tampon) = True Then
'If ActiveSheet.OLEObjects("OptionButton" & Tampon).Value = True Then
Techno(num_site) = "Droite"
End If
num_site = num_site + 1
Tampon = Tampon + 1
Wend
End subLa création de bouton fonctionne correctement, super 8)
Cependant lors du deuxième sub, quand on scan les variable, elles sont vides.
Les variable ne sont-elles pas sensé stocker les informations des boutons ?
D'un autre coté, j'imagine que je ne cible par le champ "Value" de ma Variant Buton(), mais "If Buton(tampon).value = true" ne veux rien dire.
J'ai essayé de fonctionner différemment en scannant les bouton plutôt que les variables avec le code :
If ActiveSheet.Shapes("OptionButton" & Tampon).Value = True Then
' Code
End IfMais cela ne fonctionne pas. J'ai le droit a une erreur, l'orthographe ne doit pas être bonne.
Une idée d'amélioration ?