XL 2016 Liste sous condition

ynx69

XLDnaute Junior
Bonjour à tous,

J'ai une question à poser mais n'arrive à trouver de réponse...

Dans le fichier ci joint je dispose d'un tableau avec : Le nom et les etudes de chaque individu.

Je souhaiterais que pour les personnes ayant plusieurs diplome, qu'une liste déroulante s'affiche en pour me permettre de selectionner le diplome que je souhaite.

A l'inverse pour les personnes n'ayant qu'un diplome, je souhaite que la cellule etude affiche directement leur diplome.

Pourriez-vous m'aider ?

Merci pour votre aide
 

Fichiers joints

JHA

XLDnaute Barbatruc
Bonjour à tous,

Un essai avec la fonction decaler()
Code:
=DECALER($I$7;EQUIV($B$5;$I$8:$I$11;0);1;;4)
JHA
 

Fichiers joints

youky(BJ)

XLDnaute Barbatruc
Bonjour à tous,
Ceci pour le fun, c'est avec macro et 2 controls listbox dans la feuille
Pour tester il faut Activer le contenu ….activer les macros
Bruno
 

Fichiers joints

JHA

XLDnaute Barbatruc
Bonjour à tous,

Une petite amélioration pour mettre la bonne longueur de la liste avec une colonne supplémentaire.

JHA
 

Fichiers joints

job75

XLDnaute Barbatruc
Bonjour ynx69, JHA, Bruno,

Fichier joint avec cette macro dans le code de Feuil1 :
Code:
Private Sub Worksheet_Change(ByVal Target As Range)
Dim P As Range, Q As Range, c As Range, n%
Set P = [B5:C5]: Set Q = [I8:I11] 'à adapter
If Intersect(Target, P(1)) Is Nothing Then Exit Sub
P(2).Validation.Delete
Set c = Q.Find(P(1), , xlValues)
If c Is Nothing Then P(2) = "": Exit Sub
n = Application.CountA(c(1, 2).Resize(, 4))
If n = 1 Then
    P(2) = c(1, 2)
Else
    P(2) = ""
    P(2).Validation.Add xlValidateList, Formula1:="=" & c(1, 2).Resize(, n).Address
    P(2).Select
End If
End Sub
A+
 

Fichiers joints

ynx69

XLDnaute Junior
Bonjour ynx69, JHA, Bruno,

Fichier joint avec cette macro dans le code de Feuil1 :
Code:
Private Sub Worksheet_Change(ByVal Target As Range)
Dim P As Range, Q As Range, c As Range, n%
Set P = [B5:C5]: Set Q = [I8:I11] 'à adapter
If Intersect(Target, P(1)) Is Nothing Then Exit Sub
P(2).Validation.Delete
Set c = Q.Find(P(1), , xlValues)
If c Is Nothing Then P(2) = "": Exit Sub
n = Application.CountA(c(1, 2).Resize(, 4))
If n = 1 Then
    P(2) = c(1, 2)
Else
    P(2) = ""
    P(2).Validation.Add xlValidateList, Formula1:="=" & c(1, 2).Resize(, n).Address
    P(2).Select
End If
End Sub
A+
Hello @job75 ,

merci pour ta réponse , c'est exactement ce que je cherchais !

Par contre je n'arrive pas à adapter ton code..

Dans le cas concret que j'ai , la liste des prénoms + les diplomes associés est dans une autre feuille...

Saurais-tu comment modifier le code de manière à tenir compte de ca ?

Merci d'avance
 

job75

XLDnaute Barbatruc
Bonjour ynx69,
Code:
Private Sub Worksheet_Change(ByVal Target As Range)
Dim P As Range, Q As Range, c As Range, n%
Set P = [B5:C5]: Set Q = Feuil2.[I8:I11] 'Feuil2 : CodeName de la feuille Source
If Intersect(Target, P(1)) Is Nothing Then Exit Sub
P(2).Validation.Delete
Set c = Q.Find(P(1), , xlValues)
If c Is Nothing Then P(2) = "": Exit Sub
n = Application.CountA(c(1, 2).Resize(, 4))
If n = 1 Then
    P(2) = c(1, 2)
Else
    P(2) = ""
    P(2).Validation.Add xlValidateList, Formula1:="=" & c(1, 2).Resize(, n).Address(External:=True)
    P(2).Select
End If
End Sub
Remerciez aussi JHA et Bruno.

A+
 

Fichiers joints

job75

XLDnaute Barbatruc
Re,

Sur Excel 2003 et versions antérieures les plages externes des listes doivent être nommées :
Code:
Private Sub Worksheet_Change(ByVal Target As Range)
Dim P As Range, Q As Range, c As Range, n%
Set P = [B5:C5]: Set Q = Feuil2.[I8:I11] 'Feuil2 : CodeName de la feuille Source
If Intersect(Target, P(1)) Is Nothing Then Exit Sub
P(2).Validation.Delete
Set c = Q.Find(P(1), , xlValues)
If c Is Nothing Then P(2) = "": Exit Sub
n = Application.CountA(c(1, 2).Resize(, 4))
If n = 1 Then
    P(2) = c(1, 2)
Else
    P(2) = ""
    c(1, 2).Resize(, n).Name = "Etudes" 'plage externe nommée
    P(2).Validation.Add xlValidateList, Formula1:="=Etudes"
    P(2).Select
End If
End Sub
Fichier .xls joint.

A+
 

Fichiers joints

ynx69

XLDnaute Junior
Merci à tous pour vos réponses ca m'aide vachement !! :) J'avance petit à petit sur mon projet grâce à vous !

@job75, j'ai réussi à adapter la macro de manière à ce qu'elle fonctionne sur mon cas mais il me reste juste un point en suspens que je n'arrive pas à résoudre.

Dans le fichier exemple que je t'ai donné : On sélectionne le nom en B5 et on affiche le résultat en C5. Or, sur mon fichier ( qui ne peut pas être modifiable puisqu'il intéragit avec un autre programme que je ne peux pas modifier, il faudrait que le résultat s'affiche en D5. Je pensais qu'il fallait modifier seulement la ligne B5:C5 de la macro mais visiblement ce n'est pas le cas. Pourrais-tu m'aider et m'expliquer les points à modifier ?

Merci d'avance

Ynx
 

job75

XLDnaute Barbatruc
Bah remplacez Set P = [B5:C5] par :
Code:
Set P = [B5:D5]
et remplacez P(2) par P(3)...
 

ynx69

XLDnaute Junior
Merci pour ta réponse ! :)

Franchement ca m'aide énormément !

J'ai essayé de modifier la macro car je fais face à un nouveau problème suite à une demande de dernière minute: je souhaite faire exactement la même chose (à quelques conditions près) , cette fois ci entre [B4 ":"D4].

Contrairement à l'exemple précédent, j'ai (toujours dans la feuille 2) une liste de 3000 noms qui commence en A62 et un code qui est rattaché à chacun des noms (en colonne B).

ce que je cherche à faire , c'est ajouté la fonctionnalité suivante :

L'utilisateur choisi le nom en cellule B4
On contrôle le nom dans la liste présente sur la feuille 2
Si le nom apparait une seule fois : alors on met en D4 le code qui lui est rattaché
Si le nom apparait plusieurs fois : alors on crée une liste en D4 avec les codes dispo

Est ce que tu penses que c'est réalisable ?

ynx
 

job75

XLDnaute Barbatruc
Rien compris, pour la feuille 2 il n'y a rien en colonnes A ou B.

Et il est évident que dans cette feuille la liste des noms doit être sans doublon.
 

ynx69

XLDnaute Junior
Hello Job,

J'ai mis en pièce jointe un exemple type.

Pour refaire l'explication lol : sur la feuille 2 , colonne A , ligne 62 jusqu'à 3200 , on a des noms de fournisseurs
Sur les colonnes suivantes, 1 code associé ou plusieurs .
Il n'y a pas de doublons

Ce que je cherche c'est en plus du choix entre B5 et D5, c'est d'avoir un choix sur B4 et D4 ( choix qui seront realisés à partir de la liste qui commence à la ligne 62 ).

Donc comme pour la première macro, si un code alors on l'affiche en D4 , si plusieurs on affiche la liste des codes en D4.

Merci vraiment pour ton aide ! si t'es parisien, je paye mon coup à boire !

Ynx
 

Fichiers joints

job75

XLDnaute Barbatruc
Bonsoir ynx69,

Voyez ce fichier (3) et ces macros :
Code:
Private Sub Worksheet_Change(ByVal Target As Range)
Dim P As Range, Q As Range
Set P = [B5:D5]: Set Q = Feuil2.[I8:I11] 'Feuil2 : CodeName de la feuille Source
Macro Target, P, Q
Set P = [B4:D4]: Set Q = Feuil2.[A62:A66]
Macro Target, P, Q
End Sub

Sub Macro(Target, P As Range, Q As Range)
Dim c As Range, n%
If Intersect(Target, P(1)) Is Nothing Then Exit Sub
P(3).Validation.Delete
Set c = Q.Find(P(1), , xlValues)
If c Is Nothing Then P(3) = "": Exit Sub
n = Application.CountA(c(1, 2).Resize(, 4))
If n = 1 Then
    P(3) = c(1, 2)
Else
    P(3) = ""
    P(3).Validation.Add xlValidateList, Formula1:="=" & c(1, 2).Resize(, n).Address(External:=True)
    P(3).Select
End If
End Sub
A+
 

Fichiers joints

ynx69

XLDnaute Junior
Merci beaucoup pour ton aide !! J'ai compris la logique tu utilises (après de longues minutes).

Par contre j'ai un point de blocage sur lequel je trouve pas comment procéder.

En B5 et B4 on a nos listes dans lesquelles l'utilisateur choisi ce qu'il veut. Avant ca , lorsque je tapais "m" par exemple et que je cliquais sur la liste, ca m'affichait les éléments donc la première lettre commencait par M. Je faisais ça via une formule dans la liste de validation.

Cette fonctionnalité n'est plus dispo et ca pose un problème. Dans la cellule B4 , la liste fait 3000 lignes .. Est ce qu'il y a un moyen de corriger ca ?

Ynx
 

job75

XLDnaute Barbatruc
Bonjour ynx69, le forum,

C'est ce qu'on appelle un fil à tiroirs non ?

Si l'on veut créer des listes de validation intuitives en B4 et B5 on peut utiliser cette macro :
Code:
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
Dim critere$, P As Range, liste, i&, x$, n&
critere = LCase([B2]) & "*" 'cellule à adapter
If ActiveCell.Address = "$B$4" Then Set P = Feuil2.[A62:A3000] 'Feuil2 : CodeName de la feuille Source
If ActiveCell.Address = "$B$5" Then Set P = Feuil2.[I8:I11]
With Feuil3 'CodeName de la feuille Liste
    .[A:A].ClearContents
    If P Is Nothing Then Exit Sub
    ActiveCell.Validation.Delete
    liste = P.Resize(P.Rows.Count + 1) 'matrice, plus rapide, au moins 2 éléments
    For i = 1 To UBound(liste) - 1
        x = liste(i, 1)
        If x <> "" And LCase(x) Like critere Then n = n + 1: liste(n, 1) = x
    Next
    If n = 0 Then Exit Sub
    With .[A1].Resize(n)
        .Value = liste
        .Sort .Cells, xlAscending, Header:=xlNo 'tri alphabétique
        ActiveCell.Validation.Add xlValidateList, Formula1:="=" & .Address(External:=True)
    End With
End With
End Sub
La feuille auxiliaire "Liste" peut être masquée.

Fichier (4).

A+
 

Fichiers joints

Discussions similaires


Haut Bas