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

Rechercher des sujets similaires à "fonction countif"