Fonction Countif
Bonjour,
je bloque sur l'utilisation de la fonction "Countif" en VBA équivalente de NB.SI.
Voilà ma situation : je dispose d'une colonne de notes avec une entête qui précise sur combien porte les notes (exemple d'entête : "/5")
L'utilisateur saisit sa série de notes d’où la procédure du type Worksheet_SelectionChange qui me permet de corriger en temps réel les erreurs de saisies (autre que numérique, <0, > à la note max possible...)
Je souhaiterais que s'affiche sous la colonne le nombre de cellule (nombre de notes) qui n'atteint pas la moyenne. Pour cela :
J'extrais de la chaine "/5" le nombre 5, ensuite je le divise par 2 et j'insère le résultat dans ma fonction COUNTIF.
Mon problème est le suivant : si la division m'amène un nombre entier (ex note sur 6, moyenne = 6 / 2 = 3) la fonction COUNTIF fonctionne parfaitement. Par contre si la division m'amène un nombre décimal (ex note sur 5, moyenne = 5 / 2 = 2.5) la fonction COUNTIF me renvoie 0. Sans VBA la fonction NB.SI tapée dans la cellule sous les notes fonctionne TB avec 2.5
Que dois-je faire ?
Voici mon code
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
Dim maplage As Range, ligne As Byte, note_moy As Currency
ligne = Range("A50").End(xlUp).Row 'j'affecte à ligne le numéro de la dernière ligne contenant une note
Set maplage = Sheets(1).Range(Cells(3, 2), Cells(ligne, 2)) 'Je définis la plage dans laquelle se trouveront les notes à saisir
note_moy = CCur((Right(Cells(2, 1), Len(Cells(2, 2)) - 1)) / 2) 'J'extrais de la chaine la note sur laquelle porte l'évaluation et je la divise par 2
Cells(ligne + 1, 2) = Application.CountIf(Range(Cells(3, 2), Cells(ligne, 2)), "<" & note_moy) 'Sous la série de note, j'affiche combien il y a de notes en dessous de la note moyenne
End Sub
Merci pour vos idées.
J'ai corrigé qqs petites erreurs dans mon code et clarifier encore quelques points
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
Dim maplage As Range, ligne As Byte, note_moy As Currency
ligne = Range("A50").End(xlUp).Row 'j'affecte à ligne le numéro de la dernière ligne contenant un élève
Set maplage = Range(Cells(3, 2), Cells(ligne, 2)) 'Je définis la plage dans laquelle se trouveront les notes à saisir (dans la colonne 2)
note_moy = CCur((Right(Cells(2, 2), Len(Cells(2, 2)) - 1)) / 2) 'J'extrais de la chaine située en "B2" la note sur laquelle porte l'évaluation et je la divise par 2
Cells(ligne + 1, 2) = Application.CountIf(Range(Cells(3, 2), Cells(ligne, 2)), "<" & note_moy) 'Sous la série de note, j'affiche combien il y a de notes en dessous de la note moyenne
End Sub
Bonsoir,
ne serait-ce pas du à un problème de format ?
en effet "/5" est string ; extraction du 5 reste 5 en string... alors couper en deux ça donne quoi ?
essayer avec CDbl()
ce qui donne :
CDbl((Right(Cells(2, 1), Len(Cells(2, 2)) - 1)) / 2)
pas essayé...
@ bientôt
LouReeD
Bonjour
A tester
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
Dim maplage As Range, ligne As Byte, note_moy As Currency
ligne = Range("A50").End(xlUp).Row 'j'affecte à ligne le numéro de la dernière ligne contenant un élève
Set maplage = Range(Cells(3, 2), Cells(ligne, 2)) 'Je définis la plage dans laquelle se trouveront les notes à saisir (dans la colonne 2)
note_moy = CCur((Right(Cells(2, 2), Len(Cells(2, 2)) - 1)) / 2) 'J'extrais de la chaine située en "B2" la note sur laquelle porte l'évaluation et je la divise par 2
Cells(ligne + 1, 2) = Application.CountIf(Range(Cells(3, 2), Cells(ligne, 2)), "<" & Replace(note_moy, ",", ".")) 'Sous la série de note, j'affiche combien il y a de notes en dessous de la note moyenne
End Sub
Un avis: Tu devrais utiliser l'évènement change dans la zone des notes, actuellement dès que tu changes de cellule active, la macro est exécutée
Merci beaucoup Banzai64.
La fonction "replace" m'a permis de résoudre le problème. Du coup, je n'ai pas essayé avec la proposition de LouReed.
Bonne journée.
Snif...
@ bientôt
LouReeD