Liste déroulante cascade avec espaces

Bonjour à tous,

Je me permets de poster ma problématique car je n'ai pas trouvé de solution suite à mes recherches.

Vous trouverez ci-joint un fichier Excel avec un exemple très simple afin d'exposer ma problématique le plus clairement possible.

Je souhaite réaliser des listes déroulantes en cascade (rien de bien sorcier jusqu'ici).

Mais je souhaiterais ne pas avoir "_" (le tiret du 8) entre les mots mais des espaces.

Le problème si je mets des espaces c'est que je ne peux pas renommer pas plage de cellule pour la liste déroulante N+1.

Vous trouverez des explications complémentaires dans le fichier joins.

En résumé, je souhaiterais avoir exactement la même chose que je vous propose (les liste déroulantes sont câblées) mais sans les "_" dans le choix 2.

N'hésitez pas si je n'ai pas été assez clair.

Et si cette problématique a déjà été traitée (et que je ne l'ai pas trouvée) je m'en excuse par avance.

Merci pour vos suggestions,

Anthony

Bonjour Anthony,

une toute autre façon de faire

et plus simple pour les données d'entrée (à mon sens)

Bonjour Steelson,

Merci pour le retour rapide.

Ça répond parfaitement à ce que je voulais et en effet c'est très simple.

Par contre, je ne trouve pas comment se fait le lien entre la liste déroulante et la table où on retrouve les différentes solutions?

J'ai bien vu qu'on est bien en "Liste" dans les validations de données mais comment il fait pour proposer les valeurs souhaitées?

Merci par avance.

Cordialement,

Anthony

Bonjour,

c'est la macro qui le fait par cette instruction

Target.Validation.Add xlValidateList, Formula1:=Join(dico.keys, ",")

certes la macro est un peu "pointue" (en toute modestie) mais en fait elle est générique, il suffit de déclarer le nombre de niveaux et identifier les zone1, zone2, zone3 etc.

Bonjour Steelson,

En effet, la macro est assez "pointue" ^^

Avant de revenir vers vous j'ai passé quelques heures à essayer de décrypter le code et à l'adapter à mes besoin mais sans résultats.

Pour ne pas vous faire perdre trop de temps, serait-il possible d'avoir un exemple avec les 2 modifications suivantes:

  • un choix 4 possible (j'ai complété la table en feuille 1 avec un choix 4 (correspond aux initiales du choix 3)
  • démarrer la liste déroulante en [B10]

J'espère ne pas trop vous en demander mais je pense qu'en comparant les 2 codes, je vais plus facilement m'y retrouver afin d'adapter au mieux à mes besoins.

Merci par avance.

Cordialement,

Antony

Bonjour Anthony,

Il n'y a que 2 choses à faire :

  • définir la zone "zone4" en D2
  • mettre en haut du code Const nbZones = 4

si tu n'as pas touché au reste du code, c'est bon !

nota :

1- tu peux déplacer zone1, zone2, zone3 et zone4 où tu veux sur ta feuille

2- si tu souhaites construire un tableau et non seulement quelques zones, c'est un autre programme

Bonjour Steelson,

Merci beaucoup, ça répond parfaitement à ma demande.

Je me permets de pousser un peu plus ma demande car en appliquant ton code je me "heurte" à 2 autres problématiques (quand j'essaie d'appliquer à ma solution finale).

(J'ai développé un peu l'exemple, l'objectif final est que l’utilisateur du fichier puisse faire les choix des listes déroulantes des cellules L1 à L15.

J'ai rajouter des "phrases" (un peu bidon) car dans ma solution finale j'ai des choix assez long).

1- Comment laisser le choix de L1 à L15? (je ne peux pas renommer "zone1" plusieurs cellules).

2- Comment afficher le choix en entier (quand on clic sur la liste déroulante, si la phrase est trop longue elle est masquée)?

J'avais pensé à fusionner les cellules mais le code ne fonctionne plus en cas de fusion.

N'hésite pas à me dire si ma demande n'est pas assez claire?

Merci par avance,

Anthony

En effet, je m'y attendais un peu (d'où ma question -nota 2- plus haut).

Ici on ne peut renseigner qu'une seule cellule par niveau de cascade. L'intérêt a contrario est qu'on les place où on veut sur la feuille.

Pour en faire davantage, j'ai réalisé un autre programme que voici ...

Note bien la constante au début du programme, et l'affectation des noms zone1 etc. en-tête du tableau.

J'ai du adapter un poil le programme car tes données ne commençaient pas en haut de la feuille

Const nbZones = 4

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
Dim data() As Variant
Dim choix() As Variant
Dim dico As Object
Dim i&, iData&, iZone&, plus&

    If Target.Count <> 1 Then Exit Sub
    plus = Target.Row - Range("zone1").Row
    If plus <= 0 Then Exit Sub
    If plus > 15 Then Exit Sub

    ReDim choix(1 To nbZones)
    For i = 1 To nbZones
        choix(i) = Range("zone" & i).Offset(plus, 0).Value
        If Not Intersect(Range("zone" & i).Offset(plus, 0), Target) Is Nothing Then
            data = [TabData].Value
            Set dico = CreateObject("Scripting.Dictionary")
            For iData = 1 To UBound(data)
                flag = True
                If i > 1 Then
                    For iZone = 1 To i - 1
                        If choix(iZone) <> CStr(data(iData, iZone)) Then flag = False
                    Next
                End If
                If flag Then dico(CStr(data(iData, i))) = ""
            Next iData
            If dico.Count > 0 Then
                Target.Validation.Delete
                Target.Validation.Add xlValidateList, Formula1:=Join(dico.keys, ",")
            End If
            Exit For
        End If
    Next i
End Sub

Private Sub Worksheet_Change(ByVal Target As Range)

    If Target.Count <> 1 Then Exit Sub
    plus = Target.Row - 1
    If plus = 0 Then Exit Sub

    For i = 1 To nbZones
        If Not Intersect(Range("zone" & i).Offset(plus, 0), Target) Is Nothing Then
            If i < nbZones Then
                Application.EnableEvents = False
                For iZone = i + 1 To nbZones
                    With Range("zone" & iZone).Offset(plus, 0)
                        .Value = ""
                        .Validation.Delete
                    End With
                Next
                Application.EnableEvents = True
            End If
            Exit For
        End If
    Next

End Sub

Bonjour,

im zSaisie, NbNiv
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
    Set zSaisie = Range("B2:E16")
    NbNiv = 4
    If Not Intersect(zSaisie, Target) Is Nothing And Target.Count = 1 Then
      TblBD = [TabData].Value
      Set d1 = CreateObject("Scripting.Dictionary")
      nivCourant = Target.Column - zSaisie.Column + 1
      Dim Tmp(): ReDim Tmp(1 To nivCourant)
      For k = 1 To nivCourant - 1
        Tmp(k) = Target.Offset(, -(nivCourant - k))
      Next k
      For i = 1 To UBound(TblBD)
         témoin = True
         For k = 1 To nivCourant - 1
            If TblBD(i, k) <> Tmp(k) Then témoin = False: Exit For
         Next k
         If témoin Then d1(TblBD(i, nivCourant)) = ""
       Next i
       If d1.Count > 0 Then
           temp = Join(d1.keys, ",")
           Target.Validation.Delete
           If temp <> "" Then Target.Validation.Add xlValidateList, Formula1:=temp
        End If
    End If
 End Sub

Private Sub Worksheet_Change(ByVal Target As Range)
     If Not Intersect(zSaisie, Target) Is Nothing And Target.Count = 1 Then
         nivCourant = Target.Column - zSaisie.Column + 1
         If nivCourant < NbNiv Then
           Application.EnableEvents = False
           Target.Offset(, 1).Resize(, NbNiv - nivCourant).Validation.Delete
           Target.Offset(, 1).Resize(, NbNiv - nivCourant) = ""
           Application.EnableEvents = True
         End If
     End If
End Sub

Boisgontier

Bonjour Boisgontier

Il doit manquer le D en début de première ligne.

Tout regrouper dans une seule plage zSaisie, c'est pas mal non plus ! D'ailleurs on ne comprend pas vraiment pourquoi les différentes zones sont éloignées de plusieurs cellules les unes des autres.

Michel

Bonjour Steelson et Boisgontier,

Merci pour vos retours, c'est exactement ce que je souhaitais.

Juste un dernier petit détail (très pointilleux), voyez-vous un autre moyen (que élargir les colonnes ou fusionner les cellules) pour afficher la phrase complète quand on clique sur la liste déroulante?

Si c'est très complexe et chronophage, ne vous embêtez pas je peux réorganiser mon fichier de façon à pouvoir élargir les colonnes.

Merci par avance,

Anthony

Je déconseille la fusion de cellules, cela engendre toujours des problèmes un jour ou l'autre.

Bonjour,

Merci beaucoup pour cette solution, elle répond parfaitement à mes besoins, à partir de votre fichier "liste déroulante en cascade tableau et plages paramétrées", je parviens à faire exactement ce que je veux.

Cependant, j'ai un problème : lorsque je fais exactement la même procédure dans un autre fichier (plus gros, avec beaucoup de feuilles, de TCD...) en recopiant bien la macro, les noms de zones et autre, cela fonctionne jusqu'à ce que le ferme. Quand je tente de le rouvrir, il dit qu'il a un "problème de contenu". Si je le répare, il me sort bien tout le contenu, mais je perd mes mises en pages, mes recherchev, mes TCD... C'est très frustrant car cela fonctionne à merveille jusqu'à ce que je finisse par fermer mon fichier et le rouvrir. Avez-vous une solution à mon problème ?

Merci d'avoir pris le temps de me lire.

Sbeh

Wahou,

Bonjour Sbeh

sujet un peu pointu

aurais-tu un extrait du fichier pour investiguer ? éventuellement en mp ...

n'hésite pas à ouvrir un autre topic car le sujet n'est pas forcément lié

Rechercher des sujets similaires à "liste deroulante cascade espaces"