find italic fonts in word document using vba

2019-07-06 07:01发布

问题:

With the Find function(Ctrl+F) I can search and select all words in Italicized font from a document. How would this be done with vba?

I tried the macro recorder but the code I get there does not work.

Sub Makro1()
'
' Makro1 Makro
' Makro aufgezeichnet am 16.06.2011 von u0327336
'
    Selection.Find.ClearFormatting
    With Selection.Find
        .Text = ""
        .Replacement.Text = ""
        .Forward = True
        .Wrap = wdFindContinue
        .Format = True
        .MatchCase = False
        .MatchWholeWord = False
        .MatchWildcards = False
        .MatchSoundsLike = False
        .MatchAllWordForms = False
    End With
End Sub

The goal would be to have all italic font words being selected/highlighted in the document.

thanks, kay

回答1:

You may need to add :

Selection.Find.Font.Italic = True

That could became :

With Selection.Find
   .Text = ""
   .FOnt.Italic = True
   'other search stuff
End with

EDIT: another try (not complete though)

Sub hilightItalic()
    With ActiveDocument.Content.Find
        ' to ensure that unwanted formats aren't included as criteria
        .ClearFormatting
        'You don't care what the text is
        .Text = ""
        'Find the italic text
        .Font.Italic = True
        'Delete the text found
        .Replacement.Text = ""
        'delete all italic text
        .Execute Replace:=wdReplaceAll
        '.HitHighlight "", vbYellow, vbRed
    End With
End Sub

But yet, the replace does work well but highlight does not work if there is no text. Anyone has an idea ?

EDIT 2: Found a working solution, even if i did not manage to have hithighlight working though

Sub hilightItalic()
    Dim oRng As Word.Range
    Set oRng = ActiveDocument.Content
    With oRng.Find
        ' to ensure that unwanted formats aren't included as criteria
        .ClearFormatting
        'You don't care what the text is
        .Text = ""
        'Find the italic text
        .Font.Italic = True
        'Loop for each match and set a color
        While .Execute
            oRng.HighlightColorIndex = wdDarkYellow
            oRng.Collapse wdCollapseEnd
        Wend
    End With
End Sub

Regards,

Max



回答2:

The last effort actually works a treat in Word 2010. I'm not sure why the report was that it didn't work.

Here it is changed to ASCIIfy italics, which is what I want for text-based newsgroups:

 Sub ASCIIfy()
    Dim myString As Word.Range
    Set myString = ActiveDocument.Content
    With myString.Find
        '// ensure unwanted formats aren't included as criteria
        .ClearFormatting
        '// we don't care what the text is
        .Text = ""
        '// find the italic text
        .Font.Italic = True
        '// loop for each match and surround with "_"
        While .Execute
            myString.Text = "_" & myString & "_"
            myString.Font.Italic = False
            myString.Collapse wdCollapseEnd
        Wend
    End With
End Sub


回答3:

Set Selection.Find.Font.Italic = True.

Selection.Find.ClearFormatting

' The next line does the trick.
Selection.Find.Font.Italic = True

With Selection.Find
    .Text = "YourText"
    .Replacement.Text = ""
    .Forward = True
    .Wrap = wdFindContinue
    .Format = True
    .MatchCase = False
    .MatchWholeWord = False
    .MatchWildcards = False
    .MatchSoundsLike = False
    .MatchAllWordForms = False
End With
Selection.Find.Execute

Hint for the next time: Record a macro, perform the actions you want to automate, and look what code is recorded. That's how I found this. :D

[edit]

I see that you tried recording it. Weird that that didn't work.. :-S



回答4:

You need to iterate through the cells in the range that you want to check, and specifically check if it has its font italicized. AFAIK .Italic is not a "findable" option.

The following code is an example of iterating through the cells to find what you need.

Sub TestMe2()

Dim rng As Range

'// change as needed to the proper worksheet reference
With ThisWorkbook.Worksheets(1)

    '// replace the .Range statement with an appropriate range for your data
    For Each rng In .Range(.Cells(1, 1), .Cells(100, 100))

        If rng.Font.Italic = True Then
            '// uses the yellow highlight color, change to suit your needs
            rng.Interior.Color = 65535
        End If

    Next rng
End With

End Sub