Mot précédé de

Bonjour à tous,

Je suis chargé de compter des mots clés se trouvant dans un feuille Excel. Alors j'arrive très bien à faire un classement des mots les plus présents dans ma feuille mais je ne les veux pas tous, je veux seulement les mots précédés d'un # et je ne trouve pas comment faire.

Merci d'avance pour vos réponses !

Bonjour,

est-ce que le " # " est collé au mot ? séparé par un blanc ? un underscore ? un tiret ?

Watewmark a écrit :

Bonjour,

est-ce que le " # " est collé au mot ? séparé par un blanc ? un underscore ? un tiret ?

Bonjour Watewmark,

Il est collé au mot.

Re,

comment est-ce que tu fait tes stats ? avec une formule "RECHERCHE() " ? (ce serait plus simple avec un fichier)

Watewmark a écrit :

Re,

comment est-ce que tu fait tes stats ? avec une formule "RECHERCHE() " ? (ce serait plus simple avec un fichier)

Non, je m'inspire de ce post : https://forum.excel-pratique.com/excel/classement-du-nombre-d-occurrence-de-mots-t76212.html#p437866

En fait je reprends sa macro à l'identique en changeant les cellules et le nombre de mots affichés dans la MsgBox.

Re,

Ah oui lui il supprime et toi tu veux garder .

Cependant de ce que je comprends les deux problèmes sont totalement différent, toi tu as 1 mot par case et pas un texte entier a décortiquer ? (encore une fois un fichier aiderais vraiment a y voir plus clair )

si c'est le cas tu peux rajouter une condition général a l'ensemble de la macro

Je ne m'y connait pas du tout en macros alors pour la syntaxe je pourrais pas t'aider mais l'idée c'est de faire ça:

If Left ( activecell, 1) = "#" Then La macro

Else Ne rien faire

Bonjour,

Pas sûr d'avoir tout saisi mais voilà une piste par rapport à ce que j'en ai compris :

Sub Test()

    Dim Tbl()
    Dim Tablo
    Dim Plage As Range
    Dim Cel As Range
    Dim I As Integer
    Dim J As Integer
    Dim Adr As String

    'ici les mots à rechercher
    Tablo = Array("#Mot clé 1", "#Mot clé 2", "#Mot clé 3", "#Mot clé 4", "#Mot clé 5", "#Mot clé 6", "#Mot clé 7", "#Mot clé 8")

    'la palge de recherche est défini sur toute la zone utilisée sur la feuille active
    With ActiveSheet

        Set Plage = .Range(.Cells(1, 1), _
                    .Cells(.Cells.Find("*", .[A1], -4123, , _
                    1, 2).Row, .Cells.Find("*", .[A1], -4123, , _
                    2, 2).Column))

    End With

    'recherche les mots
    For I = 0 To UBound(Tablo)

        'dimentionne le tableau devant récevoir les résultats (le mot cherché et le nombre de fois trouvé)
        ReDim Preserve Tbl(1 To 2, 1 To I + 1)

        'commence la recherche...
        Set Cel = Plage.Find(Tablo(I), , xlValues, xlWhole)

        'si trouvé...
        If Not Cel Is Nothing Then

            'mémorise la première cellule
            Adr = Cel.Address

            'puis boucle...
            Do

                'le mot est inscrit dans la première dimension
                'et le nombre est incrémenté à chaque fois que la recherche est positive
                Tbl(1, I + 1) = Tablo(I)
                Tbl(2, I + 1) = Tbl(2, I + 1) + 1

                'passe à la suivante
                Set Cel = Plage.FindNext(Cel)

            Loop While Adr <> Cel.Address

        Else

            'si pas trouvé, inscrit le mot et la valeur 0
            Tbl(1, I + 1) = Tablo(I)
            Tbl(2, I + 1) = 0

        End If

    Next I

    'résultat dans la fenêtre d'exécution (Ctrl+G)
    For I = 1 To UBound(Tbl(), 2)

        Debug.Print "'"; Tbl(1, I); "' trouvé " & Tbl(2, I); " fois"

    Next I

End Sub
Watewmark a écrit :

Re,

Ah oui lui il supprime et toi tu veux garder .

Cependant de ce que je comprends les deux problèmes sont totalement différent, toi tu as 1 mot par case et pas un texte entier a décortiquer ? (encore une fois un fichier aiderais vraiment a y voir plus clair )

si c'est le cas tu peux rajouter une condition général a l'ensemble de la macro

Je ne m'y connait pas du tout en macros alors pour la syntaxe je pourrais pas t'aider mais l'idée c'est de faire ça:

If Left ( activecell, 1) = "#" Then La macro

Else Ne rien faire

Non non j'ai bien des textes aussi. Pour être clair ce sont des descriptions qui contiennent aussi bien des mots normaux, des phrases et des #. (cf bio twitter)


Theze a écrit :

Bonjour,

Pas sûr d'avoir tout saisi mais voilà une piste par rapport à ce que j'en ai compris :

Sub Test()

    Dim Tbl()
    Dim Tablo
    Dim Plage As Range
    Dim Cel As Range
    Dim I As Integer
    Dim J As Integer
    Dim Adr As String

    'ici les mots à rechercher
    Tablo = Array("#Mot clé 1", "#Mot clé 2", "#Mot clé 3", "#Mot clé 4", "#Mot clé 5", "#Mot clé 6", "#Mot clé 7", "#Mot clé 8")

    'la palge de recherche est défini sur toute la zone utilisée sur la feuille active
    With ActiveSheet

        Set Plage = .Range(.Cells(1, 1), _
                    .Cells(.Cells.Find("*", .[A1], -4123, , _
                    1, 2).Row, .Cells.Find("*", .[A1], -4123, , _
                    2, 2).Column))

    End With

    'recherche les mots
    For I = 0 To UBound(Tablo)

        'dimentionne le tableau devant récevoir les résultats (le mot cherché et le nombre de fois trouvé)
        ReDim Preserve Tbl(1 To 2, 1 To I + 1)

        'commence la recherche...
        Set Cel = Plage.Find(Tablo(I), , xlValues, xlWhole)

        'si trouvé...
        If Not Cel Is Nothing Then

            'mémorise la première cellule
            Adr = Cel.Address

            'puis boucle...
            Do

                'le mot est inscrit dans la première dimension
                'et le nombre est incrémenté à chaque fois que la recherche est positive
                Tbl(1, I + 1) = Tablo(I)
                Tbl(2, I + 1) = Tbl(2, I + 1) + 1

                'passe à la suivante
                Set Cel = Plage.FindNext(Cel)

            Loop While Adr <> Cel.Address

        Else

            'si pas trouvé, inscrit le mot et la valeur 0
            Tbl(1, I + 1) = Tablo(I)
            Tbl(2, I + 1) = 0

        End If

    Next I

    'résultat dans la fenêtre d'exécution (Ctrl+G)
    For I = 1 To UBound(Tbl(), 2)

        Debug.Print "'"; Tbl(1, I); "' trouvé " & Tbl(2, I); " fois"

    Next I

End Sub

Bonjour Theze, merci pour ta réponse.

J'ai bien regarder ton code et j'ai l'impression qu'il faut que je rentre des mots à rechercher non ? (cf #Mot clé 1, etc...)

Mon but est de parcourir un texte et d'afficher les répétitions de chaque mot précédé d'un #. Je ne connais pas à l'avance les mots qui vont être répétés.

Edit : Si tu veux te faire une idée, regarde le lien que j'ai linké plus haut qui renvoi à un autre post de ce forum. J'utilise la même macro, ça fait presque ce que je demande sauf que cette macro liste tous les mots d'un texte et pas juste les mots précédés d'un #.

OK !

Remplace le motif de l'expression régulière :

reg.Pattern = "[a-zA-Zéèâäù']+"

par celui-ci :

reg.Pattern = "#[a-zA-Zéèâäù]+"
Theze a écrit :

OK !

Remplace le motif de l'expression régulière :

reg.Pattern = "[a-zA-Zéèâäù']+"

par celui-ci :

reg.Pattern = "#[a-zA-Zéèâäù]+"

Parfait merci ! J'avais mis reg.Pattern = "[a-zA-Zéèâäù]+#" donc en mettant le # à la fin mais ça ne marchait pas du coup...

Merci beaucoup pour toutes vos réponses.


Edit : Actuellement cette macro affiche le top en popup donc je pense à l'aide de tableauTop(). Cependant cette popup est limitée à 48 lignes en vertical et il me sera demandé de faire des tops 50, 100 voire 1000 de ces #.

L'idée serait d'afficher ce top dans une cellule précise mais je ne sais pas comment le faire...

Merci pour vos idées.

Je ne suis plus devant mon PC et avec le smartphone je ne peux pas faire de tests, je regarde ça demain matin.

Merci beaucoup pour ton aide, je continue de chercher en attendant.

Bonjour,

Je te propose d'utiliser un UserForm avec une ListBox (ici nommée "ListBox1" nommée par défaut) et un bouton ("CommandButton1") pour lancer la proc que j'ai épuré pour tes besoins :

Private Sub CommandButton1_Click()

    'adapter ici la récupération de la plage à scanner
    rechercheMots Feuil1.Range("C7:C8")

End Sub

Sub rechercheMots(maPlage As Range)

    Dim reg As VBScript_RegExp_55.regexp
    Dim Match As VBScript_RegExp_55.Match
    Dim Matches As VBScript_RegExp_55.MatchCollection
    Dim Cellule As Range

    Set reg = New VBScript_RegExp_55.regexp

    reg.Pattern = "#[a-zA-Zéèâäù']+"
    reg.Global = True

    For Each Cellule In maPlage

        If Cellule.Value <> "" Then

            Set Matches = reg.Execute(Cellule.Value)

            For Each Match In Matches

                'en conservant le dièse
                'Me.ListBox1.AddItem Match

                'en le supprimant
                Me.ListBox1.AddItem Right(Match, Len(Match) - 1)

            Next Match

        End If

    Next Cellule

End Sub

Bonjour Theze, merci pour ta réponse.

J'ai voulu tester ton code mais je possède une erreur au niveau de : Me.ListBox1.AddItem Match.

"Utilisation incorrecte du mot clé Me".

Edit : J'ai bien crée un UserForm avec un bouton "CommandButton1" mais j'ai quand même une erreur de compilation sur ListBox1. Il faut ajouter une référence spéciale ?

Edit2 : J'ai réussi à y faire fonctionner. Cependant ça n'affiche plus du tout le nombre de fois qu'apparaissent les # et ça ne les classe donc pas par popularité.

De plus si je veux y faire dans une cellule c'est parce que je veux pouvoir les copier coller facilement.

Je veux simplement la même macro qu'au départ sauf que ça n'affiche pas dans une popup mais dans une autre cellule...

Et bien alors, regarde la variable "Affichage". Au lieu de :

MsgBox affichage

tu peux faire :

Cells(1, 1).Value = affichage
Theze a écrit :

Et bien alors, regarde la variable "Affichage". Au lieu de :

MsgBox affichage

tu peux faire :

Cells(1, 1).Value = affichage

Merci beaucoup, mais finalement j'ai utilisé une autre option à base de AutoIt et de l'outil Convertir de l'onglet Données pour faire étape par étape vu que mes classements seront aussi par thème (ex : économie, etc...).

Je garde néanmoins ce bout de code qui pourra toujours me servir.

Je n'avais fais que de survoler le code mais si tu veux pouvoir avoir x valeurs retournées, il faut faire des modifs à plusieurs endroits dans le code !

-1 ajouter un argument à la Sub pour définir le nombre de valeurs voulues :

Sub rechercheMots(maPlage As Range, Max As Integer)

l'appel devient alors :

rechercheMots Feuil1.Range("C7:C8"), 100 'où 100 est le nombre maxi de valeurs à retourner

ensuite, dans le dimensionnement du tableau modifier la borne 10 par la variable "Max" :

Dim tableauTop() As Variant
ReDim tableauTop(1 To Max, 1 To 2)

puis, dans la boucle Wihle Wend, faire la modif suivante :

While numElement < Max + 1 And dico.Count > 0 And maxOcc <> 0

Dans le code que j'avais pris, je changeais juste la valeur :

ReDim tableauTop(1 To ValeurMaximaleQueJeSouhaite, 1 To 2)

et la valeur :

While numElement < ValeurMaximaleQueJeSouhaite And dico.Count > 0 And maxOcc <> 0

Et selon cette valeur ça me donnait un top 10, 50, 100, ...

OK, parfait !

Rechercher des sujets similaires à "mot precede"