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
 

Pièces jointes

  • ex.xlsx
    9.4 KB · Affichages: 21

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+
 

Pièces jointes

  • ex(1).xlsm
    24.7 KB · Affichages: 10

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+
 

Pièces jointes

  • ex(2).xlsm
    23.5 KB · Affichages: 8

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+
 

Pièces jointes

  • ex(2 bis).xls
    75 KB · Affichages: 9

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
 

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
 

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
 

Pièces jointes

  • ex(2).xlsm
    18.6 KB · Affichages: 8

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+
 

Pièces jointes

  • ex(3).xlsm
    26.6 KB · Affichages: 11

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
 

Discussions similaires

Statistiques des forums

Discussions
311 720
Messages
2 081 915
Membres
101 837
dernier inscrit
Ugo