2017-02-10 25 views
0

Возможно, это просто, но я не могу заставить его работать.Word VBA: как выбрать найденный текст, а не где находится курсор

Мне нужно выполнить поиск по моему документу, найти слова, содержащие строку «alog» и добавить «ue». Например, «каталоги» -> «каталоги».

Вышеуказанное работает отлично, но я не могу заставить следующий бит работать: если найденная строка уже имеет «ue» после «log», я не хочу добавлять еще «ue».

Подпрограмма, доступная из макроса, находится ниже. Я попытался добавить следующие строки в часть «while execute», но «выбор» всегда оказывается словом, в котором находится курсор.

With Selection 

    .Expand unit:=wdWord 

End With 

Как я) выбрать содержимое найденного диапазона и б) расширить этот новый выбор двумя персонажами, чтобы увидеть, если эти два символа 'уе?

Большое спасибо.

Sub do_replace2(old_text As String, new_text As String, Count_changes As Integer) 

    ' Replaces 'log' with 'logue' 
    ' Ignores paragraphs in styles beginning with 'Question' 

    Dim rg As Range 
    Set rg = ActiveDocument.Range 

    With rg.Find 
    .Text = old_text 
    While .Execute 
     If Left(rg.Paragraphs(1).Style, 8) <> "Question" Then 
      rg.Text = new_text 
       With ActiveDocument.Comments.Add(rg, "Changed from '" & old_text & "'") 
       .Initial = "-logs" 
       .Author = "-logs" 
       End With 
       Count_changes = Count_changes + 1 
      End If 
    rg.Collapse wdCollapseEnd 
    Wend 
    End With 
    End Sub 

ответ

0

Я не совсем уверен, что следую первой части вашего вопроса «Как выбрать содержание найденного диапазона». Переменная rg уже содержит результат поиска. Если вы хотите его выбрать, просто используйте rg.Select. Это может быть полезно при отладке (так что вы можете увидеть, где находится Range, когда вы переходите через код), но нет никакой другой причины для использовать объект Selection в коде вашего вопроса. Вместо этого вы можете использовать объект Range.

Что касается части 2 вашего вопроса «Как мне ... расширить этот новый выбор двумя символами», все, что вам нужно сделать, это добавить 2 к объекту объекта Range. Так как только вы используете это для теста (и потому, что метод .Find может быть изворотливым), проверить это на копии из rg:

With rg.Find 
    .Text = old_text 
    While .Execute 
     If Left(rg.Paragraphs(1).Style, 8) <> "Question" Then 
      Dim test As Range 
      Set test = rg.Duplicate   'copy the found Range. 
      test.Collapse wdCollapseEnd  'move to the end of it. 
      test.End = test.End + 2   'expand to the next 2 characters. 
      If test.Text <> "ue" Then  'see if it's "ue". 
       rg.Text = new_text 
       With ActiveDocument.Comments.Add(rg, "Changed from '" & old_text & "'") 
        .Initial = "-logs" 
        .Author = "-logs" 
       End With 
       Count_changes = Count_changes + 1 
      End If 
     End If 
     rg.Collapse wdCollapseEnd 
    Wend 
End With 
+0

Большое спасибо Коминтерне. Отлично. – hmm

+0

Спасибо, Коминтерн; как я сказал, конец + 2 отлично работает, дает мне начало диапазона (скажем) 735 и конец 737 с строкой в ​​нем. Но если я делаю .wdcollapsestart и .start + 5, начало и конец диапазона одинаковы, а строка равна нулю. Почему «запуск» не работает так же, как «конец»? – hmm

+0

Еще одно обновление: когда я это делаю: test.Collapse wdCollapseStart test.Start = test.Start - 5 он отлично работает. Разве вы не можете «начать + n»? – hmm