Compter le nombre de fois ou apparaît un mot

Vilain

XLDnaute Accro
Salut à tous,

Je fais appel aux formulistes ! J'ai une demande un peu particulière. J'ai un fichier excel ne comportant quasiment que du texte.
Je cherche à identifier les 20 mots qui ressortent le plus souvent dans l'ensemble du document d'une part et au sein d'une seule cellule d'autre part.

Je joins un fichier pour les tests.

A plus
 

Pièces jointes

  • compter les mots.xls
    51 KB · Affichages: 89

Dugenou

XLDnaute Barbatruc
Re : Compter le nombre de fois ou apparaît un mot

Bonjour,
Avec données/convertir et en déclarant l'espace comme séparateur, on obtient un tableau à 91 colonnes avec un mot dans chaque cellule. Je ne retrouve pas la formule qui donne les valeurs en fréquence décroissante mais j'espère que d'autres accros et Barbatrucs interviendront. Sinon en VBA à partir de cette base ce doit être faisable.
Cordialement
 

Victor21

XLDnaute Barbatruc
Re : Compter le nombre de fois ou apparaît un mot

Bonjour, Gillus69, Dugenou ;)

Avec Données, Convertir, nb.si, max et rechercher-remplacer (un peu laborieux... je le concède), on obtient :
134 de
90 et
79 la
61 à
41 des
39 droit
36 le
32 a
31 les
30 Article
27 ou
26 Toute
22 Sa
20 droits
20 que
20 personne
20 en
19 dans
17 ne
16 une
 

Vilain

XLDnaute Accro
Re : Compter le nombre de fois ou apparaît un mot

Merci beaucoup Victor !!
Cette solution me convient parfaitement ! Quand et comment fais tu ton rechercher remplacer ?
Peux tu mettre ton fichier en exemple que j'adapte à mon cas ?

A plus
 

david84

XLDnaute Barbatruc
Re : Compter le nombre de fois ou apparaît un mot

Bonjour,
ci-joint une fonction personnalisée basée sur l'utilisation d'une expression rationnelle à tester soigneusement de ton côté (testé rapidement donc à vérifier) :
Code:
Function OccurrenceTexte(Plage As Range) As String
Dim s As Variant, T(), T2(), oRegExp As Object
Dim i As Long, dico As Object, Chaine As String, Pl As Range

Set Pl = Plage
For i = 1 To Pl.Rows.Count
    Chaine = Chaine & Pl(i) & " "
Next i

Chaine = Trim(LCase(Replace(Chaine, """", "")))
Set oRegExp = CreateObject("vbscript.regexp")
With oRegExp
  .Global = True
  .MultiLine = True
    
    Chaine = Application.Trim(Chaine)
    'traitement des caractères ponctuation
    .Pattern = "[,?!;.:…_()\[\]{}“”«»\\|/§~#`^@]+" ' '’-–—
    If .test(Chaine) = True Then Chaine = .Replace(Chaine, " ")
      
    'traitement des apostrophes
    .Pattern = "(^|\s)(c|d|l|n|qu|s)(’|')"
    If .test(Chaine) = True Then Chaine = .Replace(Chaine, " ")
      
    'é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(Chaine)
For i = LBound(s) To UBound(s)
    dico(s(i)) = dico(s(i)) + 1
Next i
T = dico.keys
T2 = dico.items
i = Application.Match(Application.Max(T2), T2, 0) - 1
OccurrenceTexte = T(i) & " (" & T2(i) & ")"
End Function
=OccurrenceTexte(A1:A126)
ramène
=OccurrenceTexte(A2)
ramène
Code:
la (6)
A+
 

Victor21

XLDnaute Barbatruc
Re : Compter le nombre de fois ou apparaît un mot

Re,

C'est du bricolage...
- Après la suppression des lignes vides et la conversion, je dispose d'un tableau A1:CM89 avec un mot par cellule.
- Création d'un tableau de même dimension en A91:CM179
- En A91 à recopier à droite et vers le bas : =NB.SI($A$1:$CM$89;BZ1) avec une mefc pour visualiser le max
- En A180 : =MAX(92:179)
- Recheche du terme correspondant au max
- Remplacement de ce terme par rien dans la zone A1:CM89.
- Recheche du nouveau terme correspondant au max
- Remplacement de ce nouveau terme par rien dans la zone A1:CM89.
...and so on...
Bricolage, je te dis.
Word ne possède-t'il pas des outils plus appropriés ?
:)
 

Vilain

XLDnaute Accro
Re : Compter le nombre de fois ou apparaît un mot

Merci à vous 2,

@David : C'est un peu complexe pour moi, je regarderai à tête reposée
@Victor : la bidouille a parfois du bon ! Je suppose que word doit permettre ce genre de trucs mais je ne saurai pas comment m'y prendre.

Encore merci pour tout.

A plus
 

david84

XLDnaute Barbatruc
Re : Compter le nombre de fois ou apparaît un mot

Re
@David : C'est un peu complexe pour moi, je regarderai à tête reposée
Tu n'as pas à te préoccuper de la fonction en elle-même, il te faut simplement la rentrer dans un module.
Quant à son utilisation, tu n'as qu'à sélectionner la plage à traiter.
Par contre, tu dois vérifier qu'elle te ramène le bon résultat avant de l'utiliser.
A+
 

Dugenou

XLDnaute Barbatruc
Re : Compter le nombre de fois ou apparaît un mot

bonsoir à tous,
ah ben si on peut bricoler alors !
voir dans le fichier joint un tcd obtenu après une macro enregistrée dans le classeur
les explications sont dans le classeur (en mode très concis : je peux détailler si nécessaire)
Cordialement
 

Pièces jointes

  • compter les mots Gillus.xls
    205 KB · Affichages: 77

david84

XLDnaute Barbatruc
Re : Compter le nombre de fois ou apparaît un mot

Bonsoir,
quelques modifications dans la fonction :
Code:
Function OccurrenceTexte(Plage As Range) As String
Dim s As Variant, T(), T2(), oRegExp As Object, matches As Object
Dim i As Long, dico As Object, Chaine As String, Pl As Range

Set Pl = Plage
For i = 1 To Pl.Rows.Count
    Chaine = Chaine & Pl(i) & " "
Next i

Chaine = Application.Trim(LCase(Replace(Chaine, """", "")))

Set oRegExp = CreateObject("vbscript.regexp")
With oRegExp
  .Global = True
  .MultiLine = True
  .ignorecase = True
    'traitement des caractères ponctuation
    .Pattern = "[,?!;.:…_()\[\]{}“”«»\\|/§~#`^@]+" ' '’-–—
    If .test(Chaine) = True Then Chaine = .Replace(Chaine, " ")
      
    'traitement des apostrophes
    .Pattern = "(?:^|\s)(c|d|l|n|qu|s)(’|')"
    If .test(Chaine) = True Then Chaine = .Replace(Chaine, " $1$2 ")
    
    Chaine = Application.Trim(Chaine)
End With

Set dico = CreateObject("scripting.dictionary")
s = Split(Chaine)
For i = LBound(s) To UBound(s)
    dico(s(i)) = dico(s(i)) + 1
Next i
T = dico.keys
T2 = dico.items
i = Application.Match(Application.Max(T2), T2, 0) - 1
OccurrenceTexte = T(i) & " (" & T2(i) & ")"
End Function
=OccurrenceTexte(A1:A126)
ramène
A+
 

job75

XLDnaute Barbatruc
Re : Compter le nombre de fois ou apparaît un mot

Bonjour à tous,

Très en retard, une solution pour compter les mots :

Code:
Option Explicit
Option Compare Text 'la casse est ignorée

Sub CompterMots()
Dim t, s, i&, ub&, d As Object, t1(1000000, 0), n&, j&, t2(1000000, 0)
t = Feuil1.Range("A1", Feuil1.Cells(Rows.Count, 1).End(xlUp)) 'CodeName
ReDim s(UBound(t) - 1)
For i = 0 To UBound(s)
  s(i) = t(i + 1, 1)
Next
s = Join(s)
s = Replace(Replace(s, ",", ""), ".", "")
s = Application.Trim(s) 'SUPPRESPACE
s = Split(s)
ub = UBound(s)
Set d = CreateObject("Scripting.Dictionary")
For i = 0 To ub
  t = LCase(s(i))
  If Not d.Exists(t) Then
    t1(d.Count, 0) = t
    n = 0
    For j = i To ub
      If s(j) = t Then n = n + 1
    Next
    t2(d.Count, 0) = n
    d(t) = t
  End If
Next
Application.ScreenUpdating = False
With Feuil2 'CodeName
  .Range("A2:B" & Rows.Count).ClearContents 'RAZ
  .[A2].Resize(d.Count) = t1
  .[B2].Resize(d.Count) = t2
  .[A2:B2].Resize(d.Count).Sort .[B2], xlDescending, Header:=xlNo 'tri
  .Activate
End With
End Sub
Fichier joint.

A+
 

Pièces jointes

  • Compter les mots(1).xls
    61 KB · Affichages: 64
Dernière édition:

job75

XLDnaute Barbatruc
Re : Compter le nombre de fois ou apparaît un mot

Re,

J'avais oublié de séparer les mots avec l'apostrophe.

Et cette macro permet de compter aussi le nombre de points et de virgules :

Code:
Option Explicit
Option Compare Text 'la casse est ignorée

Sub CompterMots()
Dim t, s, i&, ub&, d As Object, t1(1000000, 0), n&, j&, t2(1000000, 0)
t = Feuil1.Range("A1", Feuil1.Cells(Rows.Count, 1).End(xlUp)) 'CodeName
ReDim s(UBound(t) - 1)
For i = 0 To UBound(s)
  s(i) = t(i + 1, 1)
Next
s = Join(s)
s = Replace(Replace(Replace(s, ",", " , "), ".", " . "), "'", "' ")
s = Application.Trim(s) 'SUPPRESPACE
s = Split(s)
ub = UBound(s)
Set d = CreateObject("Scripting.Dictionary")
For i = 0 To ub
  t = LCase(s(i))
  If Not d.Exists(t) Then
    t1(d.Count, 0) = t
    n = 0
    For j = i To ub
      If s(j) = t Then n = n + 1
    Next
    t2(d.Count, 0) = n
    d(t) = t
  End If
Next
Application.ScreenUpdating = False
With Feuil2 'CodeName
  .Range("A2:B" & Rows.Count).ClearContents 'RAZ
  .[A2].Resize(d.Count) = t1
  .[B2].Resize(d.Count) = t2
  .[A2:B2].Resize(d.Count).Sort .[B2], xlDescending, .[A2], Header:=xlNo 'tri
  .Activate
End With
End Sub
Fichier (2).

A+
 

Pièces jointes

  • Compter les mots(2).xls
    61.5 KB · Affichages: 59
  • Compter les mots(2).xls
    61.5 KB · Affichages: 79
  • Compter les mots(2).xls
    61.5 KB · Affichages: 72

Discussions similaires

Statistiques des forums

Discussions
312 492
Messages
2 088 938
Membres
103 988
dernier inscrit
Feonix