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 i

Rapide, 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 With

Donc 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 Variant

Si 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 Sub

avec 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 sub

La 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 If

Mais cela ne fonctionne pas. J'ai le droit a une erreur, l'orthographe ne doit pas être bonne.

Une idée d'amélioration ?

Rechercher des sujets similaires à "selection button objet dynamiquement via variable"