Liste déroulante conditionnelle évolutive

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 !

6 réponses

  1. Bonsoir PM, bonsoir le forum,

    Où (onglet / adresse) sont situées les listes de validation, les données ?
    0
    1. Bonsoir ThauTheme

      Elles sont dans la même feuille de calcul que le tableau que j'ai créé

      A+

      PM
      0
      1. 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 :

        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
        0
        1. 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 :

          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


          0
          1. Waouhhh merci ! Je vais essayer de faire ça ce week-end ! Merci beaucoup !!!
            0