Peut-on simplifier Sub checkbox1, 2, ..n_click () en checkbox+i?
thomanneca
-
pijaku Messages postés 13513 Date d'inscription Statut Modérateur Dernière intervention -
pijaku Messages postés 13513 Date d'inscription Statut Modérateur Dernière intervention -
Bonjour,
J'ai 24 checkbox et j'aimerais simplifier les codes, est-ce possible?
Peut-on simplifier le code qui suit comme tel :
Peut-on intégrer For i = 1 to 24 d'une manière ou d'une autre ?
Merci beaucoup
J'ai 24 checkbox et j'aimerais simplifier les codes, est-ce possible?
Peut-on simplifier le code qui suit comme tel :
Private Sub checkboxi_click()
For i = 1 To 24
If CheckBoxi.Value = True 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
End Sub
Peut-on intégrer For i = 1 to 24 d'une manière ou d'une autre ?
Merci beaucoup
A voir également:
- Peut-on simplifier Sub checkbox1, 2, ..n_click () en checkbox+i?
- Supercopier 2 - Télécharger - Gestion de fichiers
- I love pdf avis ✓ - Forum PDF
- Peut on avoir 2 comptes instagram sur le même téléphone - Guide
- Paris multiple 2/6 explication ✓ - Forum Loisirs / Divertissements
- 2 ecran pc - Guide
2 réponses
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
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
Pourquoi ne pas utiliser ta variable Num?
Comme ceci :
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() If Me.("CheckBox" & Num) Then Range(Range("numcentrale").Cells(ComboBox1.ListIndex + 1, 1).Address).Offset(0, Num + 1).Value = 8 Else Range(Range("numcentrale").Cells(ComboBox1.ListIndex + 1, 1).Address).Offset(0, Num + 1).Value = "" End If End SubOu plus simple encore :
Private Sub CheckBox1_Click() Call lecture_Checkbox 1 End Sub Private Sub CheckBox2_Click() Call lecture_Checkbox 2 End Sub Private Sub CheckBox3_Click() Call lecture_Checkbox 3 End Sub Private Sub CheckBox4_Click() Call lecture_Checkbox 4 End Sub Sub lecture_Checkbox(Num As Byte) If Me.("CheckBox" & Num) Then Range(Range("numcentrale").Cells(ComboBox1.ListIndex + 1, 1).Address).Offset(0, Num + 1).Value = 8 Else Range(Range("numcentrale").Cells(ComboBox1.ListIndex + 1, 1).Address).Offset(0, Num + 1).Value = "" End If End SubC'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
On peut se tutoyer non? Depuis le temps...
J'aime bien ton mot "merturber". Je vais m'en resservir, il est très expressif.
merturber: perturber puissance au moins 100, tellement c'est "destabilisant"
A voir aussi si
Range("numcentrale").Cells(ComboBox1.ListIndex + 1, 1).Addressreprésente bien l'adresse d'un Range... Mais là, il faudrait que l'auteur revienne...