Comptage de mots différents dans une cellule

LeeW

XLDnaute Nouveau
Bonjour,

Je cherche à compter le nombre de mots différents listés dans une même cellule. Pour compliquer la chose ceux ci sont séparés par des virgules voire des points virgules.
Ex:
Dans une cellule j'ai : pomme, poire; banane, pomme. Je cherche à obtenir le nombre de 3 mots différents.
Pour l'instant j'utilise la formule: =NBCAR(macellule)-NBCAR(SUBSTITUE(SUBSTITUE(macellule;CAR(44);"");CAR(59);""))+1
Mais j'obtiens ainsi le nombre total de mots avec répétition. Ce qui n'est pas ce que je souhaite.
Quelqu'un aurait il une piste?
Merci
 

WUTED

XLDnaute Occasionnel
Re : Comptage de mots différents dans une cellule

Bonjour,

Je peux vous proposer ça en vba :

VB:
Function NombreDeMots(c As Range)
     Dim temp() As String
     Dim compteur As Integer
     Dim state As Boolean
     state = False
     compteur = 1
     temp = Split(c.Value, ",")
     For i = 1 To UBound(temp)
        state = False
        For j = 0 To i - 1
            If temp(i) = temp(j) Then
                state = True
            End If
        Next j
        If state = False Then
            compteur = compteur + 1
        End If
    Next i
    NombreDeMots = compteur
End Function

Par contre, au niveau de la séparation entre les mots, ça varie en permanence ou vous savez si c'est un ";" / "," ?

WUTED
 

LeeW

XLDnaute Nouveau
Re : Comptage de mots différents dans une cellule

Je sais si c'est un , ou ; mais ça varie en permanence.
J'avais une importante liste de références que j'ai concaténé moi même:
Ref |Champ 1|Champ 2
1 |A| a,b
1 | B | b,c
1 | B | a,b

pour obtenir
Ref |Champ 1 | Champ2
1 | A;B;B | a,b;b,c;a,b


Cela m'a facilté la réalisation de plusieurs opérations ultérieures...jusqu'à maintenant.
Voilà pour l'origine des "," et ";".


Merci pour votre code!
En effet cela fonctionne très bien quand il n'y que des virgules.
Cela ne serait pas possible de rajouter une structure conditionnelle avant la boucle: si "," ou ";" remplacer par "", puis procéder au comptage?

J'ai quelques bases en programmation générale mais je ne suis pas encore très familier avec la syntaxe VBA
 
Dernière édition:

WUTED

XLDnaute Occasionnel
Re : Comptage de mots différents dans une cellule

Re,

Si si, pas de problème :

VB:
Function NombreDeMots(c As Range)
     Dim temp() As String
     Dim compteur As Integer
     Dim state As Boolean
     state = False
     compteur = 1
     If inStr(c.Value,";") = 0 Then
         temp = Split(c.Value, ",")
     Else
         temp = Split(c.Value,";")
     End if
     For i = 1 To UBound(temp)
        state = False
        For j = 0 To i - 1
            If temp(i) = temp(j) Then
                state = True
            End If
        Next j
        If state = False Then
            compteur = compteur + 1
        End If
    Next i
    NombreDeMots = compteur
End Function

Bonne journée,
WUTED

EDIT : je viens de tilter, j'ai pas fait comme vous vouliez le faire, en remplaçant ";" ou "," par "", mais c'est facilement faisable. Cela devrait fonctionner malgré tout.
 
Dernière édition:

david84

XLDnaute Barbatruc
Re : Comptage de mots différents dans une cellule

Bonjour,
si tu veux vraiment le nombre de mots différents quels que soient les cas de figure, il vaut mieux utiliser Dictionary pour éliminer les doublons.
Concernant le traitement de la ponctuation, un replace peut faire l'affaire mais au-delà d'un certains nombre de signes à traiter, il me paraît plus efficace de passer par une expression rationnelle.
Enfin, concernant les mots, il faudrait savoir comment tu veux comptabiliser les verbes conjugués, les mots composés, etc.
Le plus simple est de déposer fichier avec des exemples explicites de phrases que tu veux traiter en indiquant manuellement le résultat attendu avec les explications permettant de comprendre ton raisonnement.
A+
 

WUTED

XLDnaute Occasionnel
Re : Comptage de mots différents dans une cellule

Re, bonjour david84,

Je viens de "retilter", j'ai enfin saisi, donc voici mon code modifié.

VB:
Function NombreDeMots(c As Range)
     Dim temp() As String
     Dim compteur As Integer
     Dim state As Boolean
     state = False
     compteur = 1
     Replace(c.Value,","," ")
     Replace(c.Value,";"," ")
     temp = Split(c.Value," ")
     For i = 1 To UBound(temp)
        state = False
        For j = 0 To i - 1
            If temp(i) = temp(j) Then
                state = True
            End If
        Next j
        If state = False Then
            compteur = compteur + 1
        End If
    Next i
    NombreDeMots = compteur
End Function


@david84 : Par pure curiosité, vous dites qu'il serait préférable d'utiliser Dictionary pour avoir vraiment le nombre de mots différents, face à quel cas de figure ma fonction pourrait-elle renvoyé une valeur erronée?
 

LeeW

XLDnaute Nouveau
Re : Comptage de mots différents dans une cellule

Re, merci encore.
Bien vu pour le replace, mais malheureusement cela ne fonctionne toujours pas.
Voici un extrait de mon fichier avec en colonne D le résultat espéré du comptage.
Je suis en train de me demander, j'ai parfois des espaces avant, ou après une "," ou ";". Il faudrait traiter la cellule pour les supprimer avant? Avec la fonction "trim" non?
 

Pièces jointes

  • ComptageLeeW.xls
    27.5 KB · Affichages: 78

WUTED

XLDnaute Occasionnel
Re : Comptage de mots différents dans une cellule

Re,

Je ne savais pas que vous vouliez l'utiliser de cette façon, la fonction de base demandais une cellule en paramètre, en mettant :
Code:
=nombreDeMots(B2)
C'est directement la valeur de la cellule que vous mettez, donc une chaîne de caractère. La fonction prend donc maintenant une chaîne de caractère en paramètre et j'ai fais en sorte qu'il n'y ai normalement plus de problème d'espace.

VB:
Function NombreDeMots(c As String)
     Dim temp() As String
     Dim compteur As Integer
     Dim state As Boolean
     state = False
     compteur = 1
     If InStr(c, ";") <> 0 Or InStr(c, ",") Then
        c = Replace(c, " ", "")
        c = Replace(c, ",", " ")
        c = Replace(c, ";", " ")
        c = Trim(c)
     End If
     temp = Split(c, " ")
     For i = 1 To UBound(temp)
        state = False
        For j = 0 To i - 1
            If temp(i) = temp(j) Then
                state = True
            End If
        Next j
        If state = False Then
            compteur = compteur + 1
        End If
    Next i
    NombreDeMots = compteur
End Function

Bonne après-midi.
 

LeeW

XLDnaute Nouveau
Re : Comptage de mots différents dans une cellule

Cool! Ca marche parfaitement!
Merci pour tout.
Par contre je ne suis pas sûr d'avoir saisi pour le problème du paramètre.
Même en conservant un range (ma cellule) en paramètre de fonction, cela aurait dû quand même fonctionner si on avait réalisé toutes les opérations sur c.value (un string correct?)?
Bonne journée
 

WUTED

XLDnaute Occasionnel
Re : Comptage de mots différents dans une cellule

Quand tu mets :
Code:
=nombreDeMots(B2)
Tu mets la valeur de B2 en paramètre, or ma fonction de départ attendait un objet Range, c'est comme si je faisais "XXX".value, c'était pas correct.
 

david84

XLDnaute Barbatruc
Re : Comptage de mots différents dans une cellule

Bonsoir Wuted,
Ton code me semble tout à fait adapté à l'exemple fourni. Cependant, il me semble qu'une fonction "Nombre de Mot" doit dans l'absolu être capable de compter le nombre de mots d'un texte comme par exemple (un texte issu d'un fichier récent que j'ai eu à traiter mais sur une autre problématique touchant les chaines de caractères) :
Collègue, femme, "amante", amie… Être une maman aujourd’hui, c’est être une héroïne au quotidien. Véritable wonderwoman, on aime tout mener de front mais à vouloir trop bien faire, on se met souvent une pression de dingue. Alors si au lieu de courir toujours plus vite, on ralentissait le rythme ?
Ci-joint un code qui demande à être amélioré dans l'absolu mais qui sur le principe semble faire le travail sur le texte ci-dessus comme sur le fichier de LeeW (utilisation d'expressions rationnelles et de Dictionary) :
Code:
Function NombreMot(Chaine As String) As Double
Dim s As Variant, oRegExp As Object, Matches As Object, dico As Object
Chaine = Trim(LCase(Replace(Chaine, """", "")))
Set oRegExp = CreateObject("vbscript.regexp")
With oRegExp
  .Global = True
  .MultiLine = True
    'traitement des caractères ponctuation
    .Pattern = "[,?!;.:…_()\[\]{}“”«»\\|/§~#`^@]+" ' -–—
    If .test(Chaine) = True Then Chaine = .Replace(Chaine, " ")
      
    'traitement des apostrophes dans certains mots
    .Pattern = "(?:^|\s)(c|d|l|n|qu|s)(?:’|')"
    If .test(Chaine) = True Then Chaine = .Replace(Chaine, "$1 ")
    
    'épurage des espaces en trop "
    .Pattern = "(\s){2,}"
    If .test(Chaine) = True Then Chaine = .Replace(Chaine, " ")
End With

Set dico = CreateObject("scripting.dictionary")
s = Split(Trim(Chaine))
For i = LBound(s) To UBound(s)
    dico(s(i)) = dico(s(i))
Next i
NombreMot = dico.Count
End Function
On sort bien sûr de l'exemple strict fourni par LeeW mais à partir du moment où l'on cherche à compter le nombres de mots différents d'une chaîne de caractères, c'est une piste possible pour arriver à ses fins (même si bien sûr le code doit encore être amélioré, mais l'idée est là) et je suis conscient qu'il en existe d'autres.

L'intérêt d'utiliser Dictionary pour sortir une liste sans doublon des mots est que ce traitement est efficace et très rapide, ce qui n'est pas le cas de toutes les méthodes utilisables pour faire ce travail.
A+
 

Discussions similaires

Statistiques des forums

Discussions
312 229
Messages
2 086 426
Membres
103 206
dernier inscrit
diambote