Comment accéder à plusieurs toggle button dans une frame ActiveX
Bonjour à tous et merci par avance pour l'aide que vous m'apportez.
Evidemment, je suis un débutant...
Je cherche à créer un groupe de contrôles ToggleButton mutuellement exclusifs dans une frame ActiveX sachant que je ne souhaite pas utiliser de Userform car je veux que mes éléments soient intégrés dans ma feuille de calcul.
J'ai trouvé une réponse sur le site microsoft :
http://support.microsoft.com/kb/166252
Tout fonctionne à merveille mais uniquement avec un UserForm.
Même si je suis sûr que la réponse est ultra simple, je bloque sur le code du module si je fais une frame ActiveX sans UserForm !.
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
| 'Variable to hold name of ToggleButton that was clicked.
Public Clicked As String
Sub ExclusiveToggleButtons()
Dim Toggle As Control
'Loop through all of the ToggleButtons on Frame1
For Each Toggle In UserForm1.Frame1.Controls
'If Name of ToggleButton matches name of ToggleButton
'that was clicked...
If Toggle.Name = clicked Then
'...select the button
Toggle.Value = True
Else
'...deselect the button
Toggle.Value = False
End If
Next
End Sub |
En d'autres termes, je ne sais pas accéder à ma frame ActiveX qui n'est pas dans un Userform.
Pouvez-vous m'aider ?
De plus je ne sais pas où insérer ce bout de code. Toujours dans un module ?
Et où insérer le code des event MouseUp des ToggleButton dans mon cas ?
Merci !
Création dynamique de pseudo groupes de ToggleButtons s'excluant mutuellement
Bonjour,
Citation:
Je pense que, dans la logique MicroSoft, la faisabilité de construire des ToggleButton est la même que celle des OptionButton. Je regarde prochainement.
Je suis arrivé à un résultat concluant mais cela a été difficultueux et la solution est plutôt tarabiscotée (j'ai été obligé de passer par un module de classe et n'ai pas réussi à faire plus simple). Pour le fun, je la fais paraître.
Si cela n'est pas trop rébarbatif, vous pouvez atteindre le but initial que vous vous étiez fixé.
1) copiez le code suivant dans un module standard
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66
| Public myCollection As Collection
Sub PlageDesQuestions()
Dim Reponses As Variant
'### Du nombre de réponses dépend le nombre de ToggleButton
'### Adapter le Array du variant ci-dessous en fonction des réponses
Reponses = Array("Je n'aime pas", "J'aime un peu", "J'aime", "J'aime beaucoup")
'###
Dim C As Range
If TypeName(Selection) <> "Range" Then Exit Sub
Application.ScreenUpdating = False
Call DeleteToggle(AfficherResultats:=False)
For Each C In Selection
If C <> "" Then Call MakeToggleButton(C, Reponses)
Next C
Application.ScreenUpdating = True
'--- Nécessité de différer l'initialisation ---
Application.OnTime Now + TimeValue("00:00:00"), "InitToggle"
End Sub
Sub DeleteToggle(AfficherResultats As Boolean)
Dim OL As OLEObject
For Each OL In ActiveSheet.OLEObjects
If TypeOf OL.Object Is MSForms.ToggleButton Then
If AfficherResultats Then OL.TopLeftCell = OL.Object.Value
OL.Delete
End If
Next OL
End Sub
Sub MakeToggleButton(CelluleQuestion As Range, Reponses As Variant)
Dim R As Range
Dim i&
Dim OL As OLEObject
Dim TG As MSForms.ToggleButton
'---
For i& = 0 To UBound(Reponses)
Set R = CelluleQuestion.Offset(0, i& + 1)
Set OL = ActiveSheet.OLEObjects.Add(ClassType:="Forms.ToggleButton.1", Link:=False, DisplayAsIcon:=False, _
Left:=R.Left + 2, Top:=R.Top + 2, Width:=R.Width - 4, Height:=R.Height - 4)
OL.Placement = xlMoveAndSize
Set TG = OL.Object
'--- Le nom du ToggleButton servira, dans la classe, à identifier le pseudo groupe (ex : GR5_CT4_ID)
'--- ainsi que le nombre d'items dans le pseudo groupe (ex : 4 est le nombre situé entre _CT [count] et _ID)
TG.Name = "GR" & R.Row & "_CT" & UBound(Reponses) + 1 & "_ID" & i& + 1
TG.Caption = Reponses(i&)
Next i&
End Sub
Sub InitToggle()
Dim OL As OLEObject
Dim TG As MSForms.ToggleButton
Dim myClasse As cls_GroupeToggleButton
'---
Set myClasse = Nothing
Set myCollection = New Collection
For Each OL In ActiveSheet.OLEObjects
If TypeOf OL.Object Is MSForms.ToggleButton Then
Set TG = OL.Object
Set myClasse = New cls_GroupeToggleButton
Set myClasse.myToggleButton = TG
myCollection.Add myClasse
End If
Next OL
End Sub |
2) créez un module de classe, renommez le "cls_GroupeToggleButton" puis copiez le code suivant
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34
| Public WithEvents myToggleButton As MSForms.ToggleButton
Private Sub myToggleButton_Click()
Dim OL As OLEObject
Dim TG As MSForms.ToggleButton
Dim boolValue As Boolean
Dim A$
Dim B$
Dim ItemsCount&
Dim i&
'---
boolValue = myToggleButton.Value
With myToggleButton
'--- Nombre de ToggleButtons du pseudo groupe (ex : GR5_CT4_ID4 le nombre est 4 situé entre _CT et _ID) ---
A$ = Mid(.Name, InStr(.Name, "T") + 1)
ItemsCount& = CLng(Mid(A$, 1, InStr(A$, "_") - 1))
'--- Suffixe du nom des ToggleButtons du même pseudo groupe (ex : GR5_CT4_ID4 donne GR5_CT4_ID)
B$ = Mid(.Name, 1, InStr(1, .Name, "D"))
End With
'--- Par défaut, tous les ToggleButtons du pseudo groupe à False ---
For i& = 1 To ItemsCount&
Set OL = ActiveSheet.OLEObjects(B$ & i&)
Set TG = OL.Object
TG.Value = False
TG.BackColor = RGB(255, 102, 153) 'couleur du fonds
Next i&
'--- Le ToggleButton qui a été cliqué ---
If boolValue Then
With myToggleButton
.Value = boolValue
.BackColor = vbGreen
End With
End If
End Sub |
3) tapez quelques questions dans plusieurs cellules d'une feuille (ex : "A5:A10"), sélectionnez ces cellules puis lancez la macro "PlageDesQuestions"
Je mets le classeur exemple en pièce jointe pour faciliter.