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
2 réponses
-
Bonjour,
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,
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 Sub
Ou 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 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 :
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