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
Bonjour,

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:

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
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
0
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 5/02/2014 à 10:51
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
0
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 à 09:18
Bonjour, pijaku

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
0
pijaku Messages postés 12263 Date d'inscription jeudi 15 mai 2008 Statut Modérateur Dernière intervention 4 janvier 2024 2 751
5 févr. 2014 à 09:21
Salut,

On peut se tutoyer non? Depuis le temps...

J'aime bien ton mot "merturber". Je vais m'en resservir, il est très expressif.
0
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 à 10:38
Re,

merturber: perturber puissance au moins 100, tellement c'est "destabilisant"
0
pijaku Messages postés 12263 Date d'inscription jeudi 15 mai 2008 Statut Modérateur Dernière intervention 4 janvier 2024 2 751
5 févr. 2014 à 10:52
Oui.
A voir aussi si
Range("numcentrale").Cells(ComboBox1.ListIndex + 1, 1).Address
représente bien l'adresse d'un Range... Mais là, il faudrait que l'auteur revienne...
0
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
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
0