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 53 54 55 56 57 58 59 60 61 62
| Private Sub Worksheet_Change(ByVal Target As Range)
Dim Col As Integer, LastLig As Integer, ColFirst As Integer, LigFirst As Integer
Dim Plage As Range, c As Range
Dim Niv As Byte
Niv = Range("Niveau").Value
Col = Range("Niveau").Column 'la colonne des notes (variable du fait de l'insertion ou suppression de colonnes
ColFirst = Range("First").Column
LigFirst = Range("First").Row
If Target.Count = 1 And Target.Row >= 4 Then 'si UNE SEULE cellule est changée au dela de la ligne 4
Set Plage = Range(Cells(Target.Row, ColFirst), Cells(Target.Row, Col - 1)) 'Plage: la ligne à partir de la colonne B jusqu'à l'avant dernière colonne
'Ajout élève: Création des listes de validation sur la ligne en cours
If Target.Column = ColFirst - 1 Then 'Si la colonne A est modifiée (ajout ou modification du nom d'un élève)
Call LstValid(Plage, Niv) 'on appelle la procédure de création des listes de validation sur la ligne en cours
Plage.Offset(0, -1).Resize(1, Plage.Count + 2).Borders.LineStyle = xlContinuous 'on trace les bordures
'Choix critère: calcul de la note (dernière colonne)
ElseIf Target.Column > ColFirst - 1 And Target.Column < Col And Range( ? & Target.Row) <> "" Then 'son on modifie les critere dans une cellule de la plage B jusqu'à l'avant dernière colonne
Cells(Target.Row, Col).Value = Sigma(Plage, Niv) 'dans la dernière colonne on insère la calcul de la note à l'aide de la fonction Sigma
End If
Set Plage = Nothing
'Changement de niveau: mise à jour de toutes les listes de validation des critères
ElseIf Target.Address = Range("Niveau").Address Then
LastLig = Cells(Rows.Count, 1).End(xlUp).Row
Set Plage = Range(Cells(LigFirst, ColFirst), Cells(LastLig, Col - 1))
Call LstValid(Plage, Niv)
Set Plage = Nothing
'Ajout ou suppression d'une colonne: Mise à jour des notes
ElseIf Target.Rows.Count = ActiveSheet.Rows.Count Then
LastLig = Cells(Rows.Count, 1).End(xlUp).Row
For Each c In Range(Cells(LigFirst, Col), Cells(LastLig, Col))
c.Value = Sigma(Range(Cells(c.Row, ColFirst), Cells(c.Row, Col - 1)), Niv)
Next c
End If
End Sub
'Fonction de calcul des notes
Private Function Sigma(Rng As Range, Niv As Byte) As Double
Dim Crit As String
Dim Coef As Byte
Dim n As Integer
Dim c As Range
Crit = "N,I,P,B,T,M"
Coef = Rng.Count
For Each c In Rng
n = n + (InStr(Crit, c.Value) - 1) / 2
Next c
Sigma = Application.RoundUp(n * 20 / (Coef * (Niv - 1)), 2)
End Function
'Sub de création des listes de validation
Private Sub LstValid(Rng As Range, ByVal Niv As Byte)
Dim Crit As String
Crit = "N,I,P,B,T,M"
Crit = Left(Crit, 2 * Niv - 1)
With Rng.Validation
.Delete
.Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop, Operator:=xlBetween, Formula1:=Crit
End With
End Sub |