Peut-on simplifier Sub checkbox1, 2, ..n_click () en checkbox+i?
Fermé
thomanneca
-
Modifié par thomanneca le 4/02/2014 à 21:16
pijaku Messages postés 12263 Date d'inscription jeudi 15 mai 2008 Statut Modérateur Dernière intervention 4 janvier 2024 - 6 févr. 2014 à 08:09
pijaku Messages postés 12263 Date d'inscription jeudi 15 mai 2008 Statut Modérateur Dernière intervention 4 janvier 2024 - 6 févr. 2014 à 08:09
A voir également:
- Peut-on simplifier Sub checkbox1, 2, ..n_click () en checkbox+i?
- I;per;2qble ✓ - Forum Linux / Unix
- 2 ecran pc - Guide
- I trema - Forum Windows
- Peut on avoir 2 comptes instagram sur le même téléphone - Guide
- Word numéro de page 1/2 - Guide
2 réponses
f894009
Messages postés
17205
Date d'inscription
dimanche 25 novembre 2007
Statut
Membre
Dernière intervention
19 octobre 2024
1 709
5 févr. 2014 à 08:08
5 févr. 2014 à 08:08
Bonjour,
exemple: a adapter pour les 24 checkbox's
exemple: a adapter pour les 24 checkbox's
Public Num As Byte
Private Sub CheckBox1_Click()
Num = 1
Call lecture_Checkbox
End Sub
Private Sub CheckBox2_Click()
Num = 2
Call lecture_Checkbox
End Sub
Private Sub CheckBox3_Click()
Num = 3
Call lecture_Checkbox
End Sub
Private Sub CheckBox4_Click()
Num = 4
Call lecture_Checkbox
End Sub
Sub lecture_Checkbox()
For i = 1 To 4
If Me("CheckBox" & i) Then
Range(Range("numcentrale").Cells(ComboBox1.ListIndex + 1, 1).Address).Offset(0, i + 1).Value = 8
Else
Range(Range("numcentrale").Cells(ComboBox1.ListIndex + 1, 1).Address).Offset(0, i + 1).Value = ""
End If
Next i
End Sub
pijaku
Messages postés
12263
Date d'inscription
jeudi 15 mai 2008
Statut
Modérateur
Dernière intervention
4 janvier 2024
2 751
Modifié par pijaku le 6/02/2014 à 08:19
Modifié par pijaku le 6/02/2014 à 08:19
Salut,
Il existe deux solutions pour ton cas.
La première consiste à placer un bouton, l'événement déclencheur sera alors un clic sur le bouton et non plus un clic sur un CheckBox. L'effet escompté n'est malheureusement plus le même.
Pour cela, le code du CommandButton est :
Cependant, ce code ne réagira pas au clic sur les CheckBox.
Pour faire exactement ce que tu souhaites, il te faut utiliser une classe, grâce aux modules de classe VBA.
Je suis parti de cette astuce de Lermite222.
Il te faut :
- 1 UserForm contenant 24 CheckBox,
- Les propriétés Name de tes 24 CheckBox doivent être de la forme CheckBox1, ..., CheckBox12, ..., CheckBox21, etc...
- 1 Module standard,
- 1 Module de Classe appelé Classe1
Les différents codes sont :
Dans le module standard :
Dans le Module de Classe (appelé Classe1) :
Dans le module de l'UserForm :
Ne te restes plus qu'à tester.
La "simplification" ici réside dans le fait que tu ne doive plus multiplier les événements.
Tu dis...
Edit : J'ai oublié de prendre en compte la ComboBox1..... Pfff... Je reviens
Edit2 : Codes modifiés. Merci de tester en réel.
Cordialement,
Franck
Il existe deux solutions pour ton cas.
La première consiste à placer un bouton, l'événement déclencheur sera alors un clic sur le bouton et non plus un clic sur un CheckBox. L'effet escompté n'est malheureusement plus le même.
Pour cela, le code du CommandButton est :
Private Sub CommandButton1_Click() Dim i As Byte For i = 1 To 24 If Me.("CheckBox" & i) Then Range(Range("numcentrale").Cells(ComboBox1.ListIndex + 1, 1).Address).Offset(0, i + 1).Value = 8 Else Range(Range("numcentrale").Cells(ComboBox1.ListIndex + 1, 1).Address).Offset(0, i + 1).Value = "" End If Next i End Sub
Cependant, ce code ne réagira pas au clic sur les CheckBox.
Pour faire exactement ce que tu souhaites, il te faut utiliser une classe, grâce aux modules de classe VBA.
Je suis parti de cette astuce de Lermite222.
Il te faut :
- 1 UserForm contenant 24 CheckBox,
- Les propriétés Name de tes 24 CheckBox doivent être de la forme CheckBox1, ..., CheckBox12, ..., CheckBox21, etc...
- 1 Module standard,
- 1 Module de Classe appelé Classe1
Les différents codes sont :
Dans le module standard :
Option Explicit Public CollectC As Collection Public intCombo As Integer Public Sub InitCheck(Usf As UserForm) Dim Ctrl As Control, i As Byte Dim CO As Classe1 Set CO = Nothing Set CollectC = New Collection For i = 1 To 5 Set Ctrl = Usf.Controls("CheckBox" & i) Set CO = New Classe1 Set CO.CheckBoxGroup = Ctrl CollectC.Add CO Next i End Sub
Dans le Module de Classe (appelé Classe1) :
Option Explicit Public WithEvents CheckBoxGroup As MSForms.CheckBox 'Evenement Click sur les CheckBox. Private Sub CheckBoxGroup_Click() If CheckBoxGroup.Value Then Range(Range("numcentrale").Cells(intCombo + 1, 1).Address).Offset(0, CInt(Right(CheckBoxGroup.Name, 1)) + 1).Value = 8 Else Range(Range("numcentrale").Cells(intCombo + 1, 1).Address).Offset(0, CInt(Right(CheckBoxGroup.Name, 1)) + 1).Value = "" End If End Sub
Dans le module de l'UserForm :
Option Explicit Private Sub ComboBox1_Change() If ComboBox1 <> "" Then intCombo = CInt(ComboBox1.ListIndex) Else intCombo = 0 End Sub Private Sub UserForm_Initialize() 'Remplissage de la Combobox 'code de remplissage à placer ici InitCheck Me End Sub
Ne te restes plus qu'à tester.
La "simplification" ici réside dans le fait que tu ne doive plus multiplier les événements.
Tu dis...
Edit : J'ai oublié de prendre en compte la ComboBox1..... Pfff... Je reviens
Edit2 : Codes modifiés. Merci de tester en réel.
Cordialement,
Franck
Modifié par pijaku le 5/02/2014 à 10:51
Pourquoi ne pas utiliser ta variable Num?
Comme ceci :
Ou plus simple encore :
5 févr. 2014 à 09:18
C'etait mon idee de depart, et j'ai ete merturbe par le code avec la boucle ce qui fait que Num ne sert a rien avec une boucle et la boucle ne sert a rien si nous utilisons Num comme dans votre exemple
5 févr. 2014 à 09:21
On peut se tutoyer non? Depuis le temps...
J'aime bien ton mot "merturber". Je vais m'en resservir, il est très expressif.
5 févr. 2014 à 10:38
merturber: perturber puissance au moins 100, tellement c'est "destabilisant"
5 févr. 2014 à 10:52
A voir aussi si représente bien l'adresse d'un Range... Mais là, il faudrait que l'auteur revienne...