Count if qui renvoie n'importe quoi

Résolu
melinette35 Messages postés 68 Date d'inscription mercredi 23 mai 2012 Statut Membre Dernière intervention 27 juillet 2012 - 12 juil. 2012 à 08:26
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 - 13 juil. 2012 à 11:22
Bonjour à tous !

Une nouvelle fois confrontée à un petit souci, je me tourne vers vous.

Je souhaite compter le nombre d'occurences d'une chaîne de caractère, pour chaque ligne de la colonne 13.

L'objectif est à terme: surligner les lignes dont le nombre d'occurences est supérieur à 2.

Afin de facilité le visuel de ma macro j'ai déjà trié les chaines par ordre croissant pour voir le nombre d'occurence de façon "manuelle".

voici donc le code de ma macro:

Sub CompteOccurence()

Dim Z As Integer
Dim Nom As String
Dim Nom1 As String
Dim M As Integer 'variable qui stockera le décompte
Dim MaPlage As Range

For Each Wb In Application.Workbooks
Nom = Wb.Name
    If Left(Nom, 7) = "Espèces" Then
    Nom1 = Nom
    Exit For
    Else
    End If
  
Next

Dim x As Byte, valeur As String
Z = Workbooks(Nom1).Worksheets("Feuil1").Range("M2").End(xlDown).Row

Set MaPlage = Worksheets("Feuil1").Range(Cells(2, 13), Cells(Z, 13))

For A = 2 To Z
    valeur = Cells(A, 13).Value
    x = Application.CountIf(MaPlage, valeur)
Next A

End Sub


Mon poblème a priori est le count if qui me renvoit a peu près n'importe quoi. Par exemple pour (M,2) il renvoit qu'il y a 6 occurences dans ma plage, ce qui est faux car il y a en 2 (ctrl F et grâce à mon tri je vois bien que yen a que deux).

Pour (M,3) il me renvoit 6 aussi, alors que la valeur est la même qu'en (M,3) soit 2.

Pouvez vous m'indiquer quelle est mon erreur avec le count if, ou sinon m'inquider une méthode alternative?

Je vous remercie beaucoup de votre aide.

45 réponses

ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
13 juil. 2012 à 09:45
Je ne parviens pas à simuler de mon côté une importation semblable à la tienne.
Il me semble cependant que le formatage de nombres rencontre une difficulté du fait que le "nombre" est trop grand.
Nous allons donc essayer (je suis en "aveugle") de procéder autrement :
Je suggère de formater la colonne 1 en texte avant l'importation, puis ceci (exemple) :

For Each c In Range("A1:A100")
  c.Value = Format(c.Value, "@@-@@@-@@@-@@@-@@@-@@@-@@@")
Next


Je m'aperçois par ailleurs de ce que tu as 20 caractères de départ, ce qui n'est pas divisible par trois, raison de mon découpage avec un groupe de 2, puis les autres de 3).
Teste et fais-moi savoir.
On est là sur un "cas" intéressant.

________________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches.
Pas d'aide en ligne installée ? => ne comptez pas sur moi pour simplement vous dire ce qu'elle contient. Je n'interviendrai qu'en cas de nécessité de développ
3
melinette35 Messages postés 68 Date d'inscription mercredi 23 mai 2012 Statut Membre Dernière intervention 27 juillet 2012
13 juil. 2012 à 10:14
Sub CompteNuméro()

Dim Z As Integer
Dim Nom As String
Dim Nom1 As String
Dim MaPlage As Range

For Each Wb In Application.Workbooks
Nom = Wb.Name
If Left(Nom, 7) = "Espèces" Then
Nom1 = Nom
Exit For
Else
End If

Next

Dim x As Byte, valeur As Variant
Z = Workbooks(Nom1).Worksheets("Feuil1").Range("M2").End(xlDown).Row

Set MaPlage = Worksheets("Feuil1").Range(Cells(2, 13), Cells(Z, 13))

For Each C In Range(Cells(2, 13), Cells(Z, 13))
C.Value = Format(C.Value, "@@-@@@-@@@-@@@-@@@-@@@-@@@")
Next

For A = 2 To Z
valeur = Cells(A, 13).Value
x = Application.CountIf(MaPlage, valeur)
If x > 2 Then
Rows(A & ":" & A).Interior.ColorIndex = 6
End If
Next A

End Sub


Done ! This is it !

You're the best !
3
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
13 juil. 2012 à 11:05
J'ai essayé de de l'expliquer plus haut :
Un nombre, une date, le résultat d'une formule, etc ... ont une propriété value (la valeur réelle qu'ils ont en mémoire de Excel) et une propriété text (qui n'est pas ce qui est conservé en mémoire, mais ce qui est affiché, tel qu'affiché
Une donnée texte est différente : elle est du texte et ce texte est conservé en mémoire lorsque sa transformation a été passée en propriété Value. Et c'est bien ce que nous avons fait par cette ligne de code :
c.Value = Format(c.Value, "@@-@@@-@@@-@@@-@@@-@@@-@@@")
Dès lors, la propriété Value est forcément la même que la propriété text, puisque nous en avons décidé ainsi.
Et cet aspect est important ! Car si tel n'avait pas été le cas, cette ligne :
x = Application.CountIf(MaPlage, valeur)
n'aurait pas "abouti" (CountIf regarde non ce qui est affiché, mais ce qui est bel et bien en mémoire).
Tu comprends ?

A ce propos (de Countif).
Il est préférable de l'utiliser avec WorkSheetFunction, dont il est un membre bien défini, qu'avec Application. Cela te mettra à l'abri de "surprises" éventuelles avec de nouvelles versions ; on ne sait jamais, même si jusqu'à présent, VBA ne montre assez "permissif". Application ne possède pas officiellement le membre Countif, que possède officiellement WorkSheetFunction ===>>
x = WorkSheetFunction .CountIf(MaPlage, valeur)
Voilà voilà.

________________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches.
Pas d'aide en ligne installée ? => ne comptez pas sur moi pour simplement vous dire ce qu'elle contient. Je n'interviendrai qu'en cas de nécessité de développ
3
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
12 juil. 2012 à 08:39
Bonjour,
Quattendraois-tu d"'autre avec ce que tu s écrit, à savoir :
For A = 2 To Z
    valeur = Cells(A, 13).Value
    x = Application.CountIf(MaPlage, valeur)
Next A

X, au sortir de cette boucle, aura la valeur correspondant à ta variable valeur au dernier tour de ta boucle (ta variable valeur étant alors égale à la valeur de Cells(Z,13))
________________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches.
Pas d'aide en ligne installée ? => ne comptez pas sur moi pour simplement vous dire ce qu'elle contient. Je n'interviendrai qu'en cas de nécessité de développ
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
melinette35 Messages postés 68 Date d'inscription mercredi 23 mai 2012 Statut Membre Dernière intervention 27 juillet 2012
12 juil. 2012 à 08:45
Bah j'ai mal dû faire mon code, car moi ce que je veux qu'il cherche:

c'est combien de fois dans ma plage il trouve la valeur de Cells(A, 13).

Ou alors j'ai rien compris au countif, vu l'inexistence d'explication dans l'aide vba d'excel 2003 et le peu que je trouve sur internet,

il est fort possible que je me trompe de syntaxe voir même tout simplement de fonction.
0
melinette35 Messages postés 68 Date d'inscription mercredi 23 mai 2012 Statut Membre Dernière intervention 27 juillet 2012
12 juil. 2012 à 08:48
Comme tu as dû le remarqué d'ailleurs "valeur" correspond à l'argument critère du nb.si, donc moi ça me semble être ça puisque pour trouver combien de fois j'ai "toto" dans ma plage j'aurai:

For A = 2 To Z
x = Application.CountIf(MaPlage, "toto")
Next A

C'est comme ça que j'ai compris cette fonction
0
Profil bloqué
12 juil. 2012 à 09:27
Salut ! dans ton code

Set MaPlage = Worksheets("Feuil1").Range(Cells(2, 13), Cells(Z, 13))

For A = 2 To Z
valeur = Cells(A, 13).Value
x = Application.CountIf(MaPlage, valeur)
Next A

Tu définis une plage avec Set Maplage : ok
tu définis la valeur dont il faut compter le nombre de cellules avec valeur : ok
Pourquoi faire un For Next !

Set MaPlage = Worksheets("Feuil1").Range(Cells(2, 13), Cells(Z, 13))
valeur = Cells(A, 13).Value
x = Application.CountIf(MaPlage, valeur)

Cela me parait plus logique comme cela

Countif compte sur une plage définie le nombre d’occurrences d'une expression choisie comme valeur
Le second paramètre de countif peut référencé une cellule,une chaine de caractères et même des expressions plus complexes ( exemple ">= 2000" )

La théorie, c'est quand on sait tout et que rien ne fonctionne. La pratique, c'est quand tout fonctionne et que personne ne sait pourquoi.

GRENIER Alain
0
melinette35 Messages postés 68 Date d'inscription mercredi 23 mai 2012 Statut Membre Dernière intervention 27 juillet 2012
12 juil. 2012 à 09:41
J'ai mis le for Next, car il faut pour chaque ligne: si le nombre d'occurences est >2 on met toute la ligne en couleur.

Après peut-être que ça sert à rien, mais sinon je ne vois pas comment mettre une condition de couleur.
0
melinette35 Messages postés 68 Date d'inscription mercredi 23 mai 2012 Statut Membre Dernière intervention 27 juillet 2012
12 juil. 2012 à 09:51
Je viens de découvrir un truc aussi: ma plage, les cellule ya un petit message quand on clic dessus c'est mis "nombre stocké sous forme de texte".

Est ce que ça ne viendrait pas de là le problème?

J'ai mis mettre en nombre puisj'ai rajouté le séprateur de millier (pour plus visible) et enfin j'ai enlevé les chiffres après la virgules (qui sont des 0 tout le temps) parce que j'ai cru comprendre qu'il n'en fallait pas.

Mais mes chaines de bases sont:

00003279280000000140
00003279280000000140
00003279280000000144
00003279280000000144
00003279280000000145
00003279280000000145
00003279280000000150
00003279280000000150
00003279280000000152
00003279280000000152
00003279280000000153
00003279280000000153
00003279280000000161
00003279280000000161
00003279280000000162
00003279280000000162
00003279280000000194
00003279280000000194
00003279280000000197
00003279280000000197

devient après arrangement:
3 279 280 000 000 140 
3 279 280 000 000 140 
3 279 280 000 000 140 
3 279 280 000 000 140 
3 279 280 000 000 140 
3 279 280 000 000 140 
3 279 280 000 000 150 
3 279 280 000 000 150 
3 279 280 000 000 150 
3 279 280 000 000 150 
3 279 280 000 000 150 
3 279 280 000 000 150 
3 279 280 000 000 160 
3 279 280 000 000 160 
3 279 280 000 000 160 
3 279 280 000 000 160 
3 279 280 000 000 190 
3 279 280 000 000 190 
3 279 280 000 000 190 
3 279 280 000 000 190 


Et là et uniquement là, le nb.si/ count if fonctionne.

Question: pourquoi est ce que mes chaînes sont ainsi transformées? Moi je suis larguée
0
Profil bloqué
12 juil. 2012 à 10:08
Attention au contenu de tes cellules ! elles peuvent contenir du texte ou des valeurs numériques
Maintenant si une cellule contient 2000 est-ce une valeur "texte" ou une valeur numérique ?
On retrouve le même problème avec les variables !
Maintenant je ne connais pas assez Excel

Pour ton problème de lignes je ferais
Pour ligne= 1 to 10 ( un exemple )
définir plage de cette ligne
définir la valeur à compter
le countif
if countif > 2 on met la ligne en couleur
Prochaine ligne

La théorie, c'est quand on sait tout et que rien ne fonctionne. La pratique, c'est quand tout fonctionne et que personne ne sait pourquoi.

GRENIER Alain
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
12 juil. 2012 à 10:41
Led séparateur de milliers ?
Mais un tel séparateur ne peut que concerner un nombre et non ce que tu as : une chaîne de caractères) !
Si tu_ veux que les choses soient à la fois claires et compatibles : ===>> format personnalisé : 000 000 000 000 000 000 000

________________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches.
Pas d'aide en ligne installée ? => ne comptez pas sur moi pour simplement vous dire ce qu'elle contient. Je n'interviendrai qu'en cas de nécessité de développ
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
12 juil. 2012 à 10:47
Et ce n'est pas tout !
S'agissant d'une chaîne de caractères et non d'un nombre d'une part, et cette chaîne de caractères ayant d'autre part été "formatée", il sera logique de ne pas utiliser la propriété Value, mais la propriété Text, bien évidemment ==)= >>

valeur = Cells(A, 13).Value
valeur = Cells(A, 13).Text

Question de cohérence ! n'asz(tu pas toi-même, d'ailleurs, typé ta valriable valeur en String ? Oui, n'est-ce-pas ?
________________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches.
Pas d'aide en ligne installée ? => ne comptez pas sur moi pour simplement vous dire ce qu'elle contient. Je n'interviendrai qu'en cas de nécessité de développ
0
melinette35 Messages postés 68 Date d'inscription mercredi 23 mai 2012 Statut Membre Dernière intervention 27 juillet 2012
12 juil. 2012 à 11:02
Ucfoutu, merci pour l'astuce, je pensais que pour faire appel au contenu du cellule on mettait .value.

je n'ai jamais eu a mettre .text puisque j'avais des chaînes caractères textes qui se faisaient appeler par le value et ça marchait bien.

Je test ça, mais l'erreur est la même.


Je suis désolée de ne pas utiliser les bons mots. quand j'utilise valeurs tu me dis que ça ne peut concerner que des chiffres, et quand j'utilise chaine de caractère tu me dis que c'est que du texte. Faudrait savoir de ton côté parce que j'utilise indifféremment valeur de chaines de caractères.

On dira que pour mon cas ici le contenu de mes cellules indiquent: nombres au format texte (ce sont donc des chaînes de caractères, mais aussi des valeurs.)


Bref tout ça pour dire que ça ne marche pas avec text, l'erreur est la même (avec un format personnalisé comme tu m'as bien conseillé)


Sub CompteNuméro()

Dim Z As Integer
Dim Nom As String
Dim Nom1 As String
Dim M As Integer 'variable qui stockera le décompte
Dim MaPlage As Range

For Each Wb In Application.Workbooks
Nom = Wb.Name
    If Left(Nom, 7) = "Espèces" Then
    Nom1 = Nom
    Exit For
    Else
    End If
  
Next

Dim x As Byte, valeur As String
Z = Workbooks(Nom1).Worksheets("Feuil1").Range("M2").End(xlDown).Row

Set MaPlage = Worksheets("Feuil1").Range(Cells(2, 13), Cells(Z, 13))

For A = 2 To Z

    valeur = Cells(A, 13).Text
    x = Application.CountIf(MaPlage, valeur)
Next A


End Sub



Je commence à désespérer, c'est toujours les même proiblèmes de formats...
0
melinette35 Messages postés 68 Date d'inscription mercredi 23 mai 2012 Statut Membre Dernière intervention 27 juillet 2012
12 juil. 2012 à 11:04
Ps: Mon séparateur de miliers est utilisé une fois les données converties en nombre comme me le dis gentilment excel.

Je suis certe bête, mais quand même.

Mais ce fichu séparateur de miliers me fais des arrondis etc non demandés et ça commence à m'énerver sec.
0
melinette35 Messages postés 68 Date d'inscription mercredi 23 mai 2012 Statut Membre Dernière intervention 27 juillet 2012
12 juil. 2012 à 11:10
Galain: je ne sais pas si c'est du texte ou du numérique: excel m'indique en aide: Nombre stocké au format texte.

Je suppose donc que j'ai des textes.


macro telle que me l'a demandé Galain.

Sub CompteNuméro()

Dim Z As Integer
Dim Nom As String
Dim Nom1 As String
Dim M As Integer 'variable qui stockera le décompte
Dim MaPlage As Range

For Each Wb In Application.Workbooks
Nom = Wb.Name
    If Left(Nom, 7) = "Espèces" Then
    Nom1 = Nom
    Exit For
    Else
    End If
  
Next

Dim x As Byte, valeur As String
Z = Workbooks(Nom1).Worksheets("Feuil1").Range("M2").End(xlDown).Row

Set MaPlage = Worksheets("Feuil1").Range(Cells(2, 13), Cells(Z, 13))

For A = 2 To Z

    valeur = Cells(A, 13).Text
    x = Application.CountIf(MaPlage, valeur)
    If x > 2 Then
    Rows(A & ":" & A).Interior.ColorIndex = 6
    Else
    End If
Next A


End Sub
 


Bien évidemment elle me met tout en jaune, puisque x ne prend pas les bonnes valeurs.


Je suis sûre que c'est un problème de format comme le disent Galain et ucfoutu, mais je suis loin d'être à l'aise avec ces problèmes pour le moment.

Si vous avez une idée... en tout cas je vous remercie.
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
12 juil. 2012 à 11:24
quand j'utilise valeurs tu me dis que ça ne peut concerner que des chiffres, et quand j'utilise chaine de caractère tu me dis que c'est que du texte. Faudrait savoir de ton côté parce que j'utilise indifféremment valeur de chaines de caractères.

Je n'ai nulle part dit une telle chose !
Je t'invite donc à ouvrir (et à lire) ton aide VBA pour comprendre ce que sont les propriétés Value et Text ! (dans ton cas : c'est la propriété text, qui est inévitable, non du fait que c'est un string, que tu traites, mais du fait qu'il est formaté (et donc transformé)). La propriété text (à lire, s'il te plait) retourne le contenu formaté, tel qu'affiché. La propriété Value, elle, non ! Difficile de comprendre ça ? Lis ton aide VBA (une fois de plus) à ce propos.


________________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches.
Pas d'aide en ligne installée ? => ne comptez pas sur moi pour simplement vous dire ce qu'elle contient. Je n'interviendrai qu'en cas de nécessité de développ
0
melinette35 Messages postés 68 Date d'inscription mercredi 23 mai 2012 Statut Membre Dernière intervention 27 juillet 2012
12 juil. 2012 à 11:33
De même, apprends à lire:

"Bref tout ça pour dire que ça ne marche pas avec text, l'erreur est la même (avec un format personnalisé comme tu m'as bien conseillé) "

Ton .text ne change strictement RIEN, alors bien qu'inévitable (je l'ai bien intégré) elle ne marche absoluement pas.

Sub CompteNuméro()

Dim Z As Integer
Dim Nom As String
Dim Nom1 As String
Dim MaPlage As Range

For Each Wb In Application.Workbooks
Nom = Wb.Name
    If Left(Nom, 7) = "Espèces" Then
    Nom1 = Nom
    Exit For
    Else
    End If
  
Next

Dim x As Byte, valeur As String
Z = Workbooks(Nom1).Worksheets("Feuil1").Range("M2").End(xlDown).Row

Set MaPlage = Worksheets("Feuil1").Range(Cells(2, 13), Cells(Z, 13))

For A = 2 To Z

    valeur = Cells(A, 13).Text
    x = Application.CountIf(MaPlage, valeur)
    If x > 2 Then
    Rows(A & ":" & A).Interior.ColorIndex = 6
    Else
    End If
Next A


End Sub


Je ne comprends toujours pas pourquoi le count if me renvoit encore et toujours n'importe quoi.

Concentrons nous sur le problème: le format. Et pas le text puisque ça ça fait longtemps que je l'ai mis et que ça plante bien comme il faut.
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
12 juil. 2012 à 13:55
Ecoute : je suis vieux et fatigué et n'ai pas l'intention de transformer en cours particulier un simple problème de compréhension. Et j'ai une sieste indispensable qui m'attend.
Je vais alors faire en sorte que tu aies ta soluce en uniformisant tout en texte pur (ce qui permet d'oublier la propriété text, car alors = la propriété value). On en finit donc là et je peux aller au dodo :
For A = 2 To Z
    valeur = Cells(A, 13).Value
    x = Application.CountIf(maplage, valeur)
    If x > 2 Then
      Rows(A & ":" & A).Interior.ColorIndex = 6
    End If
  Next A

Attention, maintenant : cela implique que tu as formaté les colonnes concernées (B et M, donc) en "personnalisée" : 000-000-000-000-000-000
Testé chez moi et sans faille.
Bonne sieste à toi également (moi, je n'ai pas besoin qu'on me le souhaite, hein... elle s'impose seule...).


________________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches.
Pas d'aide en ligne installée ? => ne comptez pas sur moi pour simplement vous dire ce qu'elle contient. Je n'interviendrai qu'en cas de nécessité de développ
0
melinette35 Messages postés 68 Date d'inscription mercredi 23 mai 2012 Statut Membre Dernière intervention 27 juillet 2012
12 juil. 2012 à 15:23
" 000-000-000-000-000-000"

Cela implique que quand je mets le format personalisé de cette manière avec les "-" en plus ???
Parce que pas ça ne change rien...

Je sais pas si ce lien sera effacé par les modo: mais c'est à peu près ça mon problème.

http://www.clubic.com/forum/logiciel-general/excel-format-de-cellules-personnalise-mettre-la-cellule-en-format-rib-id161708-page1.html

Mais moi au lieu du format ingénieur, c'est le format scientifique.

En tout cas je te remercie de ta patience.

Je ne sais plus trop comment procéder...
0
melinette35 Messages postés 68 Date d'inscription mercredi 23 mai 2012 Statut Membre Dernière intervention 27 juillet 2012
12 juil. 2012 à 15:33
qestion bête me diras tu:

Je cherche un moyen d'appliquer le style pour toute ma colonne M.

Quand je fais via format>cellule... ça fonctionne pas.

Et ce n'est qu'apprès quand je me place sur chaque cellule, que je clique plusieurs dessus et bah ça se met bien... je ne comprends plus trop du coup...
0
Rejoignez-nous