VBA Word - Poner en negrita ciertas palabras según una lista

Resuelto
Bonjour,

Quiero realizar una macro que ponga en un documento WORD ciertas palabras en negrita según una lista.

Solo he logrado hacerlo para una palabra específica "Bold".

Me gustaría hacerlo para una lista más grande de palabras que varíen de un texto a otro. ¿Cómo hacerlo?

Se lo agradezco

""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 respuestas

  1. Colaborador
    Hola,
    Cuando escribes "que varía de un texto a otro", ¿quieres decir "que varía de un documento a otro"?
    ¿Tienes entonces una lista de nombres de documentos y, para cada documento, una lista de palabras?
    ¿Tienes intención de tener una macro por documento?
    1. Hola,

      Sí, son textos de 2000 palabras o más y la lista varía para cada documento. Imaginaba una macro que se adapte, pero no sé si es posible.
      1. Colaborador
        Cuando escribes "texto", ¿es equivalente a documento? Más claro no cambiar de vocabulario.
        Esto sólo será posible si describes lo que deseas.
        ¿Cómo planeas utilizar esta macro?
        ¿Estaría en un único documento y trataría otros documentos? ¿Cuáles, cuándo?
        ¿Cómo deseas que suceda esto?
    2. Efectivamente, para mí texto = documento en mi mente.

      No podría responderle sobre el uso, eso dependerá de lo que sea posible hacer. Puedo adaptarme.

      En realidad, deseo ahorrar tiempo y automatizar una tarea repetitiva. Actualmente tengo que hacer para cada documento, poner en negrita una lista de una docena de palabras en todo el documento. Es bastante lento.
      1. Colaborador
        Describe cómo lo haces actualmente.
        Qué haces cada día, cada semana, ...
    3. ¿A qué te refieres?
      1. Colaborador
        Imagine que el código VBA sea una persona que trabaja para ti.
        Te vas de vacaciones, ¿qué le pedirás que haga y cuándo?
    4. Imaginaba:

      1- Abro mi documento (con mi texto)
      2- Agrego la lista de palabras en mi documento (o en un Excel al lado)
      3- Activo la Macro desde mi Word
      4- Las palabras de mi lista se ponen en negrita
      1. Colaborador
        ¿Mi documento y mi Word son lo mismo?
        ¿La macro ya está presente en el documento?
        ¿Siempre trabajas con el mismo documento?
        ¿Utilizas varias veces la lista de palabras?
        ¿Dónde se prepara esta lista?
        Si tienes varias listas, ¿cómo eliges cuál usar?

        Un ejemplo:
        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
    5. - ¿mi documento y mi Word son la misma cosa? No
      - ¿la macro ya está presente en el documento? No
      - ¿siempre trabajas con el mismo documento? No
      - ¿usas varias veces la lista de palabras? Una lista diferente cada vez
      - ¿dónde se prepara esta lista? En Excel generalmente
      - si tienes varias listas, ¿cómo eliges cuál? Una lista corresponde a un texto
      1. Colaborador
        ¿Cómo eliges en qué documento trabajar?

        El libro de Excel podría ser tal vez el lugar adecuado desde donde empezar la macro.
    6. O bien creo los documentos, o los recibo por correo electrónico.
      1. Colaborador
        ¿Trabajas en un documento a la vez?
        ¿Es según el nombre del documento que elegimos la lista de palabras?
    7. Totalmente, un documento a la vez y según el título del documento asocio la lista correcta de palabras.
      1. Colaborador
        Sugeriría hacer lo siguiente:
        - tener una macro en un documento de Word
        - cuando esta macro se ejecute, examinará todos los documentos abiertos y, si el nombre del documento está en una lista de documentos, pondrá en negrita una lista de palabras.
        - estas dos listas podrían extraerse de un documento de Excel.

        Antes de continuar, he hecho un pequeño prototipo, que aún no utiliza listas, pero donde el nombre del documento a modificar, así como la lista de palabras, está en el código de la macro.

        ¿Puedes probar esto e indicar si va en la dirección correcta?

        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 
        1. Hola yg_be,

          ¡Eso es exactamente así, funciona de maravilla!
          1. Colaborador
            Para buscar los nombres en Excel:
            - crear un archivo excel (leslistes.xlsx) en el mismo directorio que el documento con la macro
            - en el archivo excel, en una hoja llamada "list", tener una lista de nombres de documentos, a partir de A2, y al lado (B2), una lista con las palabras a buscar (en una celda, todas las palabras, separadas por una coma. Por lo tanto, una fila por documento candidato.
            - en el editor VBA de Word, donde está la macro, añadir "Microsoft Excel ... Object Library" en las referencias
            - reemplazar la sub browsedocs por esto:
            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
        2. muchas gracias por estos elementos,

          Acabo de hacer las modificaciones, pero tengo un error "error de compilación: tipo definido por el usuario no definido"

          Eso subraya "Sub browsedocs()"
          1. Colaborador
            ¿Has añadido "Microsoft Excel ... Object Library" en las referencias?
            Debería haber un texto resaltado en amarillo y otro resaltado en azul. ¿Cuál es el texto en azul?
        3. Re,

          Efectivamente, había marcado mal la opción,

          Sin embargo, me parece que he hecho todo correctamente pero no pasa nada.
          1. Colaborador
            El nombre de tu documento no es "macro", es más bien "macro.doc" o algo por el estilo.
            ¿Cómo habías probado el prototipo?
        4. Ok está bien, funciona.

          Un gran gracias yg_be por tu ayuda. El ahorro de tiempo y de productividad gracias a la macro es extremadamente valioso para mí.

          Gracias, gracias.