2017-01-26 12 views
2

Я пытаюсь выделить слово, найденное RegEx, и если это право заменить его соответствующей заменой.Обозначая слово как «найти и заменить» в Microsoft Word с помощью RegEx

Код работает правильно, только если НЕ заменен.

Возможно, должен каждый раз перестраиваться ???

Sub Replace() 
Dim regExp As Object 
Set regExp = CreateObject("vbscript.regexp") 
Dim arr As Variant 
Dim arrzam As Variant 
Dim i As Long 
Dim choice As Integer 
Dim Document As Word.Range 
Set Document = ActiveDocument.Content 

On Error Resume Next 
'EGN 
'IBAN 

arr = VBA.Array("((EGN(:{0,1})){0,1})[0-9]{10}", _ 
"[a-zA-Z]{2}[0-9]{2}[a-zA-Z0-9]{4}[0-9]{7}([a-zA-Z0-9]?){0,16}") 
arrzam = VBA.Array("[****]", _ 
"[IBAN]") 
With regExp 
    For i = 0 To UBound(arr) 
     .Pattern = arr(i) 
     .Global = True 
     For Each Match In regExp.Execute(Document)    
      ActiveDocument.Range(Match.FirstIndex, Match.FirstIndex +  Match.Length).Duplicate.Select 
      choice = MsgBox("Replace " & Chr(34) & Match.Value & Chr(34) & " with " & Chr(34) & arrzam(i) & Chr(34) & "?", _ 
       vbYesNoCancel + vbDefaultButton1, "Replace") 
     If choice = vbYes Then   
      Document = .Replace(Document, arrzam(i)) 
     ElseIf choice = vbCancel Then   
      Next 
     End If 
     Next 
    Next 
End With 

End Sub 

ответ

0

Собственно, в этом есть несколько вещей.

Во-первых, каждое совпадение в каждом матче статично, определяется в момент первого цикла. Вы меняете документ тем временем, поэтому каждый последующий Матч смотрит на старую позицию.

Во-вторых, вы заменяете все вхождения за один раз, поэтому нет необходимости их перебирать. Кажется, одна строка, один раз Replace может сделать то же самое.

+0

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

+0

«поэтому каждый последующий матч смотрит на старую позицию» - Да, это так. Вот почему я думал, что каждый раз нужно воспитывать. Но не обманывайся. «вы заменяете все случаи за один раз» - это не идея. Я хочу проверить слово перед заменой. Как Найти и заменить сделать на обычный документ. Это не проблема перекодировать все. Если у вас есть идея, я возьму его. –

+0

Идея этого кода: «найти текст в документе с помощью шаблонов регулярных выражений, которые являются десятью из них, и поменять найденные слова один за другим с помощью вопроса« Да »,« Нет »,« Отмена ». Да - заменить в зависимости от шаблона, имеющего отношение к нему. - Перейдите к следующему найденному слову. Cancel - Exit search. " –