Salut,
J'ai réussi à régler mon problème sémantique. Je ne maîtrise pas les booléens en basic.
Voici le code :
function arrondirV2(valeur as double, apresVirgule as integer) as double
dim baseDecimale as integer, reference as integer, moitie as integer
baseDecimale = 10
reference = 0
moitie = 2
valeur = valeur * (baseDecimale^apresVirgule)
valeur = valeur + (baseDecimale^reference) / moitie
arrondirV2 = fix(valeur) / (baseDecimale^apresVirgule)
end function
function Traitement(cellule as object, _
celluleRemarque as object, _
noteMin as double, _
noteMax as double, _
noteMinFac as double, _
remarque as string) as boolean
if cellule.getType = 1 then
if celluleRemarque.string = remarque then
if cellule.value >= noteMinFac then
if cellule.value <= noteMax then
Traitement = True
end if
end if
end if
end if
if cellule.getType = 1 then
if celluleRemarque.string <> remarque then
if cellule.value >= noteMin then
if cellule.value <= noteMax then
Traitement = True
end if
end if
end if
end if
end function
Sub Moyenne
dim classeur as object, feuille as object, plageDesNotes as object
dim celluleEnCours as object, celluleRemarque as object
dim celluleMoyenne as object
dim noteMinimale as double, noteMaximale as double
dim noteMinimaleFacultative as double, cumul as double, moyenne as double
dim compteur as integer, premiereLigne as integer, derniereLigne as integer
dim premiereColonne as integer, derniereColonne as integer
dim ligne as integer, colonne as integer, ligneRemarque as integer
dim colonneMoyenne as integer, apresVirgule as integer
dim absence as string, remarque as string
classeur = thisComponent
feuille = classeur.currentController.activeSheet
plageDesNotes = classeur.currentSelection
premiereLigne = plageDesNotes.rangeAddress.startRow
derniereLigne = plageDesNotes.rangeAddress.endRow
premiereColonne = plageDesNotes.rangeAddress.startColumn
derniereColonne = plageDesNotes.rangeAddress.endColumn
ligneRemarque = premiereLigne - 1
colonneMoyenne = derniereColonne + 1
apresvirgule = 2
noteMinimale = 0
noteMaximale = 20
noteMinimaleFacultative = 10
'absence = "abs"
remarque = "F"
for ligne = premiereLigne to derniereLigne
compteur = 0
cumul = 0
celluleMoyenne = feuille.getCellByPosition(colonneMoyenne, ligne)
for colonne = premiereColonne to derniereColonne
celluleEnCours = feuille.getCellByPosition(colonne, ligne)
celluleRemarque = feuille.getCellByPosition(colonne, ligneRemarque)
if Traitement(celluleEnCours, _
celluleRemarque, _
noteMinimale, _
noteMaximale, _
noteMinimaleFacultative, _
remarque) then
compteur = compteur + 1
cumul = cumul + celluleEnCours.value
end if
next
if compteur > 0 then
moyenne = cumul / compteur
moyenne = arrondir(moyenne, apresVirgule)
celluleMoyenne.value = moyenne
end if
next
End Sub
Si on ne modifie aucun paramètre, il faut que les notes d'un élève se suivent sur une ligne. Il faut aussi que la remarque (contrôle facultatif) soit sur la même colonne de la note et la ligne des remarques soit juste au-dessus des notes du premier élève.
La colonne, en suivant à droite des notes, est la colonne des moyennes conditionnées.
On a une ligne par élève.
Chez moi, sur la ligne 1, j'ai :
en A : rien, en B : note 1, en C : note 2 ... en F : note 5 (la dernière), en G : moyenne
ligne 2 :
en A : remarque, en B : F et pareil en C. Ces 2 notes sont facultatives donc prises en compte si la note est supérieure ou égale à 10. Rien après
ligne 3 :
en A : le nom de l'élève 1, en B : sa note au contrôle (note 1) et ainsi de suite
ligne 4 : l'élève 2
et ainsi de suite.
On crée un bouton "calculer moyennes" qu'on mettra sur la feuille à un endroit visible et qui ne gène pas.
Pour ce faire :
Insertion > Contrôle de formulaire > Bouton
On place le bouton et on le dimensionne
On le renomme en cliquant droit dessus : Contrôle
à l'onglet Général : on entre un nom à l'étiquette : calculer moyennes
à l'onglet Événements : à Exécuter l'action : on clique sur les (...) et on va récupérer la macro
On quitte le mode conception :
Affichage > Barres d'outils > Contrôle de formulaires (doit être coché)
On déselectionne le bouton "mode conception" pour rendre le bouton actif.
Pour que la macro fonctionne et inscrive les moyennes, il faut :
1/ sélectionner la plage de TOUTES les notes à la souris. Donc, de la note 1 du premier élève à la dernière note du dernière élève, absences comprises.
2/ cliquer sur le bouton "calculer moyennes" et laisser faire la magie !
Attention, il n'y a pas de gestion d'erreur, si la valeur est incohérente, exemple la note est 25 alors que le max est 20, la note ne sera pas prise en compte mais l'erreur ne sera pas indiquée.
J'envoie le lien :
https://mon-partage.fr/f/l7MbswN5/