Fonction Countif

Y compris Power BI, Power Query et toute autre question en lien avec Excel
s
stepel70
Nouveau venu
Nouveau venu
Messages : 2
Inscrit le : 27 octobre 2015
Version d'Excel : 2010

Message par stepel70 » 27 octobre 2015, 22:26

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
Avatar du membre
LouReeD
Contributeur
Contributeur
Messages : 5'844
Appréciations reçues : 240
Inscrit le : 14 octobre 2014
Version d'Excel : 2013 FR, 2016 FR
Contact :
Téléchargements : Mes applications

Message par LouReeD » 27 octobre 2015, 22:51

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
Contributeur depuis peu ! 8-)
Quelques règles à lire ICI ;;)
______________________________________________________Vous pouvez allez faire un tour sur : Index de "Mes applications" ;;)
Avatar du membre
Banzai64
Fanatique d'Excel
Fanatique d'Excel
Messages : 16'726
Appréciations reçues : 3
Inscrit le : 21 novembre 2010
Version d'Excel : 2003 FR (learning 2010 - 2013)

Message par Banzai64 » 27 octobre 2015, 23:36

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
Image
s
stepel70
Nouveau venu
Nouveau venu
Messages : 2
Inscrit le : 27 octobre 2015
Version d'Excel : 2010

Message par stepel70 » 28 octobre 2015, 10:20

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.
Avatar du membre
LouReeD
Contributeur
Contributeur
Messages : 5'844
Appréciations reçues : 240
Inscrit le : 14 octobre 2014
Version d'Excel : 2013 FR, 2016 FR
Contact :
Téléchargements : Mes applications

Message par LouReeD » 28 octobre 2015, 19:09

Snif...

@ bientôt

LouReeD
Contributeur depuis peu ! 8-)
Quelques règles à lire ICI ;;)
______________________________________________________Vous pouvez allez faire un tour sur : Index de "Mes applications" ;;)
Répondre Sujet précédentSujet suivant
  • Sujets similaires
    Réponses
    Vues
    Dernier message