Word文档中的条件查找和替换段落标记

时间:2018-08-07 08:38:01

标签: vba ms-word word-vba

我想根据上一个和下一个单词的样式替换单词中的段落标记。我尝试了以下宏,但没有用。您对如何解决此问题有任何想法吗?

  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

1 个答案:

答案 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