Laufzeitfehler 424: Objekt erforderlich
27.07.2022 16:59:12
PTHB
Ich möchte in einer Arbeitsmappe alle Zeilen löschen, die in Spalte x einen bestimmten Wert y enthalten. Nun habe ich dafür schon folgenden Code geschrieben, welcher einwandfrei funktioniert.
Option Explicit
Sub ZeilenLoeschenWennWert()
Dim ws As Worksheet
Dim lngLetzteZeile As Long
Dim lngAbZeile As Long
Dim lngZeile As Long
Dim x, y, response As Long
Set ws = ActiveSheet
Application.ScreenUpdating = False
Application.DisplayAlerts = False
Application.EnableEvents = False
again:
x = InputBox("Welche Spalte soll überprüft werden?" & Chr(10) & "(Bitte Wert als Zahl angeben! A=1, B=2, etc.)", "Spalteneingabe")
y = InputBox("Zeilen mit welchem Wert in Spalte " & x & " sollen gelöscht werden?", "Werteingabe")
response = MsgBox("Alle Zeilen mit dem Wert " & x & " in Spalte " & y & " werden gelöscht. Bitte mit JA bestätigen, NEIN neu eingeben oder CANCEL Makro abbrechen!", vbYesNoCancel, "Bestätigung")
If response = 6 Then
GoTo zeilenloeschen
ElseIf response = 7 Then GoTo again
ElseIf response = 2 Then GoTo Ende
End If
zeilenloeschen:
'Letzte Zeile mit Inhalt bestimmen und Anfangszeile definieren
lngAbZeile = 1
lngLetzteZeile = ws.UsedRange.SpecialCells(xlCellTypeLastCell).Row
'String in Integer umwandeln
x = Fix(x)
y = Fix(y)
'Wenn eine Zeile in Spaltex den Wert y enthält wird diese Zeile gelöscht. Dabei wird das ActiveSheet von unten nach oben durchgegangen
For lngZeile = lngLetzteZeile To lngAbZeile Step -1
If ws.Cells(lngZeile, x).Value = y Then
ws.Rows(lngZeile).Delete
End If
Next
Ende:
Application.ScreenUpdating = True
Application.DisplayAlerts = True
Application.EnableEvents = True
End Sub
Das Prüfen und Löschen jeder Zeile bei über 220k Zeilen dauert jedoch sehr lange. Daher kam ich auf die Idee jede Zeile, die den gesuchten Wert enthält auf diesen zu überprüfen und zu einer Range hinzuzufügen. Diese Range soll dann am Ende gelöscht werden. Hier ist mein Code dazu:
Sub ZeilenLoeschenWennWertRange()
Dim ws As Worksheet
Dim lngLetzteZeile As Long
Dim lngAbZeile As Long
Dim lngZeile As Long
Dim rng1, rng2, c As Range
Dim x, y, response As Long
Set ws = ActiveSheet
Application.ScreenUpdating = False
Application.DisplayAlerts = False
Application.EnableEvents = False
again:
x = InputBox("Welche Spalte soll überprüft werden?" & Chr(10) & "(Bitte Wert als Zahl angeben! A=1, B=2, etc.)", "Spalteneingabe")
y = InputBox("Zeilen mit welchem Wert in Spalte " & x & " sollen gelöscht werden?", "Werteingabe")
response = MsgBox("Alle Zeilen mit dem Wert " & x & " in Spalte " & y & " werden gelöscht. Bitte mit JA bestätigen, NEIN neu eingeben oder CANCEL Makro abbrechen!", vbYesNoCancel, "Bestätigung")
If response = 6 Then
GoTo zeilenloeschen
ElseIf response = 7 Then GoTo again
ElseIf response = 2 Then GoTo Ende
End If
zeilenloeschen:
'Letzte Zeile mit Inhalt bestimmen und Anfangszeile definieren
lngAbZeile = 1
lngLetzteZeile = ws.UsedRange.SpecialCells(xlCellTypeLastCell).Row
'String in Integer umwandeln
x = Fix(x)
y = Fix(y)
Set rng1 = Range(Cells(1, x), Cells(lngLetzteZeile, x))
For Each c In rng1
If c.Value = y Then
If Not rng2 Is Nothing Then
Set rng2 = Union(rng2, c)
Else
Set rng2 = c
End If
End If
Next
ws.Rows(rng2).Delete
Ende:
Application.ScreenUpdating = True
Application.DisplayAlerts = True
Application.EnableEvents = True
End Sub
Der im Betreff genannte Fehler 424 tritt bei 'If Not rng2 Is Nothing Then' auf, da rng2 noch nicht gesetzt/definiert wurde. Meine Idee hier war zu überprüfen, ob rng2 schon einen Bereich enthält und falls nicht soll dies mit 'Set rng2 = c' geschehen.Gibt es eine Möglichkeit eine Range auf Is Nothing zu überprüfen, um dann den Startwert der Range zu setzen?
Alternativ freue ich mich auch über eine andere Möglichkeit meinen ersten und funktionierenden Code zeitoptimierter zugestalten oder grundsätzlich Rückmeldung zu meinem Code, falls ich dort Dinge ineffizient geschrieben habe.(Bin VBA-Neuling und versuche mit jedem kleinen Projekt etwas dazuzulernen)
Besten Dank für eure Rückmeldung und Hilfe. Sollte ich etwas unklar erklärt haben oder noch Fragen bestehen, liefere ich natürlich gerne nach :)
Liebe Grüße,
Philip
Beispielarbeitsmappe: https://www.herber.de/bbs/user/154399.xlsx