Checkbox générées dynamiquement et événements (click)

OCamarade Messages postés 4 Date d'inscription vendredi 9 octobre 2009 Statut Membre Dernière intervention 18 octobre 2009 - 14 oct. 2009 à 12:46
OCamarade Messages postés 4 Date d'inscription vendredi 9 octobre 2009 Statut Membre Dernière intervention 18 octobre 2009 - 18 oct. 2009 à 14:41
Bonjour à tous,

Je suis actuellement sur un projet VBA et je suis confronté au problème suivant : je cherche à faire du traitement d'événement sur des checkbox générées dynamiquement dans un userform. Je sais que l'on a accès à la fonction nomCheckbox_Click() si celle-ci est ajoutée manuellement. En cherchant ici et là sur internet, j'ai trouvé comment créer dynamiquement ces checkbox, voire de gérer le _click(). Voici le code que j'ai réalisé

For i =  0 To nbValeurInt - 1
     left = 10 + (Val(Sheets("Dictionnaire importe").Range("E" & i + valeurDebut).Value) - 1) * 50
     'Ajout d'un label   
     Set label = Me.Controls.Add("Forms.Label.1")
     With label
          .Name = "Label" & Sheets("Dictionnaire importe").Range("B" & i + valeurDebut).Value
          .Caption = Sheets("Dictionnaire importe").Range("C" & i + valeurDebut).Value
          .left = left
          .top = top
          .Height = 20
          .Width = 150
     End With
     
     ' Ajout de checkbox
     Set checkbox = Me.Controls.Add("Forms.CheckBox.1")
     With checkbox
          .Name = "Checkbox" & Sheets("Dictionnaire importe").Range("B" & i + valeurDebut).Value
          .Caption = ""
          .left = left + 150
          .top = top
          .Height = 12.75
          .Width = 10.5
          .Value = True
     End With

     ' Création de la méthode _Click en chaine de caractères
     laMacro = "Sub Checkbox" & Sheets("Dictionnaire importe").Range("B" & i + valeurDebut).Value & "_Click()" & vbCrLf
     laMacro = laMacro & "MsgBox()" & vbCrLf
     laMacro = laMacro & "End Sub"
     
     ' Ajout de la méthode au codeModule
     With ThisWorkbook.VBProject.VBComponents(ActiveSheet.Name).CodeModule
          x = .CountOfLines + 1
          .InsertLines x, laMacro
     End With

     top = top + 25
Next i


Et à chaque fois que j'appuie sur le bouton qui me lance le userform, j'ai droit à l'erreur suivante :
"Erreur d'exécution '9' : l'indice n'appartient pas à la sélection"

Voici en complément le code qui fait justement appel au userform :

Private Sub modifElemCoutBouton_Click()
    Dim nbValeurs As Integer
    Dim passe As Boolean
    
    nbValeurs  = Val(Sheets("Parametrecalcul").Range("F5").Value)
    bon = False
    
    For i = 0 To nbValeurs - 1
        If Sheets("Dictionnaire importe").Range("B" & i + 3).Value = "CHARGINT" Then
            bon = True
            valeurDebut = i + 3
        End If
        If Val(Sheets("Dictionnaire importe").Range("E" & i + 3).Value) = 1 And Sheets("Dictionnaire importe").Range("B" & i + 3).Value <> "CHARGINT" And Sheets("Dictionnaire importe").Range("B" & i + 3).Value <> "COUTTRAIT" Then
            bon = False
        End If
        If bon = True Then
            UserForm1.Controls.Item("Checkbox" & Sheets("Dictionnaire importe").Range("B" & i + 3).Value).Value = True
        End If
    Next i
    UserForm1.Show
End Sub


Le traitement s'arrête sur cette instruction :
UserForm1.Controls.Item("Checkbox" & Sheets("Dictionnaire importe").Range("B" & i + 3).Value).Value = True


Quelqu'un aurait-il une idée du pourquoi une telle erreur ??!

Merci d'avance de votre aide.

2 réponses

cs_Joh76 Messages postés 47 Date d'inscription dimanche 16 mars 2008 Statut Membre Dernière intervention 14 octobre 2009 3
14 oct. 2009 à 20:51
Bonjour,

Je dirais que le contrôle que tu veux sélectionner n'existe pas dans ton userform1.
Il faudrait mettre un point d'arrêt sur cette instruction puis ajouter

debug.print "Checkbox" & Sheets("Dictionnaire importe").Range("B" & i + 3).Value

juste avant cette ligne afin de voir dans la fenêtre exécution le nom du contrôle appelé.

cdlt
0
OCamarade Messages postés 4 Date d'inscription vendredi 9 octobre 2009 Statut Membre Dernière intervention 18 octobre 2009
18 oct. 2009 à 14:41
Bonjour Joh76,

En étant passé par le débuggueur, j'ai pu voir que l'erreur vient surtout de l'ajout du code de la fonction _click au code du module, cad la portion suivante :

With ThisWorkbook.VBProject.VBComponents(ActiveSheet.Name).CodeModule
     x = .CountOfLines + 1
     .InsertLines x, laMacro
End With


Ce qui expliquerait pourquoi le contrôle n'existe pas, vu que ça bug quand je l'ajoute au code du module.
0
Rejoignez-nous