Pau*_*on0 5 vba ms-word word-vba
我正在使用带有宏的Word 2007模板,该宏会将字符样式应用于所选文本。似乎“查找/替换”功能将是一个不错的起点,但是我认为我发现了一个错误/限制,该错误/限制使宏无法按预期工作。
这是我的vba代码:
Sub restyleSelection()
Dim r As Range
Set r = Selection.Range
With r.Find
.Style = ActiveDocument.Styles("Default Paragraph Font")
.Text = ""
.Replacement.Text = ""
.Replacement.Style = ActiveDocument.Styles("Emphasis")
.Forward = True
.Wrap = wdFindStop
.Format = True
.MatchCase = False
.MatchWholeWord = False
.MatchWildcards = False
.MatchSoundsLike = False
.MatchAllWordForms = False
.Execute Replace:=wdReplaceAll
End With
End Sub
Run Code Online (Sandbox Code Playgroud)
如果我创建一个包含几个段落的测试文档,并在其中一个段落中选择了几个单词,然后运行宏,则“ Emphasis”样式不仅适用于所选内容,而且适用于所选内容的结尾文件。
使用实际的GUI查找/替换工具,此行为是相同的。
我的问题是:如何克服这个错误/限制,仅在选择/范围内应用字符样式?
更多信息:
我真正需要宏做的是将某种格式应用于整个选区,同时保持选区中的现有字符样式。例如,如果所选文本包含粗体,斜体,其余为默认段落字体,则宏应将粗体替换为“ Revised Bold”,将“ Italic”替换为“ Revised Italic”,并且用“修订”替换“默认段落字体”。这样,当我使用伴随宏“撤消”此宏的操作时,可以替换原始字符样式(粗体,斜体,默认段落字体)。
解决:
这是我最终得出的解决方案:
Sub applyNewRevisedText
Dim r As Range ' Create a new Range object
Set r = Selection.Range ' Assign the current selection to the Range
Dim rng As Range
For Each rng In r.Words
Set rngStyle = rng.Style
Select Case rngStyle
Case "Bold"
rng.Style = ActiveDocument.Styles("New/Revised Text Bold")
Case "Italic"
rng.Style = ActiveDocument.Styles("New/Revised Text Emphasis")
Case Else
rng.Style = ActiveDocument.Styles("New/Revised Text")
End Select
Next rng
End Sub
Run Code Online (Sandbox Code Playgroud)
回答你的直接问题
我的问题是:如何克服这个错误/限制并仅在选择/范围内应用字符样式?
这不符合需求吗?:
Sub restyleSelection()
Selection.Style = ActiveDocument.Styles("Emphasis")
End Sub
Run Code Online (Sandbox Code Playgroud)
编辑:
好的,根据您的评论,怎么样:
Dim rng As Range
For Each rng In Selection.Words
If rng.Bold 'do something
Next rng
Run Code Online (Sandbox Code Playgroud)
.Words 会将范围中的每个单词分解为范围的集合。然后,您可以根据每个单词当前的样式对其进行样式设置。