2015-07-17 3 views
0

У меня есть код 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 для тестирования, если что-то является первым словом строки.

Любая помощь будет оценена по достоинству.

+0

Существует не раздел Если в качестве таковых в рамках поиска и замены, но вы можете включать в себя специальные символы, такие как знак абзаца или ручной разрыв строки характера, которые иногда могут быть полезны. Если ваше слово появляется в середине абзаца, но, оказывается, в начале новой строки вы хотите его заменить? – Jane

+0

Я хочу пропустить только в начале, поэтому, если первое слово появится посередине, то я хочу его заменить. – Carl

+0

Слово может находиться в середине абзаца, но в начале строки. Например, мой первый комментарий содержит слово «the» несколько раз. Текст - это один абзац, но на моем экране слово «the» появляется в начале второй и третьей строк. Вы хотите сохранить существующее слово, если оно находится в начале строки, или только если оно находится в начале абзаца? – Jane

ответ

1

Поскольку не условный Найти и заменить, чтобы не заменить слова в начале строки, есть 2 варианта, которые я могу думать:

  • Исполнительные каждое Найти заявление, а затем проверка ли выбранное слово находится в начале строки, прежде чем решить, следует ли заменить текст
  • Перебор каждой строки документа и выполнения поиска и замены на все в этой строке, кроме первого слова не

ни из них, в частности, элегантный, но я пошел со вторым вариантом. Обычно я предпочитаю использовать объект 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 
Смежные вопросы