Compter le nombre de cellule

ppil Messages postés 34 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

16 réponses

teteve Messages postés 123 Statut Membre 40
 
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
0
ppil Messages postés 34 Statut Membre 13
 
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
0
xkristi Messages postés 4336 Date d'inscription   Statut Membre Dernière intervention   564
 
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.
0
ppil Messages postés 34 Statut Membre 13
 
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
0

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

Posez votre question
ppil Messages postés 34 Statut Membre 13
 
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
0
ppil Messages postés 34 Statut Membre 13
 
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
0
teteve Messages postés 123 Statut Membre 40
 
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...)
0
Polux31 Messages postés 7219 Statut Membre 1 204
 
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)
0
Papou93 Messages postés 147 Statut Membre 59
 
Bonsoir à tous,

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.
0
teteve Messages postés 123 Statut Membre 40
 
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
0
Polux31 Messages postés 7219 Statut Membre 1 204
 
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
0
teteve Messages postés 123 Statut Membre 40
 
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
0
Polux31 Messages postés 7219 Statut Membre 1 204
 
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 ...
0
teteve Messages postés 123 Statut Membre 40
 
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
0
ppil Messages postés 34 Statut Membre 13
 
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
0
Polux31 Messages postés 7219 Statut Membre 1 204
 
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
0