问题
I have the following code that selects data from an Excel Cell & replaces a specific piece of text in my Word document (for purposes of this question, the Excel Cell has been replaced by a plain text string).
The data ": goes to " is constant, then the data "aaa bbb" can be anything until we reach the " of " which is also constant. Then the data after the " of ", "ccc ddd eee" can be anything until it hits the " - " which is also constant.
Is it possible to make the "aaa bbb" data BOLD & UPPER CASE, whilst making the "ccc ddd eee" data into ITALICS ?
": goes to AAA BBB of ccc ddd eee - "
Selection.HomeKey Unit:=wdStory
Selection.Find.ClearFormatting
Selection.Find.Replacement.ClearFormatting
With Selection.Find
.Text = "MOTMDIV1"
.Replacement.Text = ": goes to aaa bbb of ccc ddd eee - "
.Forward = True
.Wrap = wdFindContinue
.Format = False
.MatchCase = True
.MatchWholeWord = False
.MatchWildcards = False
.MatchSoundsLike = False
.MatchAllWordForms = False
End With
Selection.Find.Execute Replace:=wdReplaceAll
回答1:
If you change your Find and Replace to a single Find and Replace from All, Word will highlight the replaced text allowing you to alter the properties of the replaced range. I've modified your code to highlight this:
Sub ReplaceAndFormat()
Dim sConst1 As String, sConst2 As String, sReplaceMent As String
Dim rRange As Range, rFormat As Range
'Set your constants. This is where you can read in from Excel or whereever
sConst1 = "aaa bbb"
sConst2 = "ccc ddd eee"
'Build the replacement string
sReplaceMent = ": goes to " & sConst1 & " of " & sConst2 & " - "
'Your replacement code
Selection.HomeKey Unit:=wdStory
Selection.Find.ClearFormatting
Selection.Find.Replacement.ClearFormatting
With Selection.Find
.Text = "MOTMDIV1"
.Replacement.Text = sReplaceMent
.Forward = True
.Wrap = wdFindContinue
.Format = False
.MatchCase = True
.MatchWholeWord = False
.MatchWildcards = False
.MatchSoundsLike = False
.MatchAllWordForms = False
.Execute Replace:=wdReplaceOne
'If we replace one by one Word will select the range after it finds it
If .Found Then
'After you've done the replacement, set it to a range so you can format
Set rRange = Selection.Range
'We know the length of all the strings so we can set the range of the "aaa bbb" etc etc
Set rFormat = ActiveDocument.Range(rRange.Start + 10, rRange.Start + 10 + VBA.Len(sConst1))
'Set the formats for the first part
rFormat.Font.Bold = True
rFormat.Font.AllCaps = True
'Repeat for the second part
Set rFormat = ActiveDocument.Range(rRange.Start + 14 + VBA.Len(sConst1), rRange.Start + 14 + VBA.Len(sConst1) + VBA.Len(sConst2))
rFormat.Font.Italic = True
End If
End With
End Sub
Note: If you want to Find and Replace all instantences of your search text then you'll have to loop through the document like this: Repeating Microsoft Word VBA until no search results found
来源:https://stackoverflow.com/questions/14773971/word-2007-vba-making-some-text-bold-other-italic