Liste déroulante Excel avec particularités

Bonjour à tous,

Ayant des connaissances limitées sur Excel, je suis un peut coincé pour réaliser ma liste déroulante car il y a deux choses en plus, un peut complexe pour mon niveau . ( enfin si c'est possible)

En effet je doit réaliser un planning pour attribuer des salles de cours. Je souhaite que lorsqu'une salle est attribuée on ne puisse plus la voir sur dans la liste déroulante mais uniquement si c'est sur les mêmes horaires.

Par exemple si on attribut la salle 1 à un cours qui a lieux de 9h à 12H on ne doit plus pouvoir l’attribuer mais uniquement pour tous autres cours étant sur la même plage horaire. Sinon on peut l'attribuer normalement.

Ci joint mon fichier Excel pour mieux comprendre

En vous remerciant

Bonne soirée

9planning.xlsx (11.59 Ko)

Bonjour @ tous,

Voir PJ

15coraroc-listes.xlsx (14.15 Ko)

Cordialement

Bonjour,

Une autre solution similaire à celle de R@chid, que je salue…

Cdlt.

Nota: erreur !...

Salut Coraroc,

Salut l'équipe,

une solution VBA.

Les valeurs temporaires servant aux calculs se "cachent" en blanc dans [J-L...Y].

La liste de validation se construit à la demande lors d'un clic en ['I], [J] étant alors effacée pour recevoir la nouvelle liste de salles disponibles.

[L...Y] qui reçoivent leurs horaires d'occupation au fur et à mesure des attributions ne seront effacées que si la date en [D1] est modifiée.

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
'
Dim iRow%, iOK%
'
Application.EnableEvents = False
'
If Not Intersect(Target, Range("I3:I" & Range("B" & Rows.Count).End(xlUp).Row)) Is Nothing Then
    On Error Resume Next
    Range("I:I").Validation.Delete
    Range("J:J").Value = ""
    iRow = Target.Row
    With Target.Validation
        For x = 3 To Range("K" & Rows.Count).End(xlUp).Row
            If Range("L" & x).Value = "" Then
                Range("J" & Range("J" & Rows.Count).End(xlUp).Row + 1).Value = Range("K" & x).Value
            Else
                iOK = 0
                For y = 12 To Cells(x, Columns.Count).End(xlToLeft).Column Step 2
                    iOK = IIf(Range(Chr(64 + y) & x).Value >= Range("C" & iRow).Value Or Range(Chr(65 + y) & x).Value <= Range("B" & iRow).Value, iOK,1)
                Next
                If iOK = 0 Then Range("J" & Range("J" & Rows.Count).End(xlUp).Row + 1).Value = Range("K" & x).Value
            End If
        Next
        .Add Type:=xlValidateList, Formula1:="=J2:J" & Range("J" & Rows.Count).End(xlUp).Row
    End With
    On Error GoTo 0
End If
'
Application.EnableEvents = True
'
End Sub

A tester en situation réelle...

A+

7coraroc.xlsm (24.38 Ko)

Salut tout le monde,

version améliorée :

  • ne sont reprises dans la liste de validation que les salles dont la capacité est au moins égale au nombre d'élèves prévu ;
  • les salles sont triées dans la liste en fonction de leur capacité ;
  • les calculs temporaires sont cantonnés dans les colonnes [L...]
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
'
Dim iRow%, iRowK%, iNb%, iOK%
'
Application.EnableEvents = False
'
If Not Intersect(Target, Range("I3:I" & Range("B" & Rows.Count).End(xlUp).Row)) Is Nothing Then
    iRow = Target.Row
    iRowK = Range("K" & Rows.Count).End(xlUp).Row
    Range("I:I").Validation.Delete
    Range("L:M").Value = ""
    For x = 3 To iRowK
        iOK = 0
        If x < iRowK Then iNb = CInt(Split(Split(Range("K" & x).Value, " (")(1), ")")(0))
        If iNb >= CInt(Range("D" & iRow).Value) Then
            If Range("N" & x).Value <> "" Then
                For y = 14 To Cells(x, Columns.Count).End(xlToLeft).Column Step 2
                    iOK = IIf(Range(Chr(64 + y) & x).Value >= Range("C" & iRow).Value Or Range(Chr(65 + y) & x).Value <= Range("B" & iRow).Value, iOK, 1)
                Next
            End If
            If iOK = 0 Then
                Range("L" & Range("L" & Rows.Count).End(xlUp).Row + 1).Value = Range("K" & x).Value
                Range("M" & Range("M" & Rows.Count).End(xlUp).Row + 1).Value = IIf(x = iRowK, 1000, iNb)
            End If
        End If
    Next
    Range("L2:M" & Range("L" & Rows.Count).End(xlUp).Row).Sort key1:=Range("M2"), order1:=xlAscending, Orientation:=xlTopToBottom
    Target.Validation.Add Type:=xlValidateList, Formula1:="=L2:L" & Range("L" & Rows.Count).End(xlUp).Row
End If
'
Application.EnableEvents = True
'
End Sub

A+

8coraroc.xlsm (25.71 Ko)

Bonjour tous le monde et merci de vous pencher sur mon doc

C'est parfait c'est presque ça, cependant une fois qu'une salle est attribuer on ne peut plus du tous la réattribuer dans la liste. Or je veux pouvoir la réattribuer si elle n'est pas prise les mêmes horaires.

Par exemple si je met la salle 2 en ligne 3 ( cours des AES le matin de 8h30 à 12h) veux pouvoir l'attribuer en ligne 4 (cours des AES l'après midi de 13h30 à 17h00), mais du coup je ne veux plus pouvoir l’attribuer pour la ligne 5 par exemple comme elle est déjà attribué pour ces horaires là.

En fait c'est bon, ma macro était pas activé sur l'ordinateur que j’utilisai

Merci !!!!! C'est EXACTEMENT ce que je voulais !!

Rechercher des sujets similaires à "liste deroulante particularites"