Word中的条件替换VBA

时间:2015-07-17 16:15:42

标签: vba ms-word word-vba

我有一个单词中的VBA代码,它遍历两个字符串数组,从一个数组中查找文档中的文本,并将其替换为另一个数组中的相应字符串,如下所示:

with application.activedocument.content.find
for i=1 to 100
.text=array1(i)
.replacement.text=array2(i)
.forward=true
.matchcase=true
.wrap=wdFindContinue
.matchwholeword=true
.matchwildcards=false
.matchallwordforms=false
.matchprefix=true
.matchsuffic=true
.matchsoundslike=false
.execute replace:=wdReplaceAll
next
end with

这会不分青红皂白地取代所有案件。是否有一种方法可以包含一个if子句,如果它是一行中的第一个单词,它就不会替换它?我不确定测试的vba代码是否是某行的第一个单词。

任何帮助都将不胜感激。

1 个答案:

答案 0 :(得分:1)

由于“查找和替换”中的条件不是在行的开头不替换单词,因此我可以想到两个选项:

  • 执行每个Find语句,然后在决定是否替换文本之前检查所选单词是否在行的开头
  • 循环浏览文档的每一行,并在除第一个单词之外的所有行中执行查找和替换

这些都不是特别优雅,但我选择了第二种选择。我通常更喜欢使用Range对象而不是使用Selection,但在这种情况下,Selection似乎更容易使用。请注意,您需要关闭换行才能使其正常工作。

    For i = 1 To 100
        Selection.MoveStart WdUnits.wdStory, Count:=-1
        Do
            Selection.MoveRight unit:=wdWord, Count:=1
            Selection.EndKey unit:=wdLine, Extend:=wdExtend

            With Selection.Find
                .Text = array1(i)
                .Replacement.Text = array2(i)
                .Forward = True
                .MatchCase = True
                .MatchWholeWord = True
                .MatchWildcards = False
                .MatchAllWordForms = False
                .MatchPrefix = True
                .MatchSuffix = True
                .MatchSoundsLike = False
                .Execute Replace:=wdReplaceAll
            End With
            Selection.MoveStart unit:=wdLine, Count:=1
        Loop Until Selection.End = ActiveDocument.Range.End
    Next