Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
1892to1896
Aktuelles Verzeichnis
Verzeichnis Index
Übersicht Verzeichnisse
Vorheriger Thread
Rückwärts Blättern
Nächster Thread
Vorwärts blättern
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
Laufzeitfehler 424: Objekt erforderlich
27.07.2022 16:59:12
PTHB
Moin.
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

4
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
Dim rng2 As Range !!! owT
27.07.2022 17:11:47
Rudi
AW: Laufzeitfehler 424: Objekt erforderlich
27.07.2022 17:12:33
GerdL
Moin Philipp,
deklariere alle Variablen einzeln, sonst sind sie vom Typ Variant.
Dim rng1 As Range, rng2 As Range, c As Range
Gruß
AW: Laufzeitfehler 424: Objekt erforderlich
27.07.2022 17:45:23
Daniel
Hi
das mit dem Fehler wurde dir ja schon erklärt.
so wie du dimensionerst, ist rng2 zunächst keine Range-Objektvariabel, sondern einfach nur Variant.
und nur Objektvariablen können "Nothing" sein, Variantvariablen aber nicht.
deine Idee ist zwar im prinzip logisch, löst aber das eigentliche Problem nicht, denn beim Löschen von Zeilen hast du den Effekt, das nicht die Anzahl der Zeilen das Problem sind, sondern deren Aufsplittung.
Range("1:10000").Delete ist für Excel genauso aufwendig wie Rows(1).Delete
Range("1:1,4:4").Delete hingegen erzeugt schon den doppelten Aufwand, weil nicht nur ein lückenloser Bereich ist, sondern zwei.
und auch wenn du das löschen mit einem einzigen Befehl ausslöst, intern muss Excel jeden Bereich einzeln löschen.
Die ursache ist, dass Excel beim Löschen von Zeilen alle anderen Exceltabellen nach Formeln durchsucht, die auf dieses Zellen referenzieren und dann diese Formeln ensprechend anpasst, ebenso wird der Marker für den benutzen Zellbereich (LastCell) angepasst. Das kann bei Lückenlosen Blöcken gemeinschaftlich durchgeführt werden, bei Lücken hingegen muss jeder Teilbereich seperat bearbeitet werden.
um jetzt in großen Datenmengen schnell viele Zeilen zu löschen, gibt es zwei Wege
a) man sortiert den Bereich so, das alle zu löschenden Zeilen einen einzigen lückenlosen Block bilden. Beim Sortieren ist Excel sehr schnell
b) man markiert alle Zeilen, die gelöscht werden sollen mit einem einheitlichen Wert (z.B. 0) und alle die stehenbleiben sollen, mit einem individuellen Wert (Zeilennummer), dann kann man die Zeilen mit dem einheitlichen Wert über DATEN - DATENTOOLS - DUPLIKATE ENTFERNEN eleminieren. Das ist auch ohne Sortieren sehr schnell, weil es die Aktionen, die ich oben beschrieben habe nicht durchführt.
da dein Programmierstil auch sonst etwas altertümlich erscheint, hier mal der vollständige Code für das Duplikateentfernen.
wenn man für sehr große Datenmengen TopSpeed braucht, wäre die Methode mit Formel markieren, sortieren und als Block löschen sogar noch etwas schneller, aber meistens reicht schon das Duplikate-Entfernen

Sub Löschen_DuplikateEntfernen()
Dim LöschSpalte As Range
Dim LöschWert As String
Do
Set LöschSpalte = Application.InputBox("Prüfspalte auswählen", "Spaltenauswahl", Type:=8)
LöschWert = InputBox("Zeilen mit welchem Wert in Spalte " & LöschSpalte.Column & " sollen gelöscht werden?", "Wertauswahl")
Select Case MsgBox("Alle Zeilen mit dem Wert " & LöschWert & " in Spalte " & LöschSpalte.Column & " werden gelöscht. Bitte mit JA bestätigen, NEIN neu eingeben oder CANCEL Makro abbrechen!", vbYesNoCancel, "Bestätigung")
Case vbYes
Exit Do
Case vbNo
Case vbCancel
Exit Sub
End Select
Loop
With ActiveSheet.UsedRange
With .Columns(.Columns.Count + 1)
.FormulaR1C1 = "=IF(RC" & LöschSpalte.Column & "=""" & LöschWert & """,0,Row())"
.Cells(1, 1).Value = 0
.EntireRow.RemoveDuplicates .Column, xlNo
.ClearContents
End With
End With
End Sub
Gruß Daniel
Anzeige
AW: Laufzeitfehler 424: Objekt erforderlich
27.07.2022 18:01:50
PTHB
Besten Dank euch beiden für die schnelle Antwort. Der Code funktioniert nun.
Gruß,
Philip

300 Forumthreads zu ähnlichen Themen

Anzeige
Anzeige
Anzeige

Links zu Excel-Dialogen

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige