2017-08-07 1 views
0

Je suis en train de construire une macro (comme un noob) pour trouver certains mots, puis changer la mise en forme de ce mot (par exemple mettre en gras ou en italique) sortemacro Word Search & Replace numéro formating

Ce code » des œuvres. Il trouvera quelques mots et les changera mais ne changera pas les autres. La chose étrange est que cela fonctionne jusqu'à ce que j'ajoute un autre sous puis il arrête le formatage sur certains mots, tout en formatant les autres. La routine ne se casse jamais et court jusqu'à la fin sans erreur. Est-ce que n'importe qui peut enseigner pourquoi ceci se produit et ce que je fais mal? Je ne suis pas un programmeur. Merci

Sub Macro2() 
' 
' Macro2 Macro 
' 
' 
    Selection.Find.ClearFormatting 
    Selection.Find.Replacement.ClearFormatting 
    With Selection.Find 
     .Text = "Printer" 
     .Replacement.Text = "" 
     .Replacement.Font.bold = True 
     .Forward = True 
     .Wrap = wdFindContinue 
     .Format = True 
     .MatchCase = False 
     .MatchWholeWord = True 
     .MatchWildcards = False 
     .MatchSoundsLike = False 
     .MatchAllWordForms = False 
    End With 
    Selection.Find.Execute Replace:=wdReplaceAll 
    With Selection.Find 
     .Text = "Parameter Values" 
     .Replacement.Text = "" 
     .Replacement.Font.bold = True 
     .Forward = True 
     .Wrap = wdFindContinue 
     .Format = True 
     .MatchCase = False 
     .MatchWholeWord = False 
     .MatchWildcards = False 
     .MatchSoundsLike = False 
     .MatchAllWordForms = False 
    End With 

    With Selection.Find 
     .Text = "Use All Applicants Indicator" 
     .Replacement.Text = "" 
     .Replacement.Font.bold = True 
     .Forward = True 
     .Wrap = wdFindContinue 
     .Format = True 
     .MatchCase = False 
     .MatchWholeWord = False 
     .MatchWildcards = False 
     .MatchSoundsLike = False 
     .MatchAllWordForms = False 
    End With 

    With Selection.Find 
     .Text = "Next Section" 
     .Replacement.Text = "" 
     .Replacement.Font.bold = True 
     .Forward = True 
     .Wrap = wdFindContinue 
     .Format = True 
     .MatchCase = False 
     .MatchWholeWord = False 
     .MatchWildcards = False 
     .MatchSoundsLike = False 
     .MatchAllWordForms = False 
    End With 

Répondre

1

Je programmerais la macro de recherche comme un sous-répertoire séparé, comme ceci.

Private Sub FindAndReplace(ByVal Txt As String, _ 
          Optional ByVal NewTxt As String, _ 
          Optional ByVal Fmt As Boolean = False, _ 
          Optional ByVal BldFmt As Boolean = False) 

    With ActiveDocument.Content 
     With .Find 
      .ClearFormatting 
      .Text = Txt 
      .Format = Fmt Or BldFmt 

      With .Replacement 
       .ClearFormatting 
       .Text = NewTxt 
       .Font.Bold = BldFmt 
      End With 
      .Forward = True 
      .Wrap = wdFindContinue 
      .MatchCase = False 
      .MatchWholeWord = True 
      .MatchWildcards = False 
      .MatchSoundsLike = False 
      .MatchAllWordForms = False 
     End With 
     .Find.Execute Replace:=wdReplaceAll 
    End With 
End Sub 

Tous les paramètres optionnels que vous pouvez utiliser mais que vous n'avez pas à utiliser. J'appelleraient sous à plusieurs reprises avec des paramètres différents, peut-être comme ceci: -

Sub MakeReplacements1() 

    FindAndReplace "Printer", BldFmt:=True 
    FindAndReplace "Parameter values", BldFmt:=True 
    FindAndReplace "Use All Applicants Indicator", BldFmt:=True 
    FindAndReplace "Next Section", BldFmt:=True 
End Sub 

ou même comme ceci: -

Sub MakeReplacements2() 

    Dim Fnd() As String 
    Dim i As Long 

    Fnd = Split("Printer|Parameter values|Use All Applicants Indicator|Next Section", "|") 
    For i = 0 To UBound(Fnd) 
     FindAndReplace Fnd(i), BldFmt:=True 
    Next i 
End Sub 
1

Selection est un objet comprenant la partie du document actuellement sélectionnée. Find est une propriété de l'objet Selection définissant l'objet Find (même nom mais l'un est une propriété, l'autre un objet). L'objet Find a des propriétés telles que Text, Forward, Wrap, etc. et il a des méthodes comme ClearFormatting ou Execute. Tout cela, vous pouvez lire dans la bibliothèque MSDN. Maintenant, lorsque vous définissez l'objet Find, vous décrivez quelque chose que vous voulez trouver. Avec la commande Execute, vous commencez à le rechercher. Votre code manque cette commande dans certains endroits. La recherche est limitée à Selection. Si vous n'avez rien sélectionné, Word supposera que vous voulez rechercher l'ensemble du document. Mais Selection.Find va changer la sélection pour mettre en évidence l'élément trouvé. Par conséquent, si vous souhaitez continuer à rechercher l'intégralité du document, vous devez réinitialiser la sélection après chaque recherche, par exemple, Activedocument.Content.Select.

En un mot, si vous désactivez l'objet Find après chaque utilisation, définissez une nouvelle description avant chaque utilisation répétée, définir l'objet Selection pour chaque recherche et ne pas oublier de Execute chaque recherche séparée votre code devrait fonctionner comme vous l'avez l'intention de travailler.

+0

Ajout du exécutons travaillé. Je vous remercie. Cependant, je suis sûr qu'il doit y avoir une méthode plus propre pour ce faire. J'essaie de lire mais les documents MSDN n'ont pas de sens pour moi. Merci quand même. – esponapule