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 № 1Sie 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