Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
1824to1828
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
Inhaltsverzeichnis

Zeilen löschen - Excel stürzt ab

Zeilen löschen - Excel stürzt ab
24.04.2021 18:39:28
marc
Hallo liebes Forum,
ich habe ein Skript geschrieben, mit dessen Hilfe Zeilen gelöscht und neue aus einer anderen Arbeitsmappe hinzugefügt werden sollen. Eigentlich funktioniert(e) alles. Es scheint mir jedoch so, dass es ab einer größeren Menge von zu löschenden Zeilen ein Problem gibt.
Für das Löschen der Zeilen habe ich eine Funktion geschrieben. Nachdem das Makro eine Weile läuft erhalte ich wahlweise einen Laufzeitfehler -02147417848 (80010108)' oder Excel schließt sich irgendwann einfach komplett. Bis wohin das Makro dann schon gelaufen sein könnte, weiß ich nicht.
Der Code sieht so aus:

Function zeilen_loeschen(sht As Worksheet, spalte As Long)
Dim rng As Range
Dim lzeile As Long
lzeile =  sht.Cells(Rows.Count, 1).End(xlUp).Row
With sht
Set rng = .Range(.Cells(1, 1), .Cells(lzeile, spalte))
With rng
.AutoFilter Field:=spalte, Criteria1:="angemeldet"
.Offset(5, 0).Resize(.rows.count - 5).SpecialCells(xlCellTypeVisible).rows.Delete
End With
With sht
.AutoFilterMode = False
If .FilterMode = True Then
.ShowAllData
End If
End With
End With
End Function

Call zeilen_loeschen(Mappe1, 39)
Das Workbook enthält ca 5000 Zeilen und davon müssen ca 40 gelöscht werden. Mit weniger zu löschenden Zeilen scheint es zu laufen.
Ist im Code etwas suboptimal oder weiß jemand was der Laufzeitfehler bedeuten könnte?

8
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Zeilen löschen - Excel stürzt ab
24.04.2021 19:51:44
onur
Du hast innerhalb von der "With Sheet"-Schleife noch eine "With Sheet"-Schleife.
Abgesehen davon: wenn du eine Zeile löschst, erweitert sich der Bereich rng um eine Zeile nach unten und somit "ensteht" eine sichtbare Zeile, die wiederum gelöscht werden muss usw usw.
Mehr kann ich nur sagen, wenn du die Datei postest.
AW: Zeilen löschen - Excel stürzt ab
24.04.2021 23:09:53
Yal
Hallo Marc,
Wenn es ein Feld gibt, nach dem Du wieder in originaler Reihenfolge sortieren kannst, würde ich vor dem Löschen nach dem Feld, wo "angemeldet" liegt, sortieren. Dann sind alle Einträge in einem Block und das Löschen sollte weniger anfällig sein.
VG
Yal
Anzeige
AW: Zeilen löschen - Excel stürzt ab
28.04.2021 20:33:31
Marc
Hallo Yal,
vielen Dank für den Vorschlag, das funktioniert super. Ich lasse das Makro einfach in einer leeren Spalte einen Zeilenindex erstellen, anhand dessen ich nach dem Löschen der Zeilen alles "zurücksortieren" kann. Also:
1. Indexspalte erzeugen
2. Alle Daten nach "angemeldet" sortieren, so dass alle zu löschenden Zeilen zusammenhängen
3. Die "angemeldet" Zeilen löschen
4. Alle Daten nach Index aus der erzeugten Indexspalte sortieren, so dass die Daten wieder die ursprüngliche Reihenfolge haben
Läuft stabil und schnell, selbst bei riesigen Datenmengen!
AW: Zeilen löschen - Excel stürzt ab
29.04.2021 17:49:02
Yal
Hallo Marc,
Eine Hilfspalte mit originaler Reihenfolge ist nicht mehr "Basiskenntnisse in VBA" sondern Profi ;-)
Du hast vergessen:
5. temporäre index wieder löschen.
VG
yal
Anzeige
Index-Spalte + Test
29.04.2021 18:10:36
Yal
Hallo Marc,
der Beitrag von Daniel hat mich auf folgender Idee gebracht: bei dem Herstellen der Index Spalte testen, ob in der aktuelel Zeile "angemeldet" vorliegt und in dem Fall "99999" eintragen. Es reduziert sich auf:
_ Index inkl. Test erzeugen
_ nach Index sortieren. 99999 ist dann am Ende
_ Filtern nach 99999
_ visible löschen
_ unfiltern
_ Index Löschen
Wobei am einfachste weiterhin das "direktes Löschen" bleibt:

Sub Zeilen_loeschen(WS As Worksheet, SpalteNr As Long, LöschKey As String, Optional ErsteZeile = 2, Optional LetzteZeile = 999999)
Dim r
If LetzteZeile = 999999 Then LetzteZeile = WS.Cells(999999, SpalteNr).End(xlUp).Row
Application.ScreenUpdating = False
For r = LetzteZeile To ErsteZeile Step -1
If StrComp(WS.Cells(r, SpalteNr).Value, LöschKey, vbTextCompare) Then wb.Cells(r, 1).EntireRow.Delete
Next
Application.ScreenUpdating = True
End Sub
(Beim Einfügen/Löschen immer von "hinten" rangehen. Siehe "Step -1")
VG
Yal
Anzeige
AW: Zeilen löschen - Excel stürzt ab
25.04.2021 10:38:24
GerdL
Moin,
teste mal an einer Kopie.

Function zeilen_loeschen(sht As Worksheet, spalte As Long)
Dim lzeile As Long
With sht
lzeile = .Cells(.Rows.Count, 1).End(xlUp).Row
With .Range(.Cells(1, 1), .Cells(lzeile, spalte))
If WorksheetFunction.CountIf(.Columns(spalte), "angemeldet") > 0 Then
.AutoFilter Field:=spalte, Criteria1:="angemeldet"
.AutoFilter.Range.Offset(1, 0).SpecialCells(xlCellTypeVisible).EntireRow.Delete
.AutoFilter
End If
End With
End With
End Function
Gruß Gerd
AW: Zeilen löschen - Excel stürzt ab
28.04.2021 20:38:00
Marc
Hallo Gerd,
vielen Dank für den Vorschlag. Allerdings bekomme ich bei dieser Codezeile eine Fehlermeldung, nämlich dass nach einem Objekt verlangt wird:

.AutoFilter.Range.Offset(1, 0).SpecialCells(xlCellTypeVisible).EntireRow.Delete

Anzeige
AW: Zeilen löschen - Excel stürzt ab
28.04.2021 20:52:52
Daniel
Hi
beim Löschen von Zeilen auf diesem Weg ist die entscheidende Kenngröße, aus wie vielen einzelnen getrennten Zellbereichen das ganze Feld zusammengesetzt ist.
das Löschen von 1:1000 ist für Excel nicht aufwendiger als das Löschen einer einzigen Zeile, weil es ebenfalls nur ein einziger zusammenhängender Zellbereich ist. Das Löschen der Zeilen 1 und 3 (ohne die 2 dazwischen bedeutet hingegen den doppelten Aufwand.
Wobei 40 zu löschenende Zeilen jetzt nicht viel sind, das sollte Excel schon schaffen, egal wie vereinzelt die sind.
Trotzdem würde ich nicht den Autofilter zum Löschen von Zeilen verwenden, sondern das Duplikate entfernen.
das ist dabei schneller und leistungfähiger und hat kein Problem, egal wieviele Zeilen du löschst.
hierzu kennzeichnet man die zu löschenden Zeilen per Formel in einer Hilfsspalte mit 0 und die die stehen bleiben sollen mit der Zeilennummer.
dann wendet man das Duplikate entfernen an und die Zeilen mit 0 werden gelöscht.
der Code dafür sieht so aus:

with sht.usedrange
with .columns(.columns.count + 1)
.Formular1c1 = "=IF(row()
was mir an deinem Code auffällt ist das "..Rows.Delete". ich verwende an dieser Stelle wenn ganze Zeilen gelöschst werden sollen: ".EntireRow.Delete"
Gruß Daniel
Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige