VBA Word - Mettre en gras certains mots selon une liste

Résolu/Fermé
Skt44 - 5 avril 2022 à 08:43
Skt44 Messages postés 2 Date d'inscription vendredi 8 avril 2022 Statut Membre Dernière intervention 8 avril 2022 - 8 avril 2022 à 10:46
Bonjour,

Je souhaite réaliser une macro qui met dans un document WORD certains mots en gras selon une liste.

J'ai réussi uniquement à le faire pour un mot spécifique "Bold".

Je souhaiterais le faire pour une liste plus grande de mots et qui varie d'un texte à un autre. Comment faire ?

Je vous remercie

""Sub Macro4()
'
' Macro2 Macro
'
'
Selection.Find.ClearFormatting
Selection.Find.Font.Bold = True
Selection.Find.Replacement.ClearFormatting
With Selection.Find
.Text = "Bold"
.Replacement.Text = "Bold"
.Forward = True
.Wrap = wdFindContinue
.Format = True
.MatchCase = False
.MatchWholeWord = False
.MatchWildcards = False
.MatchSoundsLike = False
.MatchAllWordForms = False
End With
Selection.Find.Execute Replace:=wdReplaceAll""
End Sub
A voir également:

13 réponses

yg_be Messages postés 23327 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 15 novembre 2024 Ambassadeur 1 551
5 avril 2022 à 08:47
bonjour,
Quand tu écris "qui varie d'un texte à un autre", veux tu dire "qui varie d'un document à un autre"?
Tu as donc une liste de noms de documents, et, pour chaque document, une liste de mots?
As-tu l'intention d'avoir une macro par document?
0
Hello,

Yes, ce sont des textes de 2000 mots ou plus et la liste varie pour chaque document. J'imaginais une macro qui s'adapte mais je ne sais pas si c'est possible
0
yg_be Messages postés 23327 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 15 novembre 2024 1 551
5 avril 2022 à 10:23
Quand tu écris "texte", est-ce équivalent à document? Plus clair de ne pas changer de vocabulaire.
Ce ne sera possible que si tu décris ce que tu souhaites.
Comment envisages-tu d'utiliser cette macro?
Elle serait dans un document unique et elle traiterait d'autres documents? Lesquels, quand?
Comme souhaites-tu que cela se passe?
0
Effectivement pour moi texte = document dans mon esprit.

Je ne pourrais pas vous répondre sur l'utilisation, cela va dépendre de ce qui est possible de faire. Je peux m'adapter .

Enfaite je souhaite gagner du temps et automatiser une tâche répétitive. Actuellement je dois faire pour chaque document, mettre en gras une liste d'une douzaine de mots dans tous le document. C'est assez chronophage
0
yg_be Messages postés 23327 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 15 novembre 2024 1 551
5 avril 2022 à 14:22
Décris comment tu fais actuellement.
Que fais-tu chaque jour, chaque semaine, ...
0
C'est à dire ?
0
yg_be Messages postés 23327 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 15 novembre 2024 1 551
5 avril 2022 à 14:50
Imagine que le code VBA soit une personne qui travaille pour toi.
Tu pars en vacances, que vas-tu lui demander de faire, et quand?
1

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
J'imaginais:

1- J'ouvre mon document (avec mon texte)
2- J'ajoute la liste des mots dans mon document (ou dans un excel à côté)
3- J'active la Macro depuis mon word
4- Les mots de ma liste passe en gras
0
yg_be Messages postés 23327 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 15 novembre 2024 1 551
5 avril 2022 à 15:38
mon document, et mon word, c'est la même chose?
la macro est déjà présente dans le document?
tu travailles toujours avec le même document?
tu utilises plusieurs fois la liste des mots?
où cette liste est préparée?
si tu as plusieurs listes, comment choisis-tu laquelle?

un exemple:
sub macro4()
Dim mots() As Variant, mot
mots = Array("Bold", "unautremot", "encoreunautremot")
For Each mot In mots
    call engraisse(mot)
Next mot
end sub
private Sub engraisse(unmot as string)
Selection.Find.ClearFormatting
Selection.Find.Font.Bold = True
Selection.Find.Replacement.ClearFormatting
With Selection.Find
.Text = unmot
.Replacement.Text = unmot
.Forward = True
.Wrap = wdFindContinue
.Format = True
.MatchCase = False
.MatchWholeWord = False
.MatchWildcards = False
.MatchSoundsLike = False
.MatchAllWordForms = False
End With
Selection.Find.Execute Replace:=wdReplaceAll""
End Sub
0
- mon document, et mon word, c'est la même chose? Non
- la macro est déjà présente dans le document? Non
- tu travailles toujours avec le même document? Non
- tu utilises plusieurs fois la liste des mots? Une liste différente à chaque fois
- où cette liste est préparée? Excel généralement
- si tu as plusieurs listes, comment choisis-tu laquelle? Une liste correspond à un texte
0
yg_be Messages postés 23327 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 15 novembre 2024 1 551
5 avril 2022 à 16:56
comment choisis-tu sur quel document travailler?

le classeur Excel serait peut-être le bon endroit d'où démarrer la macro.
0
Soit je crée les documents, soit je les reçois par mail.
0
yg_be Messages postés 23327 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 15 novembre 2024 1 551
5 avril 2022 à 23:34
tu travailles sur un document à la fois?
c'est d'après le nom du document qu'on choisit la liste de mots?
1
Tout à fait, une document à la fois et en fonction du titre du document j'associe la bonne liste de mots
0
yg_be Messages postés 23327 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 15 novembre 2024 Ambassadeur 1 551
6 avril 2022 à 14:49
Je suggère de faire ainsi:
- avoir une macro dans un document Word
- quand cette macro est exécutée, elle va examiner tous les documents ouverts, et, si le nom du document est dans une liste de documents, elle va mettre en gras une liste de mots.
- ces deux listes pourraient être extraites d'un document Excel.

Avant d'aller plus loin, j'ai fait un petit prototype, qui n'utilise pas encore de listes, mais où le nom du document à modifier, ainsi que la liste des mots, est dans le code de la macro.

Peux-tu tester cela, et indiquer si cela va dans la bonne direction?

Option Explicit

Private Sub browsedocs()
Dim wDoc As Document
For Each wDoc In Application.Documents
    If wDoc.Name = "testupd.docx" Then
        Call undoc(wDoc, "Bold,unautremot,encoreunautremot")
    End If
Next wDoc
End Sub
Private Sub undoc(doc As Document, lesmots As String)
Dim mots As Variant, mot, smot As String
mots = Split(lesmots, ",")
Dim r As Range
Set r = doc.Range
r.WholeStory
For Each mot In mots
    smot = mot
    Call engraisse(r, smot)
Next mot
End Sub
Private Sub engraisse(r As Range, unmot As String)
With r.Find
    .ClearFormatting
    .Replacement.ClearFormatting
    .Replacement.Font.Bold = True
    .Text = unmot
    .Replacement.Text = unmot
    .Forward = True
    .Wrap = wdFindContinue
    .Format = True
    .MatchCase = False
    .MatchWholeWord = False
    .MatchWildcards = False
    .MatchSoundsLike = False
    .MatchAllWordForms = False
    .Execute Replace:=wdReplaceAll
End With
End Sub
Private Sub engraisseok(doc As Document, unmot As String)
doc.Activate
Selection.WholeStory
With Selection.Find
    .ClearFormatting
    .Replacement.ClearFormatting
    .Replacement.Font.Bold = True
    .Text = unmot
    .Replacement.Text = unmot
    .Forward = True
    .Wrap = wdFindContinue
    .Format = True
    .MatchCase = False
    .MatchWholeWord = False
    .MatchWildcards = False
    .MatchSoundsLike = False
    .MatchAllWordForms = False
    .Execute Replace:=wdReplaceAll
End With
End Sub
0
Bonjour yg_be,

C'est parfaitement ça, ça marche super bien !
0
yg_be Messages postés 23327 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 15 novembre 2024 1 551
7 avril 2022 à 15:05
Pour aller chercher les noms dans Excel:
- créer un fichier excel (leslistes.xlsx) dans le même répertoire que le document avec la macro
- dans le fichier excel, dans une feuille nommée "list", avoir une liste de noms de documents, à partir de A2, et, à coté (B2), une liste avec les mots à chercher (dans une cellule, tout les mots, séparés par une virgule. Donc une ligne par document candidat.
- dans l'éditeur VBA de Word, où il y a la macro, ajouter "Microsoft Excel ... Object Library" dans les références
- remplacer la sub browsedocs par ceci:
Sub browsedocs()
Dim wDoc As Document, wb As Excel.Workbook, nomdoc As Excel.Range, ws As Excel.Worksheet
Set wb = Excel.Workbooks.Open(ActiveDocument.Path + "/leslistes.xlsx")
Set ws = wb.Sheets("list")
For Each wDoc In Application.Documents
    Set nomdoc = ws.Cells(2, 1)
    Do While nomdoc <> ""
        If wDoc.Name = nomdoc Then
            Call undoc(wDoc, nomdoc.Offset(, 1).Value)
            Exit Do
        End If
        Set nomdoc = nomdoc.Offset(1)
    Loop
Next wDoc
wb.Close
End Sub
0
merci beaucoup pour ces éléments,

Je viens de faire les modifications mais j'ai une erreur "erreur de compilation : type défini par l'utilisateur non défini"

Cela souligne "Sub browsedocs()"
0
yg_be Messages postés 23327 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 15 novembre 2024 1 551
7 avril 2022 à 17:51
As-tu ajouté "Microsoft Excel ... Object Library" dans les références?
Il devrait y avoir un texte surligné en jaune, et un autre surligné en bleu. Quel est le texte en bleu?
0
Skt44 Messages postés 2 Date d'inscription vendredi 8 avril 2022 Statut Membre Dernière intervention 8 avril 2022
Modifié le 8 avril 2022 à 10:47
Re,

Effectivement j'avais mal coché l'option,

Cependant, il me semble avoir tout fait correctement mais rien ne se passe
0
yg_be Messages postés 23327 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 15 novembre 2024 1 551
8 avril 2022 à 10:38
Le nom de ton document n'est pas "macro", c'est plutôt "macro.doc" ou quelque chose du genre.
Comment avais-tu testé le prototype?
0
Skt44 Messages postés 2 Date d'inscription vendredi 8 avril 2022 Statut Membre Dernière intervention 8 avril 2022
8 avril 2022 à 10:46
Ok c'est bon ça fonctionne.

Un grand merci yg_be pour ton aide. Le gain de temps et de productivité grâce à la macro m'est extrêmement précieux.

Merci merci
0