Ceci est une page optimisée pour les mobiles. Cliquez sur ce texte pour afficher la vraie page.

Liste de validation qui marche pas

  • Initiateur de la discussion Initiateur de la discussion chasseur44
  • Date de début Date de début

Boostez vos compétences Excel avec notre communauté !

Rejoignez Excel Downloads, le rendez-vous des passionnés où l'entraide fait la force. Apprenez, échangez, progressez – et tout ça gratuitement ! 👉 Inscrivez-vous maintenant !

chasseur44

XLDnaute Occasionnel
Bonjour à tous
J'ai des listes de validations imbriquées (4 niveaux) dans un userform !
Les trois premières marchent pas la 4 ème ?
et comment les rendre inactive (les comboBox) s'il n'y a pas de données ?
Merci de votre aide
Je joint un exemple
 

Pièces jointes

Re : Liste de validation qui marche pas

Bonjour
Je reporte d'habitude la complexité de ce problème vers des modules de services facile à utiliser dans l'userform et qu'on ne retouche jamais.
Voulez vous que j'en équipe votre classeur ?
À +
 
Re : Liste de validation qui marche pas

Je vais chercher par curiosité.
Mais d'abord ma solution.

P.S. votre erreur se situerait au niveau de ...And c.Offset(, 1) = Me.ComboBox3 dans Sub ComboBox3_Change.
Ce serait plutôt c.Offset(, 2)

Cordialement.
 

Pièces jointes

Dernière édition:
Re : Liste de validation qui marche pas

Prenez le comme une fourniture monolithique toute faite. Vous n'auriez pas cette impression si vous ne pouviez accéder à son contenu, et le code dans l'userform (à part l'astuce pour obtenir -1 ou 0 selon qu'un nombre est supérieur ou non à 1) est plutôt simple à comprendre, non ?

Je pense avoir identifié votre erreur, voir édit poste précédent.
 
Dernière édition:
Re : Liste de validation qui marche pas

Salut chasseur44, Dranreb🙂, le Forum

Ton fichier actualisé en retour avec des plages nommées

Bernard, Moi je serais intéressé 🙂 Toujours prêt à voir de nouvelles fonctions

EDITION:
Arfff... Moi et ma lenteur désespérante...😱 je regarde ton fichier Bernard et te remercie 🙂

Bonne Journée
 

Pièces jointes

Dernière édition:
Re : Liste de validation qui marche pas

Mais je le prend comme cela mais c'est plus le reste que je maîtrise pas ! et je trouvais le début de ma solution assez simple (quand je dis ma solution ! une que j'ai reprise sur ce site !) et je ne sais pas ou je me suis planté !
 
Re : Liste de validation qui marche pas

Salut Dull et Merci mais ca ne marche pas comme il faut si je prend en exemple
Niv1 Tete de Di...
Niv2 DRH C...
Niv3 ETA....
Le niv 4 devrait me proposer 8 choix et non 2
 
Re : Liste de validation qui marche pas

et je ne sais pas ou je me suis planté !
P.S. votre erreur se situerait au niveau de ...And c.Offset(, 1) = Me.ComboBox3 dans Sub ComboBox3_Change.
Ce serait plutôt c.Offset(, 2)
Votre solution assez simple...
Comme vous voudrez.
Moi je trouve agréable de ne s'occuper de rien, aucune boucle, juste dire ce qu'on veut synthétiser dans un dictionnaire arborescent fabriqué par un module spécialisé souple au briefing, et simplement puiser ensuite dans sa production.
Cordialement.
 
Dernière édition:
Re : Liste de validation qui marche pas

Re le Fil

Heu...Bernard les Dolicranes sont fournit avec le code... 🙂 Belle bête mais encore loin de comprendre la quintessence de cette merveille, je garde précieusement le fichier et essayerais de décortiquer pas à pas quant j'aurais une peu plus de temps... et de neurones actifs 🙂

Encore merci de partager ton travail

Bonne Journée
 
Re : Liste de validation qui marche pas


J'ai fait la modi mais pas mieux (next sans for ?)
 
Re : Liste de validation qui marche pas

Re re le fil

Effectivement je n'avais remarqué ce détail c'est parce que tu as des cellules vides dans tes listes pour que cela fonctionne il faut mettre un 0 par exemple et ta liste sera formée
voici une nouvelle mouture avec gestion des Zéro

Bonne Journée
 

Pièces jointes

Re : Liste de validation qui marche pas

J'ai fait la modi mais pas mieux (next sans for ?)
C'est surmonté de la citation de mon apologie pour ma solution. J'en déduis qu'elle le concerne et non la correction de votre erreur. DictionnArbo nécessite la référence "Microsoft Scripting Runtime" qui offre des liaisons directes et non tardives vers les Dictionary, lesquels deviennent des types d'objets connus ne nécessitant plus de CreateObject, et offrant une assistance en proposant leur méthodes et propriétés dans des listes à la frappe du code.
Si ça n'a rien à voir avec le fond du problème, joignez vos essais infructueux de l'adapter ailleurs s'il y a lieu.

Dull, tu a évidemment le droit de plonger dans le code pour l'analyser alors voici une version plus commentée du moulin central :
VB:
Private Function SousDict(ByVal C As Long) As Dictionary ' (Récursif)
Dim Lignes() As Long, N As Long, ArgC As Variant, ArgR As Variant
On Error GoTo Erreur
Set SousDict = New Dictionary
If C < CMax Then ' Si ce n'est pas le dictionnaire de la dernière colonne qu'on est en train de construire :
   Do: ArgC = TabArgs(L, C): Arg(C) = ArgC: Typ(C) = VarType(ArgC) ' Note chaque sous-clé courante pour les futurs tests de ruptures de séquence.
      SousDict.Add Key:=ArgC, Item:=SousDict(C + 1) ' Affecte à cette sous-clé le sous dictionnaire de la colonne suivante …            ICI APPEL RÉCURSIF
      Loop Until Rupt < C ' … jusqu'à rupture de séquence sur une colonne précédente (il est alors forcément complet) voire sur 0 si tout est fini.
Else ' On est en train de construire le dictionnaire de la dernière colonne, celui des listes de lignes, une pour chaque dernière sous-clé.
   ReDim Lignes(1 To 512) As Long
   Do ' Niveau dictionnaire, tant que le niveau de rupture n'est pas inférieur à C, qui est donc ici CMax, la dernière colonne.
      ArgC = TabArgs(L, C): Arg(C) = ArgC: Typ(C) = VarType(ArgC): N = 0 ' Note l'argument courant pour les tests de ruptures
      Do ' Niveau sous-clé, tant que le niveau de rupture est supérieur à C, c'est à dire pas de rupture car c'est un doublon.
         If N >= UBound(Lignes) Then ReDim Preserve Lignes(1 To (N \ 64 + 1) * 64) As Long
         N = N + 1: Lignes(N) = L ' Note la ligne dans la table en construction.
         If TIdx.Actif Then ' Si on n'était pas encore au dernier élément indexé, on demande le numéro du suivant et on cherche la rupture par rapport …
            L = TIdx.Suivant ' … à tous les Arg(1 à CMax) notés aussi bien dans les appelant récursifs (< CMax) qu'ici plus haut (= CMax, donc = C).
            For Rupt = 1 To CMax: ArgR = TabArgs(L, Rupt)
               If VarType(ArgR) <> Typ(Rupt) Then Exit For   ' Il y a rupture si la nouvelle sous-clé n'est plus du même type de variant.
               If ArgR <> Arg(Rupt) Then Exit For ' Il y a évidemment rupture si la nouvelle sous-clé n'a plus la même valeur.
               Next Rupt ' Si on va jusqu'au bout de la boucle, c'est encore un doublon et Rupt se retrouve = CMax + 1
         Else:      Rupt = 0: End If ' Si on était sur le dernier, tous les Loop Until Rupt < C devront se terminer dans tous les appels récursifs.
         Loop Until Rupt <= C ' Niveau sous-clé terminé s'il y a une rupture quelconque.
      ReDim Preserve Lignes(1 To N) As Long ' Ajustement de la table des lignes qu'on vient de construire au strict nécessaire.
      SousDict.Add Key:=ArgC, Item:=Lignes ' Et son ajout comme Item au dictionnaire, sous-clé courante toujours encore notée quoique ancienne maintenant.
      Loop Until Rupt < C ' Niveau dicionnaire terminé si la rupture est à un niveau inférieur.
   End If
Exit Function ' Rend la main soit à DictionnArbo si C = 1, soit à l'appelant récursif si C > 1, finalisant son
              ' propre SousDict.Add Key:=ArgC, Item:=SousDict(C + 1) qui est le Sous-dictionnaire qu'on vient d'élaborer !
Erreur: MsgBox Err.Description: Stop: Resume
End Function
À +
 
Dernière édition:
Re : Liste de validation qui marche pas

Bonjour,

Voir PJ

Code:
Dim f
Private Sub UserForm_Initialize()
  Set f = Sheets("dir")
  Set mondico = CreateObject("Scripting.Dictionary")
  For Each c In Range(f.[A2], f.[A65000].End(xlUp))
    mondico(c.Value) = ""
  Next c
  Me.ComboBox1.List = mondico.keys
End Sub

Private Sub ComboBox1_click()
  Set mondico = CreateObject("Scripting.Dictionary")
  For Each c In Range(f.[A2], f.[A65000].End(xlUp))
     If c = Me.ComboBox1 Then mondico(c.Offset(, 1).Value) = ""
  Next c
  Me.ComboBox2.List = mondico.keys
  Me.ComboBox2.ListIndex = -1
  Me.ComboBox3.ListIndex = -1
End Sub

Private Sub ComboBox2_click()
   Set mondico = CreateObject("Scripting.Dictionary")
   For Each c In Range(f.[A2], f.[A65000].End(xlUp))
     If c = Me.ComboBox1 And c.Offset(, 1) = Me.ComboBox2 And c.Offset(, 2).Value <> "" Then _
         mondico(c.Offset(, 2).Value) = ""
   Next c
   Me.ComboBox3.Enabled = (mondico.Count > 0)
   Me.ComboBox4.Enabled = (mondico.Count > 0)
   Me.ComboBox3.List = mondico.keys
   Me.ComboBox3.ListIndex = -1
   Me.ComboBox4.ListIndex = -1
End Sub

Private Sub ComboBox3_click()
   Set mondico = CreateObject("Scripting.Dictionary")
   For Each c In Range(f.[A2], f.[A65000].End(xlUp))
     If c = Me.ComboBox1 And c.Offset(, 1) = Me.ComboBox2 And _
        c.Offset(, 2) = Me.ComboBox3 And c.Offset(, 3).Value <> "" Then
         mondico(c.Offset(, 3).Value) = ""
     End If
   Next c
   Me.ComboBox4.Enabled = (mondico.Count > 0)
   Me.ComboBox4.List = mondico.keys
   Me.ComboBox4.ListIndex = -1
End Sub

JB
 

Pièces jointes

Dernière édition:
- Navigue sans publicité
- Accède à Cléa, notre assistante IA experte Excel... et pas que...
- Profite de fonctionnalités exclusives
Ton soutien permet à Excel Downloads de rester 100% gratuit et de continuer à rassembler les passionnés d'Excel.
Je deviens Supporter XLD

Discussions similaires

Réponses
40
Affichages
2 K
  • Question Question
Microsoft 365 Liste de choix...
Réponses
8
Affichages
326
Réponses
6
Affichages
265
Les cookies sont requis pour utiliser ce site. Vous devez les accepter pour continuer à utiliser le site. En savoir plus…