我想根据上一个和下一个单词的样式替换单词中的段落标记。我尝试了以下宏,但没有用。您对如何解决此问题有任何想法吗?
Sub RemoveParagraph()
With Selection
Set rng = .Range
With .Find
.Text = "^p"
.Execute
End With
Do While .Find.Found
If (Selection.Previous(Unit:=wdWord, Count:=1).Style = "Style1") And (Selection.Next(Unit:=wdWord, Count:=1).Style = "Style2") Then
.Find.Replacement.Text = " "
End If
.Find.Execute
Loop
End With
End Sub
答案 0 :(得分:0)
您的代码中存在多个缺陷。例如:
•除非您清除任何先前的以及查找/替换的表达式和配置,否则它们可能会影响您的代码。
•除非您将文字换行设置为“停止”,否则很可能会导致无限循环。
•查找将继续进行,超出您的选择范围。因此,除非您测试每个匹配项是否在所选范围内,否则它将继续处理。
•在循环中使用'.Find.Replacement.Text =“”'不起作用。
•通过和测试多个条件要比分别测试它们的效率低。
•关闭屏幕更新可提高效率并减少屏幕闪烁。
尝试:
Sub RemoveParagraph()
Application.ScreenUpdating = False
Dim Rng As Range
With Selection
Set Rng = Selection.Range
With .Find
.ClearFormatting
.Replacement.ClearFormatting
.Text = "^p"
.Replacement.Text = ""
.Forward = True
.MatchWildcards = False
.Wrap = wdFindStop
.Execute
End With
Do While .Find.Found
If .InRange(Rng) = False Then Exit Do
If .Characters.First.Previous.Style = "Style1" Then
If .Characters.Last.Next.Style = "Style2" Then .Text = " "
End If
.Collapse wdCollapseEnd
.Find.Execute
Loop
End With
Application.ScreenUpdating = True
End Sub