XL 2013 classe combo cascade qui s'oublie

patricktoulon

XLDnaute Barbatruc
Bonjour a tous
de bon matin a la fraîche j'ai une énigme a résoudre

j'ai une toute petite classe combobox en cascade (exemple assez succin) qui oublie après la première sélection dans les 3 combo
j'explique je lance le userform il rempli la première appelle la classe pour l'event combobox
je sélectionne dans la première OK , la 2d OK , la 3eme OK
je reviens sur une des précédente et là ça plante
je contrôle pour quoi en débogage et j'ai mon tableau d'object combobox ("Combosoeurs") vide

je suis perplexe ai-je oublié quelque chose :oops:
me serais je levé trop tot ;)
dans mon userform j'ai 3 comb (cmb1,cmb2,cmb3)
le code
on se moque pas je sais la méthode sans doublons avec le( .value/.listindex-1) est archaïque ;);)😅
VB:
Dim cls As New Classecomb

Private Sub UserForm_Activate()
    Dim tbl
    tbl = Range("tableau1")
    cls.initcombo Me, Range("tableau1").Value

    With cmb1
        For i = 1 To UBound(tbl)
            .Value = tbl(i, 1)
            If .ListIndex = -1 Then .AddItem tbl(i, 1)
        Next
        .Value = ""
    End With
End Sub

le code ma classe
VB:
Public WithEvents cmb As MSForms.ComboBox
Dim cl(1 To 3) As New Classecomb
Public Combosoeurs
Public T
Public indexo&
Public Function initcombo(uf, tabl)
    Dim toutes(1 To 3), i&, z&, T
  
    For i = 1 To 3
        Set cl(i).cmb = uf.Controls("cmb" & i)
        Set toutes(i) = uf.Controls("cmb" & i)
        cl(i).T = tabl
        cl(i).indexo = i
    Next
    For z = 1 To 3: cl(z).Combosoeurs = toutes: Next
End Function



Private Sub cmb_Click()
    If indexo <= 2 Then 'on arrete la gestion du clik a la 2d
        With Combosoeurs(indexo + 1)
            .Clear
            For a = 1 To UBound(T)
                .Value = T(a, indexo + 1)
                If T(a, indexo) = cmb.Value Then If .ListIndex = -1 Then .AddItem T(a, indexo + 1)
            Next
            .Value = ""
        End With
    End If
End Sub

l'erreur
demo.gif
 

Pièces jointes

  • combocascade demo.xlsm
    20.1 KB · Affichages: 6
Solution
Non j'ai et tu peux tester
mis la Variable " toutes " en Object
VB:
 Dim toutes(1 To 3) As Object, i&, z&, T
si tu supprimes le "As Object" ca ne fonctionne plus !
et il y a bien un rapport entre "Combosoeurs" et "toutes" ?
puisque
Code:
   For z = 1 To 3: cl(z).Combosoeurs = toutes: Next
halloween est passé Lol
Jean marie

patricktoulon

XLDnaute Barbatruc
Bonjour @ChTi160
oui mais je sais faire autrement là je veux vraiment comprendre pourquoi combosoeurs se vides
ce qui m’intéresse ce n'est pas d'arriver a faire une cascade mais de comprendre le problème

c'est pour toi en plus que je le fait 😂🤣comme exemple classe simple avec sub object comme les textboxs

sinon j'y arrive tres bien : je fait ça et ça fonctionne très bien
VB:
Option Explicit
Public WithEvents cmb As MSForms.ComboBox
Dim cl(1 To 3) As New Classecomb
Public Combosoeurs
Public T
Public indexo&
Public usf As Object
Public Function initcombo(uf, tabl)
    Dim toutes(1 To 3), i&, z&, T

    For i = 1 To 3
        Set cl(i).cmb = uf.Controls("cmb" & i)
        Set toutes(i) = uf.Controls("cmb" & i)
        cl(i).T = tabl
        cl(i).indexo = i
        Set cl(i).usf = uf
    Next
    For z = 1 To 3: cl(z).Combosoeurs = toutes: Next
End Function



Private Sub cmb_Click()
    Dim a&
    If indexo <= 2 Then    'on arrete la gestion du clik a la 2d
        'With Combosoeurs(indexo + 1)
        With usf.Controls("cmb" & indexo + 1)
            .Clear
            For a = 1 To UBound(T)
                .Value = T(a, indexo + 1)
                If T(a, indexo) = cmb.Value Then If .ListIndex = -1 Then .AddItem T(a, indexo + 1)
            Next
            .Value = ""
        End With
    End If
End Sub

demo.gif
 

patricktoulon

XLDnaute Barbatruc
oui si tu veux
j'utilise usf.controls("..." & indexo
usf qui est une variable object de l'instance de la classe
là je veux vraiment comprendre pourquoi avec combosoeur ça ne fonction qu'une fois

je t'ai fait aussi un exemple Hover button(survol button) aussi dans le même principe
demo.gif
 

ChTi160

XLDnaute Barbatruc
Re
les procédure utilisées :
VB:
Private Sub UserForm_Activate()
    Dim tbl
    tbl = Range("tableau1")
    cls.initcombo Me, Range("tableau1").Value   
For i = 1 To UBound(tbl, 1)
    With cmb1
            .Value = tbl(i, 1)
            If .ListIndex = -1 Then .AddItem tbl(i, 1)
    End With
Next
     cmb1.Value = "": cmb2.Value = "": cmb3.Value = ""
End Sub
Code:
Option Explicit
Public WithEvents cmb As MSForms.ComboBox
Dim cl(1 To 3) As New Classecomb
Public Combosoeurs
Public T
Public indexo&
Public Function initcombo(uf, tabl)
    Dim toutes(1 To 3) As Object, i&, z&, T  
    For i = 1 To 3
        Set cl(i).cmb = uf.Controls("cmb" & i)      
        Set toutes(i) = uf.Controls("cmb" & i)
        cl(i).T = tabl
        cl(i).indexo = i
    Next
    For z = 1 To 3: cl(z).Combosoeurs = toutes: Next
End Function
'******************************'
Private Sub cmb_Click()
    Dim a&  
    If indexo <= 2 Then 'on arrete la gestion du clik a la 2d
       Combosoeurs(3).Clear
        With Combosoeurs(indexo + 1)
        .Clear
         For a = 1 To UBound(T)
             .Value = T(a, indexo + 1)
                If T(a, indexo) = cmb.Value Then If .ListIndex = -1 Then .AddItem T(a, indexo + 1)
            Next
            .Value = ""
        End With
    End If
End Sub
à voir donc Lol
J'attends ton nouveau Fichier exemple ! Merci
Jean marie
 

ChTi160

XLDnaute Barbatruc
Non j'ai et tu peux tester
mis la Variable " toutes " en Object
VB:
 Dim toutes(1 To 3) As Object, i&, z&, T
si tu supprimes le "As Object" ca ne fonctionne plus !
et il y a bien un rapport entre "Combosoeurs" et "toutes" ?
puisque
Code:
   For z = 1 To 3: cl(z).Combosoeurs = toutes: Next
halloween est passé Lol
Jean marie
 

Discussions similaires