VBA Word - Mettre en gras certains mots selon une liste
Résolu
Skt44
-
Skt44 Messages postés 2 Statut Membre -
Skt44 Messages postés 2 Statut Membre -
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
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
13 réponses
-
yg_be Messages postés 23437 Date d'inscription Statut Contributeur Dernière intervention Ambassadeur 1 588
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? -
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-
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?
-
-
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 -
-
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-
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
-
-
- 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 -
-
Tout à fait, une document à la fois et en fonction du titre du document j'associe la bonne liste de mots
-
yg_be Messages postés 23437 Date d'inscription Statut Contributeur Dernière intervention Ambassadeur 1 588
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 -
-
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
-
-
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()" -
Re,
Effectivement j'avais mal coché l'option,
Cependant, il me semble avoir tout fait correctement mais rien ne se passe -
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