Automatisation système de compensations de notes d'un bulletin d'étudiants

Bonjour à toutes et à tous,

Je recherche un moyen d'automatiser les compensations que nous réalisons manuellement sur un fichier excel (ou sheet de préférence).

Il s'agit probablement d'une manoeuvre complexe puisqu'il faudrait entrer plusieurs règles/conditions.

Je m'explique, un étudiant doit pour valider une unité d'enseignement (UE) avoir au dessus de 10.

Une UE avec une note moyenne entre 8 et 10 d'un même domaine (domaine 1 et 2) peut être compensée par une autre note au dessus de 10 si le total de ces deux notes fait 20 ou plus (ou si la moyenne des deux notes fait 10 ou plus).

Une UE avec une note au dessus de 10 ayant été utilisée pour en compenser une autre ne peut pas être réutilisée pour en compenser une deuxième.

On commence à compenser les notes entre 8 et 10 la plus proche de 10, avec la note au dessus de 10 la plus proche de 10 également.

Les notes du domaine 1 (UE 1.2, 1.4, 1.6, 1.7, 1.8 et 1.9) peuvent se compenser entre elles. Les notes du domaine 2 (UE 2.3, 2.5, 2.6) peuvent se compenser entre elles. Les notes des autres domaines sont non compensables et sont donc validés à partir de 10.

Après toutes ces conditions réunis ils faudrait que dans la cellule de la colonne compensations apparaisse quelle UE a été compensée par quelle UE.

Dans le fichier joint, les 5 premières lignes ont été réalisées manuellement.

Je vous remercie par avance pour toute piste me permettant d'initier la création d'un système automatique.

Bonne journée à tous.

bonjour,

On commence à compenser les notes entre 8 et 10 la plus proche de 10, avec la note au dessus de 10 la plus proche de 10 également.

que se passe-t-il si cette note supérieure à 10 (la plus proche de 10) ne permet pas de compenser la note à compenser ? exemple 8.5 et 10.5 ? peut-on prendre la première note supérieure à 10 qui permet de compenser ?

ps solution par formules me semble fastidieuse, une solution via fonction personnalisée VBA peut-elle convenir ?

Bonjour,

Si la note valide la plus proche de 10 ne permet pas de compenser la note inf à 10 la plus proche de 10, alors il faut choisir une autre note au dessus 10 pouvant compenser. Si aucune note ne permet de compenser, la note inf à 10 n’est donc pas compensable et invalidée, elle devra être repassée en rattrapage.

Je pense en effet qu’il n’existe pas de telle formule. Malheureusement je ne m’y connais pas du tout en macros/scripts.

Voici la réponse d’une personne qui m’a permis de « traduire » les rêgles sous forme mathématique.

bb060006 19e2 4369 9f5b 5fc82a767e01

bonjour,

voici une proposition via macro VBA (ne fonctionne pas sur sheets)

Bonjour,

Un immense merci, cela fonctionne. Il faut que j'arrive à transférer la macro sur notre fichier de bulletin pour vérifier si tout est bon (ce qui est un challenge pour moi).

Merci encore.

bonjour,

Il faut que j'arrive à transférer la macro sur notre fichier de bulletin pour vérifier si tout est bon (ce qui est un challenge pour moi).

comment la rendre disponible dans un classeur ?

1. sélectionner et copier le code de la macro sur le forum (CTRL-C)

2. ouvrir le classeur qui convient en excel

3. ouvrir l'éditeur VBA (alt-F11)

4. faire insérer module (menu, insérer->module)

5. coller le code (CTRL-V)

6. retour à excel (alt-F11)

7.sauver le document avec les macros, (format xlsm)

8. la fonction est disponible pour le classeur et peut être utilisée comme n'importe quelle autre fonction Excel.

Sub aargh()
'compensation des notes de tous les étudiants sur la feuille.
    With Sheets("feuille 1") '<- feuille contenant les données
        dl = .Cells(.Rows.Count, 1).End(xlUp).Row 'dl dernière ligne utilisée sur la feuille
        tb = Range("A1").Resize(dl, 20) 'on copiela plage de données (colonne 1 a 20) en mémoire
        For i = 2 To dl 'on prend chaque ligne à partir de la ligne 2
            oue = "" 'ue en cours de traitement
            t = "" 'résultat de la compensation
            For j = 2 To 20 'on prend chaque colonne à partir de la colonne 2
                ue = Left(tb(1, j), 1) ' ue de la colonne
                If Left(ue, 1) <> oue Then 'le ue de la colonne est-il le même que l'ue en cours
                    If oue <> "" Then 'non
                        fin = j - 1 'j-1 est la colonne de fin de l'ue en cours
                        t = t & compenser(tb, i, deb, fin) 'on compense l'ue en cours pour la ligne i, l'ue en cours est l'ensemble des cellules du tableau en ligne de la colonne deb à la colonne fin
                    End If
                    deb = j 'j est la colonne de debut de la nouvelle Ue 
                    oue = ue 'l'ue en cours est l'ue de la colonne
                End If
                If oue > "2" Then Exit For 'si ue est > "2" on arrête le traitement de la compensation des ue (>"2" non compensables)
            Next j
            If t <> "" Then .Cells(i, 25) = Left(t, Len(t) - 1) 'on affiche le résultat de la compensation en colonne 25 ("Y") en supprimant la virgule finale

        Next i
    End With
End Sub

Function compenser(ByVal tb, ligne, deb, fin)
'compensation des notes en ligne i pour les notes comprises entre la colonne deb et fin
'recherche d'une note à compenser
    For i = deb To fin 'on parcourt les colonnes de deb à fin
        If IsNumeric(tb(ligne, i)) Then 'note numérique ?
            If tb(ligne, i) >= 8 And tb(ligne, i) < 10 Then 'note dans l'intervalle >=8 <10
                c = cherchercompensation(tb, ligne, deb, fin, i) 'on cherche une note pour compenser la note à compenser
                If c <> 0 Then 'si note pour compenser est trouvée
                    t = t & tb(1, i) & " par " & tb(1, c) & "," 'on ajoute un texte au resultat de la compensation
                    tb(ligne, i) = 0 'on supprime les notes utilisées
                    tb(ligne, c) = 0
                End If
            End If
        End If
    Next i
    compenser = t 'on renvoie le résultat de la compensation
End Function

Function cherchercompensation(tb, ligne, deb, fin, note)
' recherche de la note permettant de compenser la note ue donnant une différence >0 la plus petite possible
    emin = 100 par défaut l'écart est 100
    For i = deb To fin 'on parcourt les colonnes avec les notes de l'ue
        If i <> note Then 'si colonne de la note en cours est différente de la colonne de la note à compenser
            If IsNumeric(tb(ligne, i)) Then 'si note numérique
                d = tb(ligne, i) - tb(ligne,note) 'calcul de l'écart
                If d >= 0 And d < emin Then c = i: emin = d 'si ecart trouvé < ecart minimum le nouvel ecart minimum est le dernier écart trouvé
            End If
        End If
    Next i
    cherchercompensation = c 'on renvoie la colonne contenant la note permettant de compenser la note en colonne note
End Function

Merci encore pour cette précieuse aide, j'ai modifié le nom de la feuille correspondant en remplaçant Sheets("feuille 1") par Sheets("PCEO2"), qui est le nom de la feuille sur laquelle je veux tester, j'ai ajouté un bouton associé au macro.

Toutefois cela ne fonctionne pas.

Y a t'il une ligne indiquant sur quelle colonne les compensations doivent être inscrites ? Y a t'il une ligne indiquant les plages de cellules où s'applique la rêgle ? (J'ai volontairement retiré plusieurs colonnes sur le fichiers modèle car certains domaines ne peuvent pas être compensés.)

bonjour,

Toutefois cela ne fonctionne pas.

Y a t'il une ligne indiquant sur quelle colonne les compensations doivent être inscrites ? Y a t'il une ligne indiquant les plages de cellules où s'applique la rêgle ? (J'ai volontairement retiré plusieurs colonnes sur le fichiers modèle car certains domaines ne peuvent pas être compensés.)

la macro est basée sur la structure du classeur que tu as mis sur le forum. Si tu changes la structure, position des données, nombre de lignes, de colonnes, la macro doit être adaptée, voire complètement réécrite.

je vais mettre des commentaires dans le code.

Merci milles fois, je vais me plonger dedans.

Bonjour,

vu ta demande, je te propose d'utiliser une fonction personnalisée dont les paramètres seraient, pour une UE, les notes et les titres de l'UE. A utiliser comme une fonction excel normale. Tu as ainsi plus de liberté pour l'organisation de ton classeur.

=compenserUE(plage_de_notes_pour_l_ue,plage_d'entetes_pour_l_ue)

voir exemple d'utilisation dans fichier joint.

Rebonjour,

En effet cela fonctionne mieux comme cela merci,

Toutefois il y a un soucis dans le code, sur la ligne 6 par exemple, l'étudiant 5 a ses notes de 1.9 compensée par 1.8 alors que les deux notes sont en dessous de 10 et devraient être non validées.

re-bonjour,

en effet un bug, (déjà présent dans la version initiale)

voici une correction

Super merci encore, il reste encore quelques petites choses qui ne fonctionnent pas parfaitement, par exemple ligne 30, l'étudiant 29 compense l'UE 1.7 (la plus proche de 10) par l'UE 1.9 qui elle n'est pas la plus proche de 10, l'UE 1.8 l'est et elle compense l'UE 1.4 qui n'est elle par conséquent, pas la note inférieure à 10 la plus proche de 10.

Je ne sais pas si la règle/condition de commencer par les notes les plus proches de 10 est contenue dans la macro.

re-bonjour,

Je ne sais pas si la règle/condition de commencer par les notes les plus proches de 10 est contenue dans la macro.

effectivement, je n'avais pas tenu compte de cette règle. voici un nouvelle adaptation

Milles merci, cela fonctionne parfaitement !

avec plaisir, dans ce cas tu peux clôturer le sujet.

Rechercher des sujets similaires à "automatisation systeme compensations notes bulletin etudiants"