Compter le nombre de fois qu’un mot est présent dans un classeur

Suite à la question d'une lectrice, voici un début de solution en vba à cette question, en vidéo et plus bas avec le texte (cliquer ici pour le fichier).

On va donc scanner l'ensemble des feuilles, puis des cellules de chaque feuille.
Pour chaque cellule, on va ensuite rechercher la présence de la chaine de caractère (le mot) et comptabiliser cette présence.

On met ceci dans une fonction, pour pouvoir l'utiliser facilement par la suite, par exemple si on veut faire des statistiques à partir d'une liste de mots à chercher.

Ca donne donc ceci.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
Sub recherche()
    MsgBox "Ce mot apparaît " & compte_occurence_mot(InputBox("Que recherchez vous ?", "Occurence")) & " fois."
End Sub
Function compte_occurence_mot(mot_que_l_on_recherche As String)
    Dim sh As Worksheet
    Dim cellule As Range
    Dim t As Integer
    Dim longueur_du_mot_que_l_on_cherche As Integer
    longueur_du_mot_que_l_on_cherche = Len(mot_que_l_on_recherche)
    'on scanne toutes les feuilles
    For Each sh In ThisWorkbook.Worksheets
        'On scanne toutes les cellules de la plage utilisé de la feuille
        For Each cellule In sh.UsedRange
            'On scanne toutes les lettres de la cellule
            If Not (IsError(cellule.Value)) Then
                For t = 1 To Len(cellule.Value)
                    'Si on trouve le mot recherché, on incrémente l'occurence
                    If Mid(cellule.Value, t, longueur_du_mot_que_l_on_cherche) = mot_que_l_on_recherche Then
                        compte_occurence_mot = compte_occurence_mot + 1
                    End If
            Next t
                End If
        Next cellule
    Next sh
End Function

Note : en utilisant la fonction application.find, on doit aussi y arriver, ca fera l'objet d'un prochain post
Note 2 : à la place de faire une recherche par cellule, on peut aussi créer un tableau en VBA (array), ce qui évite de devoir lire chaque cellule et donc on accélère la vitesse de la macro, là encore, ce sera pour une autre fois 😉

Si vous voyez d'autres manières d'améliorer ce code, n'hésitez pas !

A bientôt

Gaëtan

Pour marque-pages : Permaliens.

13 réponses à Compter le nombre de fois qu’un mot est présent dans un classeur

  1. Yves-Martin Cyr dit :

    Bonjour Gaétan …

    Très intéressant et constructif

    Merci encore

    Yves-Martin

  2. Ping :XLérateur » Blog Archive » Extraire les cellules contenant un mot spécifique - Xlérer vos connaissances sur Excel

  3. dominique.handelsman@noos.fr dit :

    Bonjour,

    Il se dit en général que les fonctions intégrées Excel sont plus rapides. Donc peut être l’usage de la fonction CHERCHE (WorksheetFunction.Search) accélérerait il le code.

    Cordialement

    Dominique

  4. Nader dit :

    Bon boulot Gaétan,
    thx

  5. Gaetan Mourmant dit :

    @Dominique,

    Je pense que c’est ce que j’ai en tête dans mon PS.
    L’intérêt de cet exemple est aussi pédagogique.

    Merci pour ton commentaire.

    Gaetan

  6. Intéressant.
    Pour ce qui concerne “find” je doute qu’il retournerait “2” pour une cellule contenant “polypoly” ce qui est a priori le cas ici.
    Je ne sais pas comment il se comporte pour d’éventuelles différence de casse (majuscule/minuscule)

    A+ et merci

  7. Dominique HANDELSMAN dit :

    Bonjour,

    Comment faire pour obtenir la présentation du code visual basic ci dessus, avec des couleurs diverses, et la numérotation des lignes ?

    Merci d’avance.

  8. Dominique HANDELSMAN dit :

    Pour soulager l’effort de mémoire, et pour être dans une démarche d’apprentissage,

    je suggère, au lieu de “Len” et “Iserror”, qu’il faut retenir par coeur, ou ne pas réussir à retenir :

    VBA.Len et “VBA.Iserror” .

    Ainsi, on finit par se souvenir que ce type de fonction sont dans la famille VBA, et lorsqu’on les cherche à nouveau, on tape VBA. et l’éditeur propose la liste des possibilités. It helps, je trouve.

  9. Dominique HANDELSMAN dit :

    Concernant les noms de variable,

    Je préfère des noms plus longs que Dim t As Integer.

    Car lorsqu’on souhaite changer le nom de la variable dans tout le programme, rechercher toutes les occurrences est très fastidieux et risqué.

    Toutefois, pour ceux qui préfèrent des noms de variable courts, je propose une astuce pour modifier leur nom, lorsque nécessaire : passer en commentaire la déclaration de cette variable.

    SI LA DECLARATION DES VARIABLES EST OBLIGATOIRE, CE QUE JE CONSEILLE TRES FORTEMENT,
    alors la compilation mettra en évidence les occurrences de la variable à remplacer, et rien d’autre.

  10. Gaetan Mourmant dit :

    Dominique,
    Merci pour ces suggestions

    A bientôt

    Gaetan

  11. Gaetan Mourmant dit :

    Pour la présentation du code, je pense que c’est un utilitaire lié à WordPress, le logiciel que j’utilise pour gérer ce blog.

    Je ne connais pas l’équivalent en Excel.

    Ceci dit, dans Excel VBE, il me semble qu’on peut paramétrer les couleurs

  12. Pierre MULLER dit :

    Bonjour,
    J’ai cru trouver mon bonheur avec votre formule, mais ce n’est malheureusement pas le cas…
    Je suis peut-être hors sujet, mais savez-vous comment numéroter l’occurence d’une valeur/d’un mot par ordre d’apparition dans une ligne, directement dans la cellule de la valeur/du mot?
    Merci d’avance pour votre aide!
    Pierre

  13. Gaetan Mourmant dit :

    Il y a plusieurs solutions sans VBA, mais utilisant la fonction FILTRE (donc il faut Office 365):

    On a ici une table avec une colonne Produit en A. La table démarre en A1 et possède des en-têtes.
    =NB.SI.ENS($A$1:A2;[@Produit])
    J’essaie d’éviter ce type d’approche, car la formule fait référence à des lignes différentes, mais ca semble bien fonctionner.

    ou alors avec les nouvelles fonctionnalités de filtre
    =NBVAL(FILTRE([Produit];([Produit]=[@Produit])*(LIGNE([@Produit])>=LIGNE([Produit]))))

    Produit Occurrence Colonne1
    C 1 1
    B 1 1
    B 2 2
    A 1 1
    A 2 2

    Cordialement.

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Ce site utilise Akismet pour réduire les indésirables. En savoir plus sur comment les données de vos commentaires sont utilisées.