Compter des mots dans deux colonne

Bonjour,

tout d'abord merci bcp d'avoir consacrré le temps à ma problématique. je suis debutant en VBA et macro et j'ai besoin d'une fonction qui compte dans deux colonnes le nombre de fois que ce mots existe et si il y est plusieur fois dans la meme celulle, il ne le compte qu'une seule fois

cette fonction me permettra de faire une etude statistique

Merci infiniment

Achy

pS : les colonnes concernées sont R et S

Salut,

Voici une fonction a coller dans un module.

Tu t'en sers en appelant la fonction via :

=compte_mots(D1:E20;"mot_bidon")

Et cela te renverra le nombre

Function compte_mots(plage As Range, chaine_recherche As String) As Double
Dim c As Range
Dim compteur As Double
Application.Volatile
compteur = 0
For Each c In plage

    If InStr(1, UCase(c.Value), UCase(chaine_recherche)) > 0 Then
        compteur = compteur + 1
    End If

Next
compte_mots = compteur

End Function

Damien

je n'ai pas tros compris en fait ce qu'il faut faire car comme j'ai expliqué avant, mon niveau est tres faible en VBA et je n'ai jamais fait de programation avant !!! si vous pouvez etre plus explicite je vous serais tres reconaissant

merci davance

voila l'emplacement des colonnes ou je veux compter par exemple des mots comme "HP valve" , "HPV" et "RPV"

c'est les colonnes R et S

19classeur1.xlsx (15.64 Ko)

Bonjour

Et avec une formule (oui cela m'arrive des fois)

Re,

Pour mettre la macro en place :

Dans Excel tu appuies sur ALT+F11.

Cela ouvre l'editeur VBA.

Dans la partie de gauche, tu cliques droit sur 'Microsoft Excel Objects" => Insertion => Module

Puis tu colles le code.

Tu peux ensuite quitter l'editeur VBA (clique sur la croix en haut a droite)

Pour utiliser la macro

Dans excel, dans une cellule tu appuies sur la touche fonction, tu sélectionne la catégorie 'Personnalisées'

Tu cliques sur compte_mots, tu sélectionne ensuite la plage où tu souhaites effectuer la recherche, puis tu tapes le mots recherché.

Explication sur le code

Cf code commenté ci dessous.

Function compte_mots(plage As Range, chaine_recherche As String) As Double  'déclaration de la fonction avec 2 paramètres et une valeur de retour en type : double
Dim c As Range   'Déclaration de l'objet c en tant que Range (plage)
Dim compteur As Double 'Déclaration variable comteur en tant que double

Application.Volatile  'Sert a mettre a jour la formule dès que tu mets a jour une valeur (recalcule auto)
compteur = 0  'On initialise la valeur 0 dans compteur

For Each c In plage     'Pour chaque cellule dans la plage : "Plage" (définit lors de l'appel de la fonction)

    If InStr(1, UCase(c.Value), UCase(chaine_recherche)) > 0 Then  'Si on trouve la chaine recherché dans la cellule
        compteur = compteur + 1 'On incremente le compteur de 1
    End If

Next
compte_mots = compteur  'Le traitement est fini on renvoi la valeur

End Function

Damien

29classeur2.xlsm (21.42 Ko)

il reste juste un petit probleme de redendonce car ce comptage est destiné à une etude statistique et donc il faut compter le mot une fois par cellule et par ligne

le code que j'ai la il compte le mot plusieur fois dans la meme cellulle. Il y a moyen de compter le mot juste une fois par cellulle pour eviter la redendonce Merci d'avance

Cf fichier attaché.

Code modifié pour ne compter que les lignes.

Function compte_lignes(plage As Range, chaine_recherche As String) As Double  'déclaration de la fonction avec 2 paramètres et une valeur de retour en type : double
Dim c As Range   'Déclaration de l'objet c en tant que Range (plage)
Dim compteur As Double 'Déclaration variable comteur en tant que double
Dim deja_compte As Boolean

Application.Volatile  'Sert a mettre a jour la formule dès que tu mets a jour une valeur (recalcule auto)

compteur = 0  'On initialise la valeur 0 dans compteur

For i = 1 To plage.Rows.Count
    deja_compte = False
    For b = 1 To plage.Columns.Count
        If InStr(1, UCase(plage.Cells(i, b)), UCase(chaine_recherche)) > 0 And deja_compte = False Then
            compteur = compteur + 1
            deja_compte = True
        End If
    Next
Next
compte_lignes = compteur  'Le traitement est fini on renvoi la valeur
End Function

damien

24classeur2.xlsm (25.33 Ko)

je suis dsl mais je pense que je n'étais pas tres claire dans la definition du besoin

donc le code que je dois faire il doit sur 2 colonnes tout dabord compter des mots.

par exemple pour le mot bleed

si il existe dans la cellule R12 et S12 il doit le compter une seule foi et quand on cherche dans la suite par exemple PRV il doit chercher juste dans les ligne qui reste et pas dans les celles ou on a trouvé le mot bleed pour ne pas compter les lignes plusieur fois

merci bcp pour tou ce que vous avez fait jusqu'à present vraiment merci infiniment.!!!

Re,

Si je comprend bien (et c'est vraiment pas sûr), il faut chercher plusieurs mots.

Si on prend des cas concrêts :

Cas 1:

Si on recherche le mot BLEED et PRV:

Il faut le nombre de lignes contenant BLEED et le nombre de lignes contenant PRV dans les lignes restantes ?

Cas 2

Si on rechercher seulement le mot PRV :

on aura donc pas le même nombre que précedemment ? (on comptera en plus, les lignes contenant BLEED et PRV)

Cas 3

Si on recherche PRV et ensuite BLEED on aura (pas forcément) pas le même nombre de ligne que la cas 1 ?

(les lignes contenant PRV et BLEED seront comptabilisés pour PRV et non pour BLEED)

J'ai vraiment du mal a voir la logique, peux tu envoyer un fichier excel avec le résultat que tu veux obtenir ? (petit exemple d'une vingtaine de lignes)

Damien

ce n'est pas le bleed qu'on cherche je l'avais dit parce quevous l'avais pris comme exemple au cour du premier fichier que vous mavais envoyer

les mot que je cherche ce sontduct

FAV

Fan Air Valve

THERMOSTAT

HPV

HP Valve

high pressure valve

OPV

overpressure valve

overpress valve

Precooler heat exchanger

heat exchanger

PRV

Pressure regulating valve

Press regulating valve

et c'est mots faut que je vois combien de fois sont cité dans les textes et apres faire le cumule par composant afin de faire mon eude statistique

mais les contraintes sont par exemple si prv et pressure regulating valve sont dans la meme cellule ou dans la meme ligne faut que je la compte une seule fois pour ne pas avoir de redendonce

voila la problematique et merci

Envoi un exemple avec le résultat que tu souhaites obtenir (1 exemple suffit).

Juste pour voir la présentation du résultat.

damien

Component Expression de recherche

duct duct 2

FAV 3

Fan Air Valve 5

FAV THERMOSTAT8

HPV 4

HP Valve 5

HPV high pressure valve 0

OPV 0

OPV overpressure valve 1

overpress valve 0

Precooler heat exchanger 12

PCE heat exchanger 0

PRV 11

PRV Pressure regulating valve 0

Press regulating valve 0

voila a peu pres a quoi doit ressemble le resultat et Merci

donc en gros c'est les expression cité ci-dessus qu'il faut compter, par contre juste une seule fois par ligne pas plusieur fois par ligne

Bonjour,

Bon, si j'ai compris....

Exemple cinématique :

Recherche des mots HP VALVE, HPV, HPV high pressure valve

1 - Compte les lignes contenant "HP VALVE"

2 - Dans les lignes restantes : Compte les lignes contenant "HPV"

3 - Dans les lignes restantes : Compte les lignes contenant "HPV high pressure valve"

J'ai écrit une fonction que tu peux appeler d'excel comme suit (3 exemples):

=Compteligne2(<plage où effectuer la recherche>;<critere a compter>;<1erCriteres>;<2eme critère>;...;<n critères>)

Exemple concret :

= compteligne2(A1:B255;"HP VALVE";"HP VALVE";"HPV";"HPV high pressure valve")

Dans ce cas : cela va te renvoyer le nombre de lignes contenant "HP VALVE"

= compteligne2(A1:B255;"HPV";"HP VALVE";"HPV";"HPV high pressure valve")

Dans ce cas : cela va te renvoyer le nombre de lignes contenant "HPV" dans les lignes restantes ne contenant pas "HP VALVE"

= compteligne2(A1:B255;"HPV high pressure valve";"HP VALVE";"HPV";"HPV high pressure valve")

Dans ce cas : cela va te renvoyer le nombre de lignes contenant "HPV high pressure valve" dans les lignes restantes ne contenant ni "HP VALVE" ni "HPV"

Voic le code :

Function compteligne2(plage As Range, valeur_affiche As String, ParamArray liste_mot_1()) As Double
Dim c As Range
Dim i, b, p As Double
Application.Volatile
Dim indice As Double

'determine l'indice valeur_affiche dans le tableau
indice = -1
For i = LBound(liste_mot_1) To UBound(liste_mot_1)
    If UCase(liste_mot_1(i)) = valeur_affiche Then
        indice = i
    End If
Next

indice = indice - 1 'On prend l'indice inférieur si ce n'est pas le premier

compteur = 0  'On initialise la valeur 0 dans compteur

'On parcours la plage
For i = 1 To plage.Rows.Count
    deja_compte = False
    For b = 1 To plage.Columns.Count

        'On vérifie que la ligne ne contenait pas les valeurs précédentes
        For p = LBound(liste_mot_1) To indice
            If InStr(1, UCase(plage.Cells(i, b)), UCase(liste_mot_1(p))) > 0 And deja_compte = False Then
                deja_compte = True
            End If
        Next

        'On vérifie que la ligne contient
        If InStr(1, UCase(plage.Cells(i, b)), UCase(valeur_affiche)) > 0 And deja_compte = False Then
            compteur = compteur + 1
            deja_compte = True
        End If

    Next
Next

compteligne2 = compteur  'Le traitement est fini on renvoi la valeur

End Function

quand je l'applique sur une grande plage ca me donne exactement la meme chose que la fonction compte ligne 1 d'hier c'est bizzard je ne vois pas la difference

Re,

Cela fonctionne bien chez moi sur les exemples fournis. (selon la cinématique décrit dans mon dernier post)

Merci de faire le test :

  • Fais le calcul manuellement sur une petite plage de valeurs.
  • Fais le calcul via la Macro.
Note les différences s'il y en a et envoi le fichier avec ces différences.

Sinon je ne vois pas comment t'aider.

+

si si ca marche sur une petite plage !!!! c'est moi

Bonjour

Juste pour le plaisir

pour benzai

il ne faut pas qu'il compte le mots plusieur fois dans la meme cellule si il est cité plusieur fois comme de fois prv ou 3 fois hpv !!!!

Rechercher des sujets similaires à "compter mots deux colonne"