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