2017-01-26 31 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

實際上,這有幾個問題。

首先,每個匹配中的每個匹配是靜態的,在第一個循環的時刻確定。在此期間您正在更改文檔,因此每個連續的Match都會查看舊的位置。

其次,你一次替換所有的事件,所以不需要循環它們。這似乎是一條線,一次替換可以做同樣的事情。

+0

「所以每個連續的比賽看着一箇舊的位置」 - 是的。那就是爲什麼我認爲每次都需要重新安置。但是不能確切地說, –

+0

「所以每一個連續的比賽都會看到一箇舊的位置」 - 是的。那就是爲什麼我認爲每次都需要重新安置。但不是很舒服。 「你一次替換所有的事件」 - 這不是主意。我想在更換之前檢查單詞。就像在常規文檔上查找和替換一樣。它重新編碼全部是沒有問題的。如果你有想法,我會接受。 –

+0

這段代碼的思想是:「通過正則表達式模式找到文本中的文本,其中有10個文本,然後逐個更改找到的單詞,並詢問是,否,取消。是 - 根據與相關的模式進行替換。 - 轉到下一個找到的單詞。取消 - 退出搜索。「 –