Найти и заменить из начала документа, но вернуть курсор на предыдущую позицию - PullRequest
0 голосов
/ 21 февраля 2019

У меня есть макрос Find and Replace, который добавляет пробел между концом одного предложения и началом другого в случае отсутствия.Иногда это происходит, когда я перемещаю предложения в слове.

Я замечаю, что, если курсор находится по обе стороны от знака препинания, макрос не может видеть шаблон поиска и не исправляет его.Я предполагаю, что это потому, что Find and Replace начинает поиск с позиции курсора.Есть ли способ настроить код, чтобы он тоже их нашел?

Я знаю, что мог бы просто сказать макросу начинаться с самого начала, но я бы предпочел, чтобы он оставил курсор в его текущей позиции, особенно еслиЯ запускаю его в конце длинного документа.

Sub AddOneSpaceBetweenSentences()
' AddOneSpaceBetweenSentences Macro
'
 With Selection.Find
 .Forward = True
 .Text = "(?)([.\?\!])([A-Z])"
 .ClearFormatting
 .Replacement.Text = "\1\2 \3" 'there is a space between \2 and \3
 .MatchWildcards = True
 .Wrap = wdFindContinue
 .Execute Replace:=wdReplaceAll

End With

End Sub

Ответы [ 3 ]

0 голосов
/ 22 февраля 2019

Самый надежный способ - использовать Range объекты вместо Selection.При работе с Range выделение в документе не меняется.

  Sub AddOneSpaceBetweenSentences()
    ' AddOneSpaceBetweenSentences Macro
    '
     Dim rng as Word.Range

     Set rng = ActiveDocument.Content
     With rng.Find
       .Forward = True
       .Text = "(?)([.\?\!])([A-Z])"
       .ClearFormatting
       .Replacement.Text = "\1\2 \3" 'there is a space between \2 and \3
       .MatchWildcards = True
       .Wrap = wdFindContinue
       .Execute Replace:=wdReplaceAll
    End With

  End Sub
0 голосов
/ 24 февраля 2019

Еще лучше:

Sub AddOneSpaceBetweenSentences()
Application.ScreenUpdating = False
With ActiveDocument.Range.Find
  .ClearFormatting
  .Replacement.ClearFormatting
  .Forward = True
  .Format = False
  .MatchWildcards = True
  .Wrap = wdFindContinue
  .Text = "([.\?\!])([A-Z])"
  .Replacement.Text = "\1 \2"
  .Execute Replace:=wdReplaceAll
End With
Application.ScreenUpdating = True
End Sub
0 голосов
/ 22 февраля 2019

Действительно ли необходимо иметь персонажа до конца знаками?или же ?или!
Если нет, просто замените "([.\?\!])([A-Z])" на "\1 \2"


Простая попытка: просто увеличьте выделение на 2 символа влево.

Если курсор включенпервые два символа документов, вы получите ошибку.Чтобы предотвратить это и предотвратить подсчет символов, я просто использовал Selection.Start > 10

If Selection.Start > 10 Then
    Selection.Previous(Unit:=wdCharacter, Count:=2).Select
End If

... или сделал это немного сложнее:

Sub AddOneSpaceBetweenSentences()
    Dim SearchText As String
    Dim ReplaceText As String

    ' extend selection by 1 character
    If Selection.Start > 0 Then
        Selection.Previous(Unit:=wdCharacter, Count:=1).Select
    End If
    Selection.Collapse

    ' if selection begins directly before end of sentence (.?!)
    ' adapt search & replace pattern
    If InStr(1, ".?!", Selection.Characters(1), vbBinaryCompare) > 0 Then
        SearchText = "([.\?\!])([A-Z])"
        ReplaceText = "\1 \2"
    Else
        SearchText = "(?)([.\?\!])([A-Z])"
        ReplaceText = "\1\2 \3"
    End If

    With Selection.Find
        .Forward = True
        .text = SearchText
        .ClearFormatting
        .Replacement.text = ReplaceText
        .MatchWildcards = True
        .Wrap = wdFindContinue
        .Execute Replace:=wdReplaceAll
    End With
End Sub
...