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

Liste déroulante conditionnée

  • Initiateur de la discussion Initiateur de la discussion Marco33
  • 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 !

M

Marco33

Guest
Bonjour à tous ;
Je cherche à créer une liste déroulante (avec la fonction Validation de données), afin que l'utilisateur sélectionne le pilote (pour avoir l'orthographe exacte) qui a suivi une action.
Sauf qu'en fonction du type d'action, seuls certains pilotes peuvent suivre cette action. Inutile donc de proposer à l'utilisateur toute la liste complète des pilotes. Je souhaite simplement lui proposer les pilotes correspondants à ce type d'action.

J'ai une matrice (imposée) qui comporte les critères :
Action1 : Eric
Action1 : Marc
Action2 : Juien
Action2 : Fred
Action3 : Carole
Action1 : Franck

Donc si l'utilisateur déclare avoir fait une Action1, la liste déroulante, de la cellule juste à côté, doit lui proposer de sélectionner Eric, Marc ou Franck. 😎

J'ai essayé de faire ça avec une formule matricielle, mais je n'arrive pas à la valider par Ctrl+Shift+Enter.
{=SI((O4=B6:B154);E6:E154)}

Si quelqu'un pouvait m'aider ca serait super. J'ai fait une recherche mais n'arrive pas à trouver qqchose d'équivalent sur le Forum.🙁
 
Re : Liste déroulante conditionnée

Merci pour ta réponse. Effectivement j'avais déjà consulter cet exemple, mais malheureusement il ne correspond pas à mon besoin.
En effet, il nome les listes pour y faire référence ensuite. Or moi, les listes sont intégrées dans la base de données. J'ai une très grande liste d'action et des lignes qui changent de position sans arrêt.
Mais merci pour la réponse, quand même 😱

D'autres idées ??? 🙁
 
Re : Liste déroulante conditionnée

Bonjour Marco33, salut natorp,

La description du problème n'est pas du tout claire...

Marco, si vous voulez vraiment des réponses, déposez un fichier (allégé bien sûr).

A+
 
Re : Liste déroulante conditionnée

Si ça peut aider, voici un exemple du fichier.

Bien sûr que ça aide !

La macro dans le code de la feuille Suivi (clic droit sur l'onglet et Visualiser le code) :

Code:
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
Dim action$, d As Object, cel As Range, Liste$
Set Target = ActiveCell
If Not Intersect(Target, [B2:B65536]) Is Nothing Then
  Target.Validation.Delete
  action = Target.Offset(, -1)
  If action <> "" Then
    Set d = CreateObject("Scripting.Dictionary")
    For Each cel In Sheets("Liste").Range("A2", Sheets("Liste").[A65536].End(xlUp))
      If cel = action Then
        d(cel.Offset(, 2).Value) = cel.Offset(, 2).Value
        d(cel.Offset(, 3).Value) = cel.Offset(, 3).Value
      End If
    Next
    Liste = Join(d.Items, ",")
    If Liste <> "" Then Target.Validation.Add Type:=xlValidateList, Formula1:=Liste
  End If
End If
End Sub
Elle se déclenche quand on sélectionne une cellule en colonne B.

Fichier joint.

A+
 

Pièces jointes

Dernière édition:
Re : Liste déroulante conditionnée

Re,

Une autre solution.

La liste déroulante est créée (ou supprimée) en colonne B quand on modifie une cellule en colonne A :

Code:
Private Sub Worksheet_Change(ByVal Target As Range)
Dim d As Object, cel As Range, Liste$
Set Target = Intersect(Target, [A2:A65536], Me.UsedRange)
If Not Target Is Nothing Then
  For Each Target In Target
    Target.Offset(, 1).Validation.Delete
    If Target <> "" Then
      Set d = CreateObject("Scripting.Dictionary")
      For Each cel In Sheets("Liste").Range("A2", Sheets("Liste").[A65536].End(xlUp))
        If LCase(cel) = LCase(Target) Then 'la casse n'a pas d'importance
          d(cel.Offset(, 2).Value) = cel.Offset(, 2).Value
          d(cel.Offset(, 3).Value) = cel.Offset(, 3).Value
        End If
      Next
      Liste = Join(d.Items, ",")
      If Liste <> "" Then Target.Offset(, 1).Validation.Add Type:=xlValidateList, Formula1:=Liste
    End If
  Next
End If
End Sub
Fichier (2).

A+
 

Pièces jointes

Dernière édition:
Re : Liste déroulante conditionnée

Bonjour le forum,

C'est la version (1) qui paraît la meilleure solution.

On peut toutefois l'améliorer :

Code:
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
Dim action$, d As Object, cel As Range, Liste$
[B:B].Validation.Delete
If Not Intersect(ActiveCell, [B2:B65536]) Is Nothing Then
  action = LCase(ActiveCell.Offset(, -1))
  If action <> "" Then
    Set d = CreateObject("Scripting.Dictionary")
    For Each cel In Sheets("Liste").Range("A2", Sheets("Liste").[A65536].End(xlUp))
      If LCase(cel) = action Then 'la casse n'a pas d'importance
        d(cel.Offset(, 2).Value) = cel.Offset(, 2).Value
        d(cel.Offset(, 3).Value) = cel.Offset(, 3).Value
      End If
    Next
    Liste = Join(d.Items, ",")
    If Liste <> "" Then ActiveCell.Validation.Add Type:=xlValidateList, Formula1:=Liste
  End If
End If
End Sub
A+
 

Pièces jointes

Dernière édition:
Re : Liste déroulante conditionnée

Re,

Si l'on veut que les modifications en feuille Liste soient répercutées dans la liste en cours :

Code:
Private Sub Worksheet_Activate()
ListeValidation
End Sub

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
ListeValidation
End Sub

Private Sub ListeValidation()
Dim action$, d As Object, cel As Range, Liste$
[B:B].Validation.Delete
If Not Intersect(ActiveCell, [B2:B65536]) Is Nothing Then
  action = LCase(ActiveCell.Offset(, -1))
  If action <> "" Then
    Set d = CreateObject("Scripting.Dictionary")
    For Each cel In Sheets("Liste").Range("A2", Sheets("Liste").[A65536].End(xlUp))
      If LCase(cel) = action Then 'la casse n'a pas d'importance
        d(cel.Offset(, 2).Value) = cel.Offset(, 2).Value
        d(cel.Offset(, 3).Value) = cel.Offset(, 3).Value
      End If
    Next
    Liste = Join(d.Items, ",")
    If Liste <> "" Then ActiveCell.Validation.Add Type:=xlValidateList, Formula1:=Liste
  End If
End If
End Sub
Version (3).

A+
 

Pièces jointes

Re : Liste déroulante conditionnée

Merciii ! Effectivement nickel. J'ai pu la réadapté à mon fichier.
Par contre, dans certains cas les macros ne sont pas accessibles (sécurité du site) par l'utilisateur. Il n'y a vraiment pas moyen d'utiliser la fonction "validation de données" avec une formule à l'intérieur ? :-/
 
Re : Liste déroulante conditionnée

Bonjour Marco,

En fait c'est possible par formules 🙂

Mais il faut télécharger sur le web la macro complémentaire Morefunc, c'est gratuit.

C'est une bibliothèque de fonctions.

On y trouve la fonction MCONCAT qui permet de concatener des matrices.

Voyez le fichier (4) joint.

Nota : Morefunc peut être installée depuis Excel 95 jusqu'à Excel 2007.

J'ai essayé sans succès de l'installer sur Excel 2010.

Edit : plages dynamiques plage1 et plage2 en feuille Liste, c'est mieux.

A+
 

Pièces jointes

Dernière édition:
Re : Liste déroulante conditionnée

Bonjour Marco, le forum,

Ce n'était pourtant pas très compliqué, mais je manquais d'imagination 😡

Il n'y a pas du tout besoin de Morefunc...

Voyez cette version (6), avec formules matricielles.

Edit : plage1 et plage2 commencent en ligne 1, c'est plus simple.

A+
 

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
Assurez vous de marquer un message comme solution pour une meilleure transparence.

Discussions similaires

Réponses
1
Affichages
933
A
Réponses
11
Affichages
2 K
A
C
Réponses
2
Affichages
1 K
charlotte mouton
C
F
Réponses
18
Affichages
3 K
B
Réponses
3
Affichages
1 K
BEUBZIR
B
V
Réponses
4
Affichages
2 K
vincenteraptor
V
F
Réponses
5
Affichages
841
N
A
Réponses
8
Affichages
5 K
Amelieddm
A
B
Réponses
6
Affichages
892
B
B
Réponses
3
Affichages
2 K
Les cookies sont requis pour utiliser ce site. Vous devez les accepter pour continuer à utiliser le site. En savoir plus…