Word 中的条件替换 VBA

Conditional replacement VBA in Word

我在 word 中有一个 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

这样就把所有的case都替换掉了。有没有办法包含一个 if 子句,这样如果它是一行中的第一个单词,它就不会替换一个单词?我不确定用于测试某个内容是否是一行的第一个单词的 vba 代码是什么。

如有任何帮助,我们将不胜感激。

由于查找和替换中没有不替换行首单词的条件,我可以想到两个选项:

  • 执行每条查找语句,然后在决定是否替换文本之前检查所选单词是否在行首
  • 遍历文档的每一行并对该行中除第一个单词以外的所有内容执行查找和替换

这两个都不是特别优雅,但我选择了第二个选项。我通常更喜欢使用 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