/ / RegExp55, um viele Excel-Formeln zu ändern - Regex, Excel, vba, Excel-Formel

RegExp55, um viele Excel-Formeln zu ändern - Regex, Excel, VBA, Excel-Formel

Ich habe die folgende Tabelle in Excel:

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

und ich möchte folgendes bekommen

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

Also schrieb ich diesen VBA-Code:

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

aber es gibt mir einen Laufzeitfehler 5020. Ich denke, das Problem liegt im Muster, aber ich kann wirklich nicht verstehen, wie ich es reparieren kann. Kann mir jemand helfen?

Antworten:

4 für die Antwort № 1

Sie können den folgenden Fix verwenden:

1) Regex muss sein ^=IF(ISERROR(([^)]+)).* und das Ersatzmuster sollte auf gesetzt sein =$1 (sehen die Regex-Demo)
2) Sie müssen verwenden .Replace eher, als .Execute um die Formeln zu ersetzen
3) Die übergebenen Zeichenfolgen müssen die Formeln sein, und die aktualisierten Zeichenfolgen sollten den Zellenformeln zugewiesen werden.

Die Regex entspricht:

  • ^ - Beginn der Zeichenfolge
  • =IF(ISERROR( - eine wörtliche Zeichenfolge =IF(ISERROR(
  • ([^)]+) - Fanggruppe 1 (bezeichnet mit $1 später) passende 1+ andere Zeichen als )
  • ) - ein Literal )
  • .* - der Rest der Linie bis zum Ende

Code:

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