2017-03-09 26 views
2

我在Excel電子表格如下:RegExp55修改大量的Excel公式

+---+----+-----------------------------+----------------------------+ 
| | A |    B    |    C    | 
+---+----+-----------------------------+----------------------------+ 
| 1 | |        |       | 
| 2 | 12 | =IF(ISERROR(A2/0),"",A2/0) | =IF(ISERROR(A2*4),"",A2*4) | 
+---+----+-----------------------------+----------------------------+ 

,我想爲下面

+---+----+--------+-------+ 
| | A | B | C | 
+---+----+--------+-------+ 
| 1 | |  |  | 
| 2 | 12 | =A2/0 | =A2*4 | 
+---+----+--------+-------+ 

所以我寫了這個VBA代碼:

Sub DeleteIfError() 


    Dim c As Integer 
    Dim r As Integer 
    Dim regex As Object, str As String 
    Set regex = CreateObject("VBScript.RegExp") 

    With regex 
    .Pattern = "=IF(ISERROR\([A-Za-z0-9]+\)" 
    .Global = False 'Only First 
    End With 

For c = 1 To 3 
    For r = 1 To 2 
     If Cells(r, c).HasFormula Then 

      Set matches = regex.Execute(str) 
       For Each Match In matches 
        Cells(r, c) = Match.Value 
       Next Match 
     End If 

    Next r 
Next c 

End Sub 

但它給我一個運行時錯誤5020. 我認爲問題是在模式,但我重新盟友無法理解如何解決它。任何人都可以幫助我嗎?

+0

看來你錯過了逃跑的第一個左括號? –

+1

你在哪裏給'str'賦值? –

+0

@WiktorStribiżew是對的,你似乎錯過了最重要的部分:'str = Cells(r,c).Formula'在執行你的正則表達式之前!然後,它應該是:'Cells(r,c).Formula = Match.Value'(因爲在模式中有'=',所以只有一個匹配,所以循環不是很有用) – R3uK

回答

4

您可以使用以下修正:

1)正則表達式必須^=IF\(ISERROR\(([^)]+)\).*和替換模式應設爲=$1(見the regex demo
2)您需要使用.Replace而非.Execute更換式
3)您傳遞的字符串必須是公式,更新的字符串應分配給單元格公式。

正則表達式匹配:

  • ^ - 串的開始
  • =IF\(ISERROR\( - 一個文字字符序列=IF(ISERROR(
  • ([^)]+) - 捕獲組1(稱爲與$1以後)匹配比其他1+字符)
  • \) - 字面)
  • .* - 排隊到結束的其餘

代碼:

Sub DeleteIfError() 
    Dim c As Integer 
    Dim r As Integer 
    Dim regex As Object, str As String 
    Set regex = CreateObject("VBScript.RegExp") 

    With regex 
    .pattern = "^=IF\(ISERROR\(([^)]+)\).*" 
    .Global = False 'Only First 
    End With 

For c = 1 To 3 
    For r = 1 To 2 
     If Cells(r, c).HasFormula Then 
      Cells(r, c).Formula = regex.Replace(Cells(r, c).Formula, "=$1") 
     End If 

    Next r 
Next c 

End Sub 
+1

謝謝,我一直在爲「RegEx」打破這個念頭,感謝您的詳細解釋 –

+0

Just注意到我複製/粘貼了一些舊的'Sub'到代碼片段中:)刪除。 –

+0

爲什麼在** RegEx **中使用'[a-zA-Z](?== IF \(ISERROR \()''不會返回'「= IF(ISERROR(」',意思是' 「A」'? –