Un p'tit coup de main sur une liste de validation

Fchris

XLDnaute Occasionnel
Bonjour à toutes et à tous,

J'ai besoin d'un petit peu d'aide pour finaliser une liste de validation en cascade.

Ma liste fonctionne sur 4 niveaux. En cherchant sur le forum, j'ai réussi à monter ma validation sur les 3 premiers niveaux, mais je bloque sur le 4e. en effet, celui-ci dépend directement de deux conditions différentes, et je n'arrive pas à le mettre en oeuvre.

Voici les niveaux :
1 - Direction
2- Service / Région (dépend de la direction)
3- Secteur (dépend de Service / Région)
4- Centre (dépend de Service et de Secteur) => c'est là que je bloque.

Ci-joint un petit fichier d'exemple avec la table. Un exemple sur la Région 1 comprenant 3 secteurs et des centres dans chacun d'entre eux.

Merci d'avance à tous de votre aide.

Fchris
 

Pièces jointes

  • Table Base Arbre.zip
    18.6 KB · Affichages: 30

wilfried_42

XLDnaute Barbatruc
Re : Un p'tit coup de main sur une liste de validation

Bonjour

Menu Insertion / Nom / Definir
nom : centre
la formule :
Code:
=DECALER(Table!$P$3;EQUIV(Table!$K$5;DECALER(Table!$O$1;EQUIV(Table!$J$5;Table!$N:$N;0)-1;0;NB.SI(Table!$N:$N;Table!$J$5));0);0;NB.SI(DECALER(Table!$O$1;EQUIV(Table!$J$5;Table!$N:$N;0)-1;0;NB.SI(Table!$N:$N;Table!$J$5));Table!$K$5))
valider

Menu donnees / Validation
choisir liste
formule : =centre


edit : Bonjour Tibo, finalement je commence à avoir un doute sur la comprehension apres t'avoir lu quoique ca à l'air de se ressembler dans la finalité en tout cas ta methode est plus simple que ma formule
Bonne journée
 
Dernière édition:

Tibo

XLDnaute Barbatruc
Re : Un p'tit coup de main sur une liste de validation

Bonjour,

J'ai ouvert ton fichier et j'ai un peu de mal à tout comprendre.
Codifier tes centres en ajoutant le n° de Région et la lettre du Secteur.

Puis faire un tri de tes centres avec cette nouvelle codification.

Puis utiliser la même méthode avec INDIRECT en ayant nommé tes centres.

Si problème persiste, reviens avec plus de précisions.

Bon app

@+

Edit : salut Wilfried, je vois que tu a davantage compris que moi.

à Chris de nous dire ce qu'il en est

@+
 

BOISGONTIER

XLDnaute Barbatruc
Repose en paix
Re : Un p'tit coup de main sur une liste de validation

Bonjour,

La technique classique des listes en cascade utilise les noms de champs et la fonction =Indirect()
La maintenance des noms de champs en cas d'ajout/suppression peut devenir fastidieuse lorsque le nombre de champs devient important.
En outre, les listes en cascade avec Indirect() ne supportent pas les champs dynamiques.

Exemple avec BD 4 niveaux en PJ:

JB
Formation Excel VBA JB
 

Pièces jointes

  • ListeCascade4Niv.xls
    46.5 KB · Affichages: 87

Fchris

XLDnaute Occasionnel
Re : Un p'tit coup de main sur une liste de validation

Bonjour à tous,
Wilfried, Tibo, JB, le forum,

JB, ta solution à l'air de fonctionner en merveille, mais là ça dépasse totalement mes compétences en vba et je suis incapable de le retranscrir sur mon fichier.

Wilfried, ta solution semble être la bonne, j'ai juste une erreur dans la formule. Lorsque je créé la liste, il me dit que la source semble erronée et je n'ai pas de liste déroulante dans la cellule. J'ai eu le même souci sur les niveaux précédents, et en fait il s'agit du caractère "espace" qu'il faut substituer par "_". J'ai pu le faire sur les autres niveaux, mais là dans ta formule, je ne sais pas où placer cette indication.

En tous les cas, merci de votre aide

FChris
 

Fchris

XLDnaute Occasionnel
Re : Un p'tit coup de main sur une liste de validation

non, il ne s'agit pas des noms de feuilles, mais des noms des centres. Tu vois, tu as par exemple 004 Alésia. L'espace entre 004 et Alésia ne fonctionne pas dans les listes, il faut subsituer par "_"

Enfin en même temps, ce n'est qu'une supposition, car j'ai eu le même problème, mais ce n'est peut être pas ça du tout. En tous cas, après validation, il me dit source de données erronée, et pas de sélection dans la liste.....

Merci de ce que tu peux faire...
 

wilfried_42

XLDnaute Barbatruc
Re : Un p'tit coup de main sur une liste de validation

re:

ok j'ai vu, j'avais reglé le probleme durant mes tests et j'ai oublié de le mentionner, c'est de ma faute :eek:

dans ta table : tu as : secteur A or dans ta selection tu as : A secteur A
Modifie soit ta selection, soit ta table

A secteur A n'étant pas trouvé, la liste de validation perd ses références
 

Fchris

XLDnaute Occasionnel
Re : Un p'tit coup de main sur une liste de validation

Ok ça y est, j'y suis. Bien vu Wilfried, je n'avais pas fait attention, désolé.

Ca fonctionne nickel, exactement ce que je voulais. :)

Merci beaucoup de votre aide ;)

bonne journée et à bientôt

Fchris
 

Fchris

XLDnaute Occasionnel
Re : Un p'tit coup de main sur une liste de validation

Bonjour à tous,

JB je reviens sur le fil avec la macro que tu m'as envoyé en exemple.

Je l'ai intégrée sur mon fichier, et cela semble fonctionner, j'ai juste un souci sur la façon de nommer les champs. A chaque fois, j'obtiens 'Source de données erronée'. Je n'arrive pas à nommer mes listes et à les réutiliser.

Peux-tu jeter un oeil sur le fichier joint et essayer de voir ce qui cloche ? Toi ou quelqu'un d'autre d'ailleurs qui pourrait m'aider...

Merci par avance

Fchris
 

Pièces jointes

  • Table Base Arbre test macro.zip
    19 KB · Affichages: 18

BOISGONTIER

XLDnaute Barbatruc
Repose en paix
Re : Un p'tit coup de main sur une liste de validation

Bonjour,

Erreur dans nom de champ (Table au lieu de Base)

J'ai ajouté le positionnemnt sur le premier élément.

Code:
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
  If Not Intersect([A2:A2], Target) Is Nothing And Target.Count = 1 Then
    Sheets("table").[L2] = Empty
    Sheets("table").[A1:d1000].AdvancedFilter Action:=xlFilterCopy, _
      CriteriaRange:=Sheets("table").[L1:L2], CopyToRange:=Sheets("table").[F1], Unique:=True
  End If
  If Not Intersect([B2:B2], Target) Is Nothing And Target.Count = 1 Then
     Sheets("table").[L2] = Target.Offset(0, -1)
     Sheets("table").[M2] = Empty
     Sheets("table").[A1:d81].AdvancedFilter Action:=xlFilterCopy, _
        CriteriaRange:=Sheets("table").[L1:M2], CopyToRange:=Sheets("table").[G1], Unique:=True
  End If
  If Not Intersect([C2:C2], Target) Is Nothing And Target.Count = 1 Then
    Sheets("table").[L2] = Target.Offset(0, -2)
    Sheets("table").[M2] = Target.Offset(0, -1)
    Sheets("table").[N2] = Empty
    Sheets("table").[A1:d81].AdvancedFilter Action:=xlFilterCopy, _
      CriteriaRange:=Sheets("table").[L1:N2], CopyToRange:=Sheets("table").[H1], Unique:=True
   End If
   If Not Intersect([d2:d2], Target) Is Nothing And Target.Count = 1 Then
    Sheets("table").[L2] = Target.Offset(0, -3)
    Sheets("table").[M2] = Target.Offset(0, -2)
    Sheets("table").[N2] = Target.Offset(0, -1)
    Sheets("table").[O2] = Empty
    Sheets("table").[A1:d81].AdvancedFilter Action:=xlFilterCopy, _
      CriteriaRange:=Sheets("table").[L1:O2], CopyToRange:=Sheets("table").[I1], Unique:=True
   End If
End Sub

Private Sub Worksheet_Change(ByVal Target As Range) ' positionnement sur premier élément
  Application.EnableEvents = False
   If Not Intersect([A2:A2], Target) Is Nothing And Target.Count = 1 Then
     Sheets("table").[L2] = Target
     Sheets("table").[M2] = Empty
     Sheets("table").[A1:d1000].AdvancedFilter Action:=xlFilterCopy, _
        CriteriaRange:=Sheets("table").[L1:M2], CopyToRange:=Sheets("Table").[G1], Unique:=True
     Target.Offset(0, 1) = Sheets("table").Range("region")(1)
  End If
  If Not Intersect([B2:B2], Target) Is Nothing And Target.Count = 1 Then
      Sheets("Table").[L2] = Target.Offset(0, -1)
      Sheets("Table").[M2] = Target
      Sheets("Table").[N2] = Empty
      Sheets("Table").[A1:d1000].AdvancedFilter Action:=xlFilterCopy, _
        CriteriaRange:=Sheets("Table").[L1:N2], CopyToRange:=Sheets("table").[H1], Unique:=True
      Target.Offset(0, 1) = Sheets("Table").Range("secteur")(1)
  End If
    If Not Intersect([C2:C2], Target) Is Nothing And Target.Count = 1 Then
      Sheets("Table").[L2] = Target.Offset(0, -2)
      Sheets("Table").[M2] = Target.Offset(0, -1)
      Sheets("Table").[N2] = Target
      Sheets("Table").[O2] = Empty
      Sheets("Table").[A1:d1000].AdvancedFilter Action:=xlFilterCopy, _
        CriteriaRange:=Sheets("Table").[L1:O2], CopyToRange:=Sheets("table").[I1], Unique:=True
      Target.Offset(0, 1) = Sheets("Table").Range("centre")(1)
  End If

  Application.EnableEvents = True
End Sub




JB
 

Pièces jointes

  • DV4NiveauxPremElem.zip
    20.9 KB · Affichages: 28

Fchris

XLDnaute Occasionnel
Re : Un p'tit coup de main sur une liste de validation

Merci beaucoup JB, je n'avais pas vu effectivement en recopiant ta formule que j'avais oublié de changer le nom de la feuille, pourtant je l'ai regardé 10 000 fois pour chercher où était le problème !!! :eek:

Et le positionnement sur le 1er élément, c'est tout simplement génial. :D

Merci beaucoup de ton aide.

bonne journée et à bientôt

Fchris
 

Discussions similaires

Statistiques des forums

Discussions
312 361
Messages
2 087 630
Membres
103 616
dernier inscrit
Simone98