Liste déroulante auto filtrée
Bonjour à tous,
Je sollicite votre aide une nouvelle fois pour un fichier de planification que vous trouverez en pièce jointe.
Vous voyez sur le fichier des promotions sur la première colonne et des dates en ligne une qui continueront sur plusieurs mois.
Entre chaque promotion, il y a une ligne où l'on va mettre la salle qui sera associée à cette promotion.
La problématique est que pour chaque salle il y a un effectif maximum (détaillé feuille 2).
Sur chaque ligne "Salle", j'aimerais savoir s'il est possible que la liste soit auto filtrée et ne puisse proposer que les bonnes salles en prenant en compte les éléments ci-dessous :
- La même salle ne peut pas être proposée à deux promotions différentes le même jour (donc sur la même colonne)
- Si l'effectif de la promo est de 30 par exemple sur la cellule B4, on ne doit pas pouvoir y proposer une salle de capacité 20 personnes en B5.
- La salle ZOOM est une salle digitale, elle ne fait pas partie des deux conditions précédentes, elle doit pouvoir être mise plusieurs fois et peu importe l'effectif.
Je n'arrive pas avec un calcul à prendre en compte ces trois contraintes, c'est peut être infaisable en l'état.
Merci beaucoup pour votre aide précieuse sur le sujet.
Bastien
Bonjour
Un essai à tester. Te convient-il ?
Option Explicit
Dim tablo, tablo1, tablo2, f1 As Worksheet, f2 As Worksheet
Dim i1&, i2&, j&, capM&, cap&, salle$, flag&
Sub DésignerLesSalles()
Set f1 = Sheets("Feuil1")
tablo1 = f1.Range(f1.Cells(3, 1), f1.Cells(Range("A" & Rows.Count).End(xlUp).Row, _
f1.Cells(3, Columns.Count).End(xlToLeft).Column))
Set f2 = Sheets("Feuil2")
tablo = f2.Range("A1:C" & f2.Range("A" & Rows.Count).End(xlUp).Row)
f2.Range("A2:C" & f2.Range("A" & Rows.Count).End(xlUp).Row).Sort _
key1:=f2.Range("B2"), order1:=xlDescending, Header:=xlYes
cap = Application.Max(f2.Range("B2:B" & f2.Range("B" & Rows.Count).End(xlUp).Row)) + 1
For j = 2 To UBound(tablo1, 2)
tablo2 = f2.Range("A1:C" & f2.Range("A" & Rows.Count).End(xlUp).Row)
For i1 = 1 To UBound(tablo1, 1) Step 2
flag = 0
For i2 = 2 To UBound(tablo2, 1) - 1
If tablo1(i1, j) <= tablo2(i2, 2) Then
cap = tablo2(i2, 2)
tablo2(i2, 2) = 0
salle = tablo2(i2, 3)
flag = 1
Exit For
End If
Next i2
If flag = 1 Then
tablo1(i1 + 1, j) = salle
Else
tablo1(i1 + 1, j) = "ZOOM"
End If
Next i1
Next j
f1.Range("A3").Resize(UBound(tablo1, 1), UBound(tablo1, 2)) = tablo1
f2.Range("A1").Resize(UBound(tablo, 1), UBound(tablo, 2)) = tablo
End SubBye !
Bonjour,
Merci ça m'a bien servit !
Bonne journée