1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52
| Sub subLyonnaisDromois()
Dim vS As Variant, vC As Variant
Dim s As Integer, c As Integer
Dim oRng As Excel.Range
Dim sngTot As Single
'trier les cours et salles par durées décroissantes
Set oRng = ThisWorkbook.Names("nmCours").RefersToRange
oRng.Sort oRng(1, 2), xlDescending, , , , , , xlNo
vC = oRng.Value
Set oRng = ThisWorkbook.Names("nmSalles").RefersToRange
oRng.Sort oRng(1, 2), xlDescending, , , , , , xlNo
vS = oRng.Value
'suppression des infos en colonnes 3 de S et C
For s = 1 To UBound(vS, 1)
vS(s, 3) = Empty
Next s
For c = 1 To UBound(vC, 1)
vC(c, 3) = Empty
Next c
'remplir les salles
For s = 1 To UBound(vS, 1)
sngTot = 0
'chercher s'il reste des cours à placer
For c = 1 To UBound(vC, 1)
If IsEmpty(vC(c, 1)) Then Exit For
Next c
If c = UBound(vC, 1) Then Exit For 'plus de cours à placer
'chercher des cours pour la salle s
For c = 1 To UBound(vC, 1)
If IsEmpty(vC(c, 3)) And (sngTot + vC(c, 2) <= vS(s, 2)) Then
'le cours c n'est pas placé et tient dans la salle s
vS(s, 3) = vS(s, 3) & ", " & vC(c, 1)
vC(c, 3) = vS(s, 1)
sngTot = sngTot + vC(c, 2)
End If
Next c
'enlever le premier ", " = 2 caractères
If Not IsEmpty(vS(s, 3)) Then vS(s, 3) = Mid$(vS(s, 3), 3)
Next s
'écrire le résultat dans la feuille
oRng.Value = vS
Set oRng = Nothing
vS = Empty
vC = Empty
End Sub |
Partager