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
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
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+
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+
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 !!