Liste déroulante conditionnelle évolutive
princessemoutarde
Messages postés
7
Date d'inscription
Statut
Membre
Dernière intervention
-
via55 Messages postés 14512 Date d'inscription Statut Membre Dernière intervention -
via55 Messages postés 14512 Date d'inscription Statut Membre Dernière intervention -
Bonjour,
Voici la situation : je gère des inscriptions pour un salon et j'ai différents exposants à intégrer dans différentes salles. Par exemple :
Salle boisson : plusieurs places qui sont A, B, C, D, E, F, G, L, X
Salle nourriture : plusieurs places qui sont M, N, O, P, R, U, Q, S, T
Salle jeux : plusieurs places qui sont V, W, H, I, J, K,
J'ai fait un tableau avec liste déroulante conditionnelle si bien que quand un exposant s'inscrit,
sur la colonne A, je coche s'il veut aller dans la nourriture, boisson ou jeux. Dans ma colonne B, je lui attribue une place de façon arbitraire ou non s'il a une préférence.
Comme j'ai envie de gérer efficacement les inscriptions, j'aimerais qu'une fois que j'ai déjà attribué une place pour chaque salle, quand j'inscris les prochains, ma liste déroulante ne présente que les places restantes.
Au cas où je n'explique pas bien :
Exposant 1 est en salle boisson, place A
Exposant 2 en salle boisson, place E
Exposant 3 m'appelle il veut aller en salle boisson, j'aimerais que dans la colonne qui propose les places, ma liste déroulante ne propose que les places restantes....
Est-ce qu'il existe une super manip pour le faire ?
Merci pour votre aide !
Voici la situation : je gère des inscriptions pour un salon et j'ai différents exposants à intégrer dans différentes salles. Par exemple :
Salle boisson : plusieurs places qui sont A, B, C, D, E, F, G, L, X
Salle nourriture : plusieurs places qui sont M, N, O, P, R, U, Q, S, T
Salle jeux : plusieurs places qui sont V, W, H, I, J, K,
J'ai fait un tableau avec liste déroulante conditionnelle si bien que quand un exposant s'inscrit,
sur la colonne A, je coche s'il veut aller dans la nourriture, boisson ou jeux. Dans ma colonne B, je lui attribue une place de façon arbitraire ou non s'il a une préférence.
Comme j'ai envie de gérer efficacement les inscriptions, j'aimerais qu'une fois que j'ai déjà attribué une place pour chaque salle, quand j'inscris les prochains, ma liste déroulante ne présente que les places restantes.
Au cas où je n'explique pas bien :
Exposant 1 est en salle boisson, place A
Exposant 2 en salle boisson, place E
Exposant 3 m'appelle il veut aller en salle boisson, j'aimerais que dans la colonne qui propose les places, ma liste déroulante ne propose que les places restantes....
Est-ce qu'il existe une super manip pour le faire ?
Merci pour votre aide !
A voir également:
- Excel liste déroulante conditionnelle
- Liste déroulante excel - Guide
- Créer des listes déroulantes en cascade dans Excel - Guide
- Mise en forme conditionnelle excel - Guide
- Word et excel gratuit - Guide
- Liste déroulante google sheet - Accueil - Guide bureautique
6 réponses
Bonsoir PM, bonsoir le forum,
Où (onglet / adresse) sont situées les listes de validation, les données ?
Où (onglet / adresse) sont situées les listes de validation, les données ?
Bonsoir PM, bonsoir le forum,
en pièce jointe un exemple pour t'inspirer. Les Listes sont dans l'onglet Listes. Les données dans l'onglet Feuil1. La colonne A de cet onglet contient une validation de données. Au changement dans la colonne A, une validation de données dans la cellule de la même ligne en colonne B est créée en tenant compte des places déjà attribuées...
le code :
Le fichier :
https://www.cjoint.com/?DKgxtTi2X0k
en pièce jointe un exemple pour t'inspirer. Les Listes sont dans l'onglet Listes. Les données dans l'onglet Feuil1. La colonne A de cet onglet contient une validation de données. Au changement dans la colonne A, une validation de données dans la cellule de la même ligne en colonne B est créée en tenant compte des places déjà attribuées...
le code :
Private Sub Worksheet_Change(ByVal Target As Range) Dim L As Object 'déclare la variable L (onglet Listes) Dim DL As Integer 'déclare la variable DL (Dernière Ligne) Dim COL As Byte 'déclare la variable COL (COLonne) Dim TCL As Variant 'déclare la variable TCL (Tableau de Cellules de l'onglet L) Dim LV As String 'déclare la variable LV (Liste de Validation) If Target.Cells.Count > 1 Then Exit Sub 'si plusieurs cellules sélectionnées, sort de la procédure If Application.Intersect(Target, Range("A2:A30")) Is Nothing Then Exit Sub 'limite l'action à la plage A2:A30 Set L = Sheets("Listes") 'définit l'onglet L COL = L.Rows(1).Find(Target.Value, , xlValues, xlWhole).Column 'définit la colonne COL TCL = L.Range(L.Cells(2, COL), L.Cells(Application.Rows.Count, COL).End(xlUp)) 'définit la tableau de cellules TCL For I = 1 To UBound(TCL, 1) 'boucle sur toues les lignes du tableau TCL 'définit la recherche R (recherche la valeur entière de TCL(I,1) dans la colonne 2 (=B) de cet onglet) Set R = Columns(2).Find(TCL(I, 1), , xlValues, xlWhole) 'si R n'existe pas, àjoute TCI(I,1) à la liste de validation LV If R Is Nothing Then LV = IIf(LV = "", TCL(I, 1), LV & "," & TCL(I, 1)) Next I 'prochaine ligne de la boucle With Target.Offset(0, 1).Validation 'prend en compte la validation de données de la cellue adjacente en colonne B .Delete 'supprime une éventuelle validation de données existante .Add xlValidateList, Formula1:=LV 'ajoute la liste LV comme validation de données End With 'fin de la prose en compte de la cellule adjacente en colonne B End Sub
Le fichier :
https://www.cjoint.com/?DKgxtTi2X0k
Bonsoir PM, boonsoir le forum,
Dans le fichier en pièce jointe de mon post précédent , remplace le code par celui ci-dessous où un message s'affiche quand toutes les places d'une salle sont attribuées. Je ne te renvoie pas un nouveau fichier en pièce jointe...
Le code :
Dans le fichier en pièce jointe de mon post précédent , remplace le code par celui ci-dessous où un message s'affiche quand toutes les places d'une salle sont attribuées. Je ne te renvoie pas un nouveau fichier en pièce jointe...
Le code :
Private Sub Worksheet_Change(ByVal Target As Range) Dim L As Object 'déclare la variable L (onglet Listes) Dim DL As Integer 'déclare la variable DL (Dernière Ligne) Dim COL As Byte 'déclare la variable COL (COLonne) Dim TCL As Variant 'déclare la variable TCL (Tableau de Cellules de l'onglet L) Dim LV As String 'déclare la variable LV (Liste de Validation) If Target.Cells.Count > 1 Then Exit Sub 'si plusieurs cellules sélectionnées, sort de la procédure If Application.Intersect(Target, Range("A2:A30")) Is Nothing Then Exit Sub 'limite l'action à la plage A2:A30 Set L = Sheets("Listes") 'définit l'onglet L COL = L.Rows(1).Find(Target.Value, , xlValues, xlWhole).Column 'définit la colonne COL TCL = L.Range(L.Cells(2, COL), L.Cells(Application.Rows.Count, COL).End(xlUp)) 'définit la tableau de cellules TCL For I = 1 To UBound(TCL, 1) 'boucle sur toues les lignes du tableau TCL 'définit la recherche R (recherche la valeur entière de TCL(I,1) dans la colonne 2 (=B) de cet onglet) Set R = Columns(2).Find(TCL(I, 1), , xlValues, xlWhole) 'si R n'existe pas, àjoute TCI(I,1) à la liste de validation LV If R Is Nothing Then LV = IIf(LV = "", TCL(I, 1), LV & "," & TCL(I, 1)) Next I 'prochaine ligne de la boucle 'si LV est vide, message, sort de la procédure If LV = "" Then MsgBox "Il n'y a plus de place disponibles pour la salle " & Target.Value & " !": Exit Sub With Target.Offset(0, 1).Validation 'prend en compte la validation de données de la cellue adjacente en colonne B .Delete 'supprime une éventuelle validation de données existante .Add xlValidateList, Formula1:=LV 'ajoute la liste LV comme validation de données End With 'fin de la prose en compte de la cellule adjacente en colonne B End Sub
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
Bonsoir
Une autre possibilité uniquement par formules sans macro
https://www.cjoint.com/?0Khs46MO6WX
Cdlmnt
Une autre possibilité uniquement par formules sans macro
https://www.cjoint.com/?0Khs46MO6WX
Cdlmnt