Compter le nombre de cellule
ppil
Messages postés
34
Statut
Membre
-
Polux31 Messages postés 7219 Statut Membre -
Polux31 Messages postés 7219 Statut Membre -
Bonjour,
Voici mon problème:
Je souhaiterai compter le nombre de cellule contenant une certaine donnée (TEXTE) dans un RANGE connu.
Exemple:
Cellule Texte dans la cellule
A1 Test1
A2 Test4
A3 Test1
A4 Test1
A5 Test3
A6 Test4
Ce dont je souhaiterai compter c'est le nombre de cellule comptenant le texte "TEST1".
Pour mon exemple le résultat serai 3.
J'ai beaucoup de cellules à analyser, comportant plusieurs critères.
Donc je ne voulais pas faire une simple boucle avec l'instruction For...Next. Et voici le code que j'ai écrit, mais il ne marche pas.
Ma question est pourquoi?
Dim rng As Range
With ThisWorkbook.Worksheets("Rapport hebdomadaire")
Set rng = .Range("A1:A6").Count.Text = "Test1"
MsgBox (rng)
End With
Merci pour votre aide.
ppil
Voici mon problème:
Je souhaiterai compter le nombre de cellule contenant une certaine donnée (TEXTE) dans un RANGE connu.
Exemple:
Cellule Texte dans la cellule
A1 Test1
A2 Test4
A3 Test1
A4 Test1
A5 Test3
A6 Test4
Ce dont je souhaiterai compter c'est le nombre de cellule comptenant le texte "TEST1".
Pour mon exemple le résultat serai 3.
J'ai beaucoup de cellules à analyser, comportant plusieurs critères.
Donc je ne voulais pas faire une simple boucle avec l'instruction For...Next. Et voici le code que j'ai écrit, mais il ne marche pas.
Ma question est pourquoi?
Dim rng As Range
With ThisWorkbook.Worksheets("Rapport hebdomadaire")
Set rng = .Range("A1:A6").Count.Text = "Test1"
MsgBox (rng)
End With
Merci pour votre aide.
ppil
A voir également:
- Compter le nombre de cellule
- Nombre de jours entre deux dates excel - Guide
- Excel compter cellule couleur sans vba - Guide
- Proteger cellule excel - Guide
- Excel cellule couleur si condition texte - Guide
- Excel si cellule contient partie texte ✓ - Forum Excel
16 réponses
Bonjour,
Première remarque que m'inspire ton code : le "set" est de trop...
"Set" sert à déclarer une variable de type "objet" (un répertoire, un fichier, une feuille...)
Alors que là, tu déclares une variable "normale". Essaye sans le set...
Je retourne à la banque et je m'y repenche...
@ toute ;)
Teteve
Première remarque que m'inspire ton code : le "set" est de trop...
"Set" sert à déclarer une variable de type "objet" (un répertoire, un fichier, une feuille...)
Alors que là, tu déclares une variable "normale". Essaye sans le set...
Je retourne à la banque et je m'y repenche...
@ toute ;)
Teteve
Teteve,
J'ai essayé sans, mais la macro s'arrête sur la ligne où j'ai supprimé le "Set".
Merci d'avance pour la suite des recherches de la solution.
ppil
J'ai essayé sans, mais la macro s'arrête sur la ligne où j'ai supprimé le "Set".
Merci d'avance pour la suite des recherches de la solution.
ppil
Salut !
Si je ne me trompe , tu as déjà
Dans le forum Bureautique , tu as une demande "traitement d'une chaine de caractères"
qui s'apparente bien à ce que tu cherches.
Si je ne me trompe , tu as déjà
Dans le forum Bureautique , tu as une demande "traitement d'une chaine de caractères"
qui s'apparente bien à ce que tu cherches.
xkristi,
Après lecture de "traitement d'une chaine de caractères dans le forum, cela ne s'apparente pas à ce dont je recherche.
Mais, MERCI quand même.
ppil
Après lecture de "traitement d'une chaine de caractères dans le forum, cela ne s'apparente pas à ce dont je recherche.
Mais, MERCI quand même.
ppil
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
xkristi,
Petit complèment par rapport à mon message précédent .
Les réponses données dans "traitement d'une chaine de caractères " concerne la recherche pour UNE cellule. Dans mon cas, il s'agit de plusieures cellules. La problèmatique est un peu différente.
ppil
Petit complèment par rapport à mon message précédent .
Les réponses données dans "traitement d'une chaine de caractères " concerne la recherche pour UNE cellule. Dans mon cas, il s'agit de plusieures cellules. La problèmatique est un peu différente.
ppil
Bonjour,
J'ai découvert une petite erreure dans mon code. Voici la version corrigée:
Dim irngNb As Integer
Dim rng As Range
With ThisWorkbook.Worksheets("Rapport hebdomadaire")
Set rng = .Range("A1:A6").
irngNb = rng.Count.Text = "Test1"
MsgBox (irngNb)
End With
Mais ce code ne fontionne toujours pas. J'ai ce message d'erreure:
Erreur de compilation: Qualificateur incorrect
Que dois-je faire?
Merci pour votre aide.
ppil
J'ai découvert une petite erreure dans mon code. Voici la version corrigée:
Dim irngNb As Integer
Dim rng As Range
With ThisWorkbook.Worksheets("Rapport hebdomadaire")
Set rng = .Range("A1:A6").
irngNb = rng.Count.Text = "Test1"
MsgBox (irngNb)
End With
Mais ce code ne fontionne toujours pas. J'ai ce message d'erreure:
Erreur de compilation: Qualificateur incorrect
Que dois-je faire?
Merci pour votre aide.
ppil
Bonsoir,
Euh... je me suis replongé dans l'problème, mais j'avoue que je sèche un peu... Voire même beaucoup !!!
La seule chose que je peux te dire avec mes maigres connaissances est :
Set rng = .Range("A1:A6"). <== il doit manquer un bout, je ne crois pas qu'en VBA on puisse terminer une ligne par un point...
Et le code, "en français", ne me parait pas "logique" :
With ThisWorkbook.Worksheets("Rapport hebdomadaire") / Avec chaque élément de la collection des feuilles "Rapport hebdo" de ce classeur (ou : avec chaque feuille "Rapport hebdo" pour faire plus simple...)
Tu ne peux pas avoir plusieurs feuilles portant le même nom dans un classeur...
Set rng = .Range("A1:A6"). / déclarer l'objet "rng" a priori comme un ensemble de cellules
...etc...Affichage...
Fin du with...
Je peux toujours te proposer des "for each" si tu me donnes tous les critères (ou un "squelette" si tu me donnes quelques indications)
Je vais continuer à chercher un peu, mais je ne te garantis rien du tout...
Si un programmeur éclairé en VBA peut se pencher sur le sujet, je suis preneur de la solution (ou au moins d'une solution...)
Euh... je me suis replongé dans l'problème, mais j'avoue que je sèche un peu... Voire même beaucoup !!!
La seule chose que je peux te dire avec mes maigres connaissances est :
Set rng = .Range("A1:A6"). <== il doit manquer un bout, je ne crois pas qu'en VBA on puisse terminer une ligne par un point...
Et le code, "en français", ne me parait pas "logique" :
With ThisWorkbook.Worksheets("Rapport hebdomadaire") / Avec chaque élément de la collection des feuilles "Rapport hebdo" de ce classeur (ou : avec chaque feuille "Rapport hebdo" pour faire plus simple...)
Tu ne peux pas avoir plusieurs feuilles portant le même nom dans un classeur...
Set rng = .Range("A1:A6"). / déclarer l'objet "rng" a priori comme un ensemble de cellules
...etc...Affichage...
Fin du with...
Je peux toujours te proposer des "for each" si tu me donnes tous les critères (ou un "squelette" si tu me donnes quelques indications)
Je vais continuer à chercher un peu, mais je ne te garantis rien du tout...
Si un programmeur éclairé en VBA peut se pencher sur le sujet, je suis preneur de la solution (ou au moins d'une solution...)
bonjour,
test ça :
Dim r As Integer
Dim rang As String
Dim nb As Integer
r = 1
rang = "A"
With Worksheets(1)
While .Range(rang & r).Value <> ""
If .Range(rang & r).Value = "test1" Then
nb = nb + 1
End If
r = r + 1
Wend
MsgBox nb
End With
End Sub
ça marche chez moi
;o)
test ça :
Dim r As Integer
Dim rang As String
Dim nb As Integer
r = 1
rang = "A"
With Worksheets(1)
While .Range(rang & r).Value <> ""
If .Range(rang & r).Value = "test1" Then
nb = nb + 1
End If
r = r + 1
Wend
MsgBox nb
End With
End Sub
ça marche chez moi
;o)
Bonsoir à tous,
Ou bien :
Ou encore, dans le cas ou l'étendue de la plage n'est pas connue :
Cordialement.
Ou bien :
For each cel in range("A1:A6").cells
If cel.value = "test1 Then n=n+1
Next
MsgBox n
Ou encore, dans le cas ou l'étendue de la plage n'est pas connue :
For each cel in range("A1:A65536").cells
If cel.Value="" then exit For
If cel.Vvalue = "test1 Then n=n+1
Next
MsgBox n
Cordialement.
Bon, je n'ai pas besoin de faire mon chtit "for each"... :)
Savez vous néanmoins si l'idée de départ de ppil était exploitable en VBA ? => sans passer par un compteur (nb ou n)
Si oui, la mise en forme du code complet m'intéresse, vu que je ne connait pas très bien toutes les fonctions et propriétés des objets excel
Merci
Teteve
Savez vous néanmoins si l'idée de départ de ppil était exploitable en VBA ? => sans passer par un compteur (nb ou n)
Si oui, la mise en forme du code complet m'intéresse, vu que je ne connait pas très bien toutes les fonctions et propriétés des objets excel
Merci
Teteve
bonjour,
Les deux solutions de Papou fonctionnent très bien.
Si j'ai déclaré rang pour la colonne et r pour la ligne c'est simplement pour permettre de passer la colonne et la ligne en paramètre dans la fonction. On peut également passer le paramètre à tester, ainsi la fonction devient portable et peut être utilisée pour d'autres colonnes avec un paramètre à tester différent, du genre :
function CompteTest (Byval sCol As String, Byval iLig As Integer, Byval vStr As Variant) As Integer
Dim nb As Integer
With Worksheets(1)
While .Range(sCol & sLig).Value <> ""
If .Range(rang & r).Value = vStr Then
nb = nb + 1
End If
sLig = sLig + 1
Wend
End With
CompteTest = nb
End Function
Quant à la question concernant l'idée de ppil, je ne sais pas ... de toute évidence ça ne fonctionne pas.
Les 2 solutions de Papou me semble simple, bien et surtout répondre au besoin attendu de la fonction ... pourquoi refaire ce qui existe ? Maintenant, comme on dit "choisit ton camp camarade" ;o)
Bon courage,
Cordialement,
Polux
Les deux solutions de Papou fonctionnent très bien.
Si j'ai déclaré rang pour la colonne et r pour la ligne c'est simplement pour permettre de passer la colonne et la ligne en paramètre dans la fonction. On peut également passer le paramètre à tester, ainsi la fonction devient portable et peut être utilisée pour d'autres colonnes avec un paramètre à tester différent, du genre :
function CompteTest (Byval sCol As String, Byval iLig As Integer, Byval vStr As Variant) As Integer
Dim nb As Integer
With Worksheets(1)
While .Range(sCol & sLig).Value <> ""
If .Range(rang & r).Value = vStr Then
nb = nb + 1
End If
sLig = sLig + 1
Wend
End With
CompteTest = nb
End Function
Quant à la question concernant l'idée de ppil, je ne sais pas ... de toute évidence ça ne fonctionne pas.
Les 2 solutions de Papou me semble simple, bien et surtout répondre au besoin attendu de la fonction ... pourquoi refaire ce qui existe ? Maintenant, comme on dit "choisit ton camp camarade" ;o)
Bon courage,
Cordialement,
Polux
Bonjour Polux,
La solution de ppil ne fonctionne pas... C'est bien pour ça que j'demandais si quelqu'un savait la formuler de façon à ce que ça fonctionne en restant dans le même "esprit" (pas de compteur, uniquement des fonctions et procédures "brutes")
Mon camp est déjà tout choisi : entre les solutions proposées qui fonctionnent et que je connais ("suis capable de refaire" plutôt) et une autre totalement inconnue, j'opte pour apprendre celle que je ne maitrise pas du tout ! :)
Quel est l'intérêt d'apprendre ce que l'on sait déjà ?
Je sais, j'aime bien chercher la chtite bêbête... Mais c'est comme ça que j'en apprends tous les jours...
Teteve
La solution de ppil ne fonctionne pas... C'est bien pour ça que j'demandais si quelqu'un savait la formuler de façon à ce que ça fonctionne en restant dans le même "esprit" (pas de compteur, uniquement des fonctions et procédures "brutes")
Mon camp est déjà tout choisi : entre les solutions proposées qui fonctionnent et que je connais ("suis capable de refaire" plutôt) et une autre totalement inconnue, j'opte pour apprendre celle que je ne maitrise pas du tout ! :)
Quel est l'intérêt d'apprendre ce que l'on sait déjà ?
Je sais, j'aime bien chercher la chtite bêbête... Mais c'est comme ça que j'en apprends tous les jours...
Teteve
tu n'as pas du bien chercher la "chtite bêbête" ...
Cette déclaration mélange méthode et propriété avec en plus deux égalités : Set rng = .Range("A1:A6").Count.Text = "Test1" .... plutôt surréaliste ... tout autant que :
Set rng = .Range("A1:A6").
irngNb = rng.Count.Text = "Test1"
mais l'avenir est peut être là ... qui sait ... pour ma part je pense que les bons vieux compteurs dans les bonnes vieilles boucles ont encore de beaux jours devant eux ...
Cette déclaration mélange méthode et propriété avec en plus deux égalités : Set rng = .Range("A1:A6").Count.Text = "Test1" .... plutôt surréaliste ... tout autant que :
Set rng = .Range("A1:A6").
irngNb = rng.Count.Text = "Test1"
mais l'avenir est peut être là ... qui sait ... pour ma part je pense que les bons vieux compteurs dans les bonnes vieilles boucles ont encore de beaux jours devant eux ...
Bonjour,
Instancier une variable de type Int avec "set" ne fonctionne pas.
Mettre plusieurs " = " sur la même ligne ne fonctionne pas.
Prendre une collection de plusieurs feuilles de même nom et du même classeur ne fonctionne pas.
Finir une ligne par un " . " ne fontionne pas
Ecrire n'importe quoi ne fontionne pas...
J'oubliais : écrire en français plutôt qu'en anglais ne fonctionne pas non plus...
Jusque là, j'suis d'accord... Dois je marquer tout ce qui ne fonctionne pas et tous les bouts de code que j'ai essayé pour montrer que j'ai cherché "avec des principes de VB qui fonctionnent" ?
Lire un message d'erreur d'exécution est encore à ma portée (enfin j'crois...)
Donc si quelqu'un sait s'il y a une façon de procéder autre qu'avec un compteur ET avec une syntaxe correcte, je suis toujours preneur...
Teteve
Instancier une variable de type Int avec "set" ne fonctionne pas.
Mettre plusieurs " = " sur la même ligne ne fonctionne pas.
Prendre une collection de plusieurs feuilles de même nom et du même classeur ne fonctionne pas.
Finir une ligne par un " . " ne fontionne pas
Ecrire n'importe quoi ne fontionne pas...
J'oubliais : écrire en français plutôt qu'en anglais ne fonctionne pas non plus...
Jusque là, j'suis d'accord... Dois je marquer tout ce qui ne fonctionne pas et tous les bouts de code que j'ai essayé pour montrer que j'ai cherché "avec des principes de VB qui fonctionnent" ?
Lire un message d'erreur d'exécution est encore à ma portée (enfin j'crois...)
Donc si quelqu'un sait s'il y a une façon de procéder autre qu'avec un compteur ET avec une syntaxe correcte, je suis toujours preneur...
Teteve
Bonjours à tous,
Désolé d'avoir créé cette perturbation.
J'ai fait quelques erreurs. Entre autre en rattapant mon code test. Le . après Set rng = .Range("A1:A6"). n'y été pas dans mon code de base.
Ensuite, mon niveau en VBA n'est pas très haut. Donc j'ai essayé, mais .... pas terrible le résultat.
Et pour finir MERCI à tous. J'ai une solution à mon problème de base.
Peut-être je n'ai pas fini. Quel site ou quel livre puis-je consulter pour m'améliorer?
ppil
Désolé d'avoir créé cette perturbation.
J'ai fait quelques erreurs. Entre autre en rattapant mon code test. Le . après Set rng = .Range("A1:A6"). n'y été pas dans mon code de base.
Ensuite, mon niveau en VBA n'est pas très haut. Donc j'ai essayé, mais .... pas terrible le résultat.
Et pour finir MERCI à tous. J'ai une solution à mon problème de base.
Peut-être je n'ai pas fini. Quel site ou quel livre puis-je consulter pour m'améliorer?
ppil
bonjour ppil,
Tu as ta solution à ton problème c'est l'essentiel, pour le reste !!! je ne vois pas de quoi tu parles ;o)...
Il n'y a pas de bonne ou de mauvaise solution, il n'y a une solution pertinente. Celle qui répond au besoin. Si un jour tu dois développer et livrer des applications, jamais un client ne te demandera comment tu as codé telle procédure ou telle fonction pour répondre à son besoin ...
Bon courage et bonne route.
Polux
Tu as ta solution à ton problème c'est l'essentiel, pour le reste !!! je ne vois pas de quoi tu parles ;o)...
Il n'y a pas de bonne ou de mauvaise solution, il n'y a une solution pertinente. Celle qui répond au besoin. Si un jour tu dois développer et livrer des applications, jamais un client ne te demandera comment tu as codé telle procédure ou telle fonction pour répondre à son besoin ...
Bon courage et bonne route.
Polux