简体   繁体   中英

Find all instances of yellow text and change font color to red

I need a vba macro that searches for all text that has font color as yellow within a MS Word 2007 document and changes it to red. The yellow color won't show in the printouts. Manually selecting and changing will take me hours.

Following on from stakx's Word 97 solution, here's what works in Word 2010:

  1. Open the Find and Replace dialogue (eg Ctrl-H)
  2. Click in the "Find what" box.
  3. Format drop-down, Font, choose the Font color to be found, OK.
  4. Click in the "Replace with" box.
  5. Format drop-down, Font, choose the colour to end up with, OK.
  6. Observe that the Format: description for "Find what" and "Replace with" is now different.
  7. Replace/Replace All/Find Next as desired.

You can determine the original colour as follows:

  1. Click on a bit of text with the original colour
  2. Open the colour palette. If neither a "Theme color" nor a "Standard color" is selected, you may need to click on "More colors".

There's actually a non-programming solution for this. I've tried it in Word 97, so I'd assume Word 2007 would still allows this:

  1. Open the Search & Replace dialog.
  2. Tick the checkbox that says, Pattern search (or similar).
  3. As search term, enter (?) .
  4. Select a formatting for the search (yellow text color).
  5. As replacement term, enter \\1 .
  6. Select the formatting for the replacement (red text color).
  7. Then search and replace everything.

Steps 2, 3 and 5 (entering search and replace regular expressions) may not actually be necessary.

If you definitely need VBA code, you should be able to record the above steps as a macro and then look at the generated code.

Sub ChangeColorWithReplace()   
    Selection.Find.ClearFormatting
    Selection.Find.Font.Color = wdColorYellow
    Selection.Find.Replacement.ClearFormatting
    Selection.Find.Replacement.Font.Color = wdColorRed
    With Selection.Find
        .Text = ""
        .Replacement.Text = ""
        .Forward = True
        .Wrap = wdFindContinue
        .Format = True
        .MatchCase = False
        .MatchWholeWord = False
        .MatchKashida = False
        .MatchDiacritics = False
        .MatchAlefHamza = False
        .MatchControl = False
        .MatchByte = False
        .MatchWildcards = False
        .MatchSoundsLike = False
        .MatchAllWordForms = False
    End With
    Selection.Find.Execute Replace:=wdReplaceAll
End Sub

Also, here's another way to do it. It's not extremely fast, but it's faster than doing it manually:

Sub ChangeFontColorByCharacter()
    Application.ScreenUpdating = False
    Dim d As Document: Set d = ActiveDocument
    For i = 1 To d.Characters.Count
        If d.Characters(i).Font.TextColor.RGB = RGB(255, 255, 0) Then
            d.Characters(i).Font.TextColor.RGB = RGB(255, 0, 0)
            DoEvents
        End If
    Next
    Application.ScreenUpdating = True
End Sub

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM