countif vba ( resolu)

fifi56

XLDnaute Junior
bonjour

je souhaite compter le nombre de fois ou apparaît un mot dans une plage variable


pierre
points commentaire
bon
passsable
passable
bon
medicore
bon
tres bon

paul commentaire
mediocre
passable
bon
bon
mediocre

je souhaiterais savoir combien de fois pour pierre on trouve le mot mediocre , idem ensuite pour paul

ci joint un fichier excel avec macro
 

Pièces jointes

  • countif.xlsm
    13.7 KB · Affichages: 33
  • countif.xlsm
    13.7 KB · Affichages: 34
  • countif.xlsm
    13.7 KB · Affichages: 36
Dernière édition:

fifi56

XLDnaute Junior
Re : countif vba

merci pour la reponse mais cela ne convient pas

aussi bien Pierre peux avoir 10 commentaires ou 5 commentaires donc je ne peux pas dire a excel
prend pour Pierre de la cellule c6 a c12 car parfois cela sera de la cellule c6 a c10 et parfois de c6 a c33

c'est pourquoi j'utilie vba et je cherche le mot " commentaire" qui est mon point de depart dans un boucle mais c'est apres je en sais pas trop comment faire pour lui dire stop si cellule vide ?
 

Yaloo

XLDnaute Barbatruc
Re : countif vba

Bonsoir à tous,

Avec une fonction personnalisée dans le Module1
Le premier argument étant le prénom et le second étant le commentaire.
VB:
Private Function RechComm(prenom As Range, comm As Range)
Dim lp&, fc&
Application.Volatile
lp = Application.Match(prenom, Columns(1), 0)
fc = Cells(Cells(lp, 3).End(4).Row, 3).End(4).Row
RechComm = Application.WorksheetFunction.countif(Range(Cells(lp, 3), Cells(fc, 3)), comm)
End Function
A+

Martial

Edit: Salut Staple, bien ta macro, je connaissais pas Rept :rolleyes:
 

Pièces jointes

  • countif.xlsm
    17.8 KB · Affichages: 46
  • countif.xlsm
    17.8 KB · Affichages: 42
  • countif.xlsm
    17.8 KB · Affichages: 32
Dernière édition:

Staple1600

XLDnaute Barbatruc
Re : countif vba

Bonsoir à tous

Avec un réagencement plus cohérent des données, le code ci-dessous fonctionne
(cliquer sur l'image pour l'afficher en taille réelle)
01countif.png
Code:
Sub testOk()
Dim c As Range, p As Range, i&
i = 5
    For Each c In Columns(1).SpecialCells(xlCellTypeConstants, 2)
    Set p = Range(c.CurrentRegion.Item(3).Address).Resize(c.CurrentRegion.Rows.Count)
    Cells(i, "I").Value = Application.countif(p, [I4])
    Cells(i, "J").Value = Application.Rept("non présent", Cells(i, "I") = 0)
    i = i + 1
    Next
End Sub

EDITION: Bonsoir Yaloo (je t'avais pas vu passé)
 

fifi56

XLDnaute Junior
Re : countif vba

bonjour et merci a vous pour vos réponses , cela fonctionne sur mon exemple ! a moi de le retranscrire correctement

je pense choisir le de Staple , comme j'aurai sans doute d'autres choses a chercher également plus tard , je pense qu'un module est plus appropriée qu'une Private Function


par contre est il possible de m'expliquer comment fonctionne le code de staple
par exemple je ne comprend pas pourquoi , la colonne B ne doit pas être vide a cote du prénom ?

oups je test le code en meme tps que j'ecris ce message et , au final il ne convient pas ...
( c'est de ma faute j'ai mal fait mon fichier exemple ):rolleyes:
 

fifi56

XLDnaute Junior
Re : countif vba

desole je vous est induit en erreur , je devrais faire mon fichier exemple 7 fois dans ma tete avant de le poster sur le forum
voici a quoi il ressemble le nouveau fichier

pierre points commentaire
09/12/2014 test11 bon
25/11/2014 test 9 passsable
10/11/2014 test 8 passable
01/11/2014 test 7 bon
09/10/2014 test5 mediocre
08//10/2014test4 bon
28/09/2014 test 3 mediocre

paul points commentaire
09/12/2014 test11 mediocre
25/11/2014 test 9 passable
10/11/2014 test5 bon
01/11/2014 test 7 bon
28/09/2014 test 1 mediocre
 

Pièces jointes

  • countif2.0.xlsm
    16.5 KB · Affichages: 32

Staple1600

XLDnaute Barbatruc
Re : countif vba

Bonjour à tous


Mon code fonctionne sur ta nouvelle PJ si tu veilles aux deux choses suivantes:
1) à avoir des vrais dates en colonne A
Ce qui n'est pas le cas actuellement, non...:rolleyes:
Il y a une cellule qui contient une date mal saisie : 08//03/2015

2) Et en I4, on peut lire mediocres au lieu de mediocre

NB: D'ailleurs on écrit médiocre et pas mediocre.:rolleyes:
 

Staple1600

XLDnaute Barbatruc
Re : countif vba

Suite

Une petite amélioration
1) En I4, ajouter une liste de validation avec Données/Validation
(cf copie d'écran: cliquer sur l'image pour l'afficher en grand)
01donvalid.png

2) Corrigez toutes les erreurs de saisie, supprimer les espaces surnuméraires dans la colonne C
3) Enfin copier le code VBA dans le code de la feuille (et pas dans un module standard)
Code:
Private Sub Worksheet_Change(ByVal Target As Range)
Dim c As Range, p As Range, i&
Application.ScreenUpdating = False
If Target.Address = "$I$4" Then
i = 5
Application.EnableEvents = False
    For Each c In Columns(1).SpecialCells(xlCellTypeConstants, 2)
    Set p = Range(c.CurrentRegion.Item(3).Address).Resize(c.CurrentRegion.Rows.Count)
    Cells(i, "I").Value = Application.countif(p, [I4])
    Cells(i, "J").Value = Application.Rept("non présent", Cells(i, "I") = 0)
    i = i + 1
    Next
Application.EnableEvents = True
End If
Application.ScreenUpdating = True
End Sub

EDITION :Ci-dessous une variante pour le fun (à mettre dans un module)
Mais dans ce cas, on ôte la procédure événementielle
Code:
Sub UnMixEntreMacroEtFormules()
Dim c As Range, p As Range, i&
i = 5
    For Each c In Columns(1).SpecialCells(xlCellTypeConstants, 2)
    Set p = Range(c.CurrentRegion.Item(3).Address).Resize(c.CurrentRegion.Rows.Count)
    Cells(i, "I").FormulaLocal = "=NB.SI(" & p.Address & ";$I$4)"
    Cells(i, "J").FormulaR1C1 = "=REPT(""non présent"",RC[-1]=0)"
    i = i + 1
    Next
End Sub
 

Si...

XLDnaute Barbatruc
Re : countif vba

salut

pour le fun, comme Staple : utilisation de listes de validation pour éviter les fautes de frappe , de plages nommées pour itou ;) et ajout aussi d'une MFC pour faire joli.
Code:
Private Sub Worksheet_Change(ByVal R As Range)
  If R.Address <> "$I$4" Then Exit Sub
  Dim C As Range, P As Range, i As Byte, n As Byte
  i = 5
  For Each C In [Noms]
    Set P = C(2, 3).Resize(C(2, 3).CurrentRegion.Rows.Count - 1)
    n = Application.countif(P, R.Value)
    Cells(i, 9) = IIf(n = 0, "absent", n)
    i = i + 1
  Next
End Sub
 

Pièces jointes

  • CountIf.xlsm
    17.9 KB · Affichages: 45
  • CountIf.xlsm
    17.9 KB · Affichages: 57
  • CountIf.xlsm
    17.9 KB · Affichages: 61
Dernière édition:

fifi56

XLDnaute Junior
Re : countif vba

zut je en vais jamais en finir avec ma question :( , j’ai plus de mal que je ne pensais a adapter les différents code

mon nouveau souci est que je prend les infos sur une feuille et que j'affiche les résultats dans une autre
on va dire je prend les " appréciations" en feuil1 et je veux afficher les résultat en feuil2
j'active la 1 ere page avec Sheets("feuil1").Select , je rentre dans la boucle j’active la seconde feuil2 et j’écris dans la cellule ( mais ca merdouille ) ou alors je donnne la valeur qui sera affiche a une variable dans la boucle , et lorsque je sort de la boucle j'ouvre la page 2 et j'affiche ou dans une cellule

mais ca en fonctionne pas non plus :confused:
 

Discussions similaires

Statistiques des forums

Discussions
312 386
Messages
2 087 854
Membres
103 671
dernier inscrit
rachid1983