使用正则表达式在Excel中就地替换公式

时间:2014-01-15 18:50:35

标签: regex excel excel-vba vba

我有一张表,我需要替换几百个类似格式的公式。基本上,我需要删除公式中的IF语句和这些语句的第二部分。我的想法是搜索所有具有“IF($ B $ 2 = $ BF $ 3”)的单元格,然后在那些单元格中用“”替换该位,然后再替换包括和在下一个“,”之后的所有内容。但是VBA给了我“运行时错误1004应用程序或用户定义的错误”。 这显然需要在开头留下“=”。代码如下。

Sub Replace()
Set rng = Worksheets("Sheet1").Range("F36:AG231")
For Each c In rng
If InStr(1, ActiveCell.Formula, "IF", vbTextCompare) > 0 Then
y = ActiveCell.Formula
pos_1 = InStr(1, y, ",", vbTextCompare)
pos_2 = InStr(1 + pos_1, y, ",", vbTextCompare)
ActiveCell = "=" & Mid(y, 1 + pos_1, Len(y) - (1 + pos_2))
End If
Next
End Sub

2 个答案:

答案 0 :(得分:0)

你必须使用正则表达式吗?如果没有,请循环执行以下内容

If InStr(1, ActiveCell.Formula, "IF", vbTextCompare) > 0 Then
    y = ActiveCell.Formula
    pos_1 = InStr(1, y, ",", vbTextCompare)
    pos_2 = InStr(1 + pos_1, y, ",", vbTextCompare)
    ActiveCell = "=" & Mid(y, 1 + pos_1, Len(y) - (1 + pos_2))
Else
End If

答案 1 :(得分:0)

这适用于单个IF语句 - 但如果您在彼此内部有多个IF替换,则需要对RegExp的顺序进行进一步调整。

公式 =1+IF($B$2=$BF$3,7,10)
=1+7

potental模式 如果您想删除IF altogther使用,
X(lngRow, lngCol) = .Replace(X(lngRow, lngCol), "0")
而不是 X(lngRow,lngCol)= .Replace(X(lngRow,lngCol),“$ 1”)

所以 公式为 =1+IF($B$2=$BF$3,7,10)
=1+0

Sub WhatIf()
Dim rng1 As Range
Dim X
Dim objRegex As Object
Dim objRegMC As Object
Dim lngRow As Long
Dim lngCol As Long

Set rng1 = Worksheets("Sheet1").Range("F36:AG231")
X = rng1.FormulaR1C1
Set objRegex = CreateObject("vbscript.regexp")

With objRegex
.Pattern = "IF\(.+?,(.+?),.+?\)"
.Global = False
For lngRow = 1 To UBound(X, 1)
For lngCol = 1 To UBound(X, 2)
Do While .test(X(lngRow, lngCol))
X(lngRow, lngCol) = .Replace(X(lngRow, lngCol), "$1")
Loop
Next
Next
End With

rng1.Value2 = X
End Sub