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

2 réponses

  1. f894009 Messages postés 17417 Date d'inscription   Statut Membre Dernière intervention   1 717
     
    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
    1. pijaku Messages postés 13513 Date d'inscription   Statut Modérateur Dernière intervention   2 773
       
      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
    2. f894009 Messages postés 17417 Date d'inscription   Statut Membre Dernière intervention   1 717
       
      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
    3. pijaku Messages postés 13513 Date d'inscription   Statut Modérateur Dernière intervention   2 773
       
      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
    4. f894009 Messages postés 17417 Date d'inscription   Statut Membre Dernière intervention   1 717
       
      Re,

      merturber: perturber puissance au moins 100, tellement c'est "destabilisant"
      0
    5. pijaku Messages postés 13513 Date d'inscription   Statut Modérateur Dernière intervention   2 773
       
      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
  2. pijaku Messages postés 13513 Date d'inscription   Statut Modérateur Dernière intervention   2 773
     
    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