2017-03-09 55 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”'? –