Live-Forum - Die aktuellen Beiträge
Anzeige
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender

Forumthread: Jede x-te Zeile löschen

Jede x-te Zeile löschen
04.01.2016 07:15:36
Erwin
Guten Morgen im neuen Jahr,
mit nachfolgendem Code lösche ich ab einer bestimmten Zeile jede x-te Zeile, wenn Spalte A belegt ist.
Sub Jede_X_te_Zeile_loeschen() Dim Zeile1, x Application.ScreenUpdating = False Zeile1 = Val(InputBox("Spalte A muss belegt sein !!" & vbCr & _ "Beginn in Zeile?", _ "Zeilen löschen")) x = Val(InputBox("Jede wievielte?")) Do While Not (IsEmpty(Cells(Zeile1, 1))) Rows(Zeile1).Delete Zeile1 = Zeile1 + x - 1 Loop Application.ScreenUpdating = True End Sub Ich möchte dies jetzt nicht mehr auf Spalte A prüfen ob belegt, sondern generell jede x-te Zeile ab der vorgegebenen Zeile aus der ersten Inputbox.
Wenn ich aber jetzt den Code ...While Not (IsEmpty(Cells(Zeile1, 1)))... entferne dauert das ewig, da vermutlich alle Zellen bis Zeile 1.048.576 durchsucht werden?!
Wie kann der Code geändert werden, damit ohne Bezug auf Spalte A nur bis zur maximal belegten Zelle (z. B.: Cells.SpecialCells(xlCellTypeLastCell).Row) der Code läuft?
Grüße - Erwin

Anzeige

26
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
Duplikate entfernen
04.01.2016 07:41:41
RPP63
Moin!
Das Schnellste ist:
Bilde eine Hilfsspalte gleich rechts neben Deinen Daten,
in Zeile 1 kommt eine Null,
ab Zeile 2 eine Formel nach diesem Motto:
=WENN(REST(ZEILE();JedeXteZeile)=AbZeile;0;ZEILE())
Auf diese Spalte wendest Du Duplikate entfernen an und löscht im Anschluss diese Hilfsspalte.
(lässt sich natürlich auch als Makro schreiben)
 ABCDE
1Spalte A0 ab Zeile:3
2x2 jede xte4
3x0   
4x4   
5x5   
6x6   
7x0   
8x8   
9x9   
10x10   
11x0   
12x12   
13x13   
14x14   
15x0   
16x16   

Formeln der Tabelle
ZelleFormel
B2=WENN(REST(ZEILE(); E$2)=E$1;0;ZEILE())


Excel Tabellen im Web darstellen >> Excel Jeanie HTML 4.8
Gruß Ralf

Anzeige
Formellösung (auch für VBA möglicher Zeitgewinn)
04.01.2016 07:46:52
lupo1
1. Zähle die Einträge in A, z.B. mit .Count
2. Lösche von hinten, nicht von vorn. Geht viel schneller!
Noch schneller für jede 8. Zeile als herunterzukopierende Formel:
B1: =INDEX(A:A;(ZEILE(A1)-1)*8/7+1)
also für jede n-te Zeile
B1: =INDEX(A:A;(ZEILE(A1)-1)*n/(n-1)+1)

Anzeige
Jede x-te Zeile löschen
04.01.2016 08:06:42
Erwin
Hallo,
danke für die Formellösungen, aber das dauert mir zu lange, bis ich mir immer wieder diese Formeln rauskrame, diese eintrage und die Aktionen manuell ausführe.
Ich bin an einer VBA Lösung interessiert, die sich nicht an Spalte A orientiert, sondern an der letzten belegten Zelle des Blattes.
Vielleicht kann man ja mein ursprüngliches Marko anpassen?
Grüße - Erwin

Anzeige
Ich schrieb ja bereits …
04.01.2016 08:11:57
RPP63
… dass man dieses als Makro ausführen kann!
Die Kenntnis der Formeln hilft Dir dennoch, um ähnliche Probleme anzugehen.
Entweder Du nimmst mein hardcodiertes Makro oder Du bleibst bei Deinen Inputboxes, dann solltest Du aber auf Apllication.InputBox umsteigen oder eine vernünftige Fehlerbehandlung einbauen.
Sub JedeXteZeile()
Dim Anfang As Long, Delta As Long
Dim HS As Integer 'Hilfsspalte 
Dim letzeZeile As Long
Anfang = 3
Delta = 4
HS = Cells(1, 2 ^ 14).End(xlToLeft).Column + 1
letzeZeile = Cells(2 ^ 20, 1).End(xlUp).Row
Cells(1, HS) = 0
Range(Cells(2, HS), Cells(letzeZeile, HS)).Formula = _
   "=IF(MOD(ROW()," & Delta & ")=" & Anfang & ",0,ROW())"
ActiveSheet.UsedRange.RemoveDuplicates HS
Columns(HS).Delete
End Sub
Gruß Ralf

Anzeige
Tja ...
04.01.2016 08:14:08
lupo1
Deine Empty-Prüfung sollte eigentlich ausreichen.
Schade, dass Du ansonsten beratungsresistent bist:
a) Löschen geht von hinten schneller; Du aber willst anscheinend weiter von vorn löschen
b) Formeln kann man auch in VBA verwenden (!)
c) Mit meiner Formel wird nicht gelöscht, sondern das Unerwünschte gar nicht erst aufgeführt. Ist das nicht besser?
Auch die Lösung von Ralf ist übrigens gut!

Anzeige
Geschwindigkeit
04.01.2016 08:18:33
RPP63
Gerade für 3.000 Zeilen ausprobiert:
Dauer 0,1 Sekunden!
Das versuche mal mit zeilenweisem Löschen.
;-)

AW: Jede x-te Zeile löschen
04.01.2016 08:34:21
Erwin
Hallo ihr beiden Helfer,
danke für eure Mühe und die Codes und die hilfreichen Tipps.
Wenn ihr mein VBA Level angesehen hättet, wüsstet ihr, warum ich einen fertigen Code benötige, der auch flexibel (Beginn und Anzahl der Zeilen) einsetzbar ist.
Jetzt pfriemel ich mir wieder ne Stunde lang die Inputboxen rein.
Grüße - Erwin

Anzeige
Bitteschön, Code folgt:
04.01.2016 08:41:50
RPP63
Microsoft Excel Objekt Tabelle2
Option Explicit 
 
Sub JedeXteZeile() 
Dim Anfang As Long, Delta As Long 
Dim HS As Integer 'Hilfsspalte 
Dim letzeZeile As Long 
Anfang = CInt(Application.InputBox("Startzeile", Type:=1)) 
Delta = CInt(Application.InputBox("ab welcher Zeile?", Type:=1)) 
HS = Cells(1, 2 ^ 14).End(xlToLeft).Column + 1 
letzeZeile = Cells(2 ^ 20, 1).End(xlUp).Row 
Cells(1, HS) = 0 
Range(Cells(2, HS), Cells(letzeZeile, HS)).Formula = _
   "=IF(MOD(ROW()," & Delta & ")=" & Anfang & ",0,ROW())" 
ActiveSheet.UsedRange.RemoveDuplicates HS 
Columns(HS).Delete 
End Sub 

Gruß Ralf

Anzeige
Da fehlt was
04.01.2016 08:50:37
lupo1
- Start ab Zeile
- (Shift möglich, aber nicht notwendig)
- jede wievielte
Cells(2 ^20) crasht bei Excel 2003. Besser mit Rows.Count

Ööhmm
04.01.2016 08:54:51
RPP63
Start ist Anfang, jede wievielte ist Delta
Shift verstehe ich nicht!
Der TE hat Xl2010, deshalb 2^20 und 2^14
?

Anzeige
Hatte den Code nur gelesen
04.01.2016 09:27:17
lupo1
Anfang = CInt(Application.InputBox("Startzeile", Type:=1))
Delta = CInt(Application.InputBox("ab welcher Zeile?", Type:=1))
ist widersprüchlich, denn "Startzeile" ist für mich das gleiche wie "ab welcher Zeile".
Und xl2003 wird durchaus noch verwendet; also auch bei verwendetem xl2010 noch einen Hinweis wert.
Nix für ungut!

Anzeige
Wohl wahr!
04.01.2016 09:48:21
RPP63
Der kluge :-( Text ist mir gar nicht aufgefallen.
Das mit dem 2^20 habe ich mir angewöhnt, weil ich schreibfaul bin.
Als Hinweis für "Nachschlager"
Excel bis 2003 hat 2^14 Zeilen und 2^8 Spalten ;-)
Gruß Ralf

AW: Ööhmm
04.01.2016 09:28:40
Erwin
Hallo Ralf,
nach einigen Test musste ich leider feststellen, dass zwar eine Hilfsspalte erzeugt wird, die aber im nächsten Schritt wieder verschwindet; die belegten Zeilen bleiben jedoch gleich.
Außerdem verstehe ich den Code ...RemoveDuplicates... nicht, da ja von Duplikaten nie die Rede war.
Selbst der Test zum entfernen mit möglichen Duplikaten läuft nicht; bei mir wird nichts gelöscht.
Mein eingangs gepostetes VBA läuft richtig, leider bezieht es sich immer auf eine gefüllte Spalte A, was ich nicht mehr möchte.
Kann man hier nicht das ...UsedRange... einbauen?
Erwin

Anzeige
Der Code funktioniert …
04.01.2016 09:49:59
RPP63
… einwandfrei, Erwin.
Lade mir mal eine Mappe hoch, bei der Du meinst, dass es nicht geht.
Gruß Ralf

Mea Culpa!
04.01.2016 10:10:59
RPP63
Sorry Erwin,
der Code funktioniert nicht, wenn Anfang größer als Delta ist!
Muss ich mir etwas überlegen.
Gruß Ralf

Jetzt aber!
04.01.2016 10:36:36
RPP63
Dies dürfte jetzt klappen (ganz anderer Ansatz):
Sub MalAnders()
Dim Anfang As Long, Delta As Long, cnt As Long
Dim letzeZeile As Long, Zeilen As Range
Anfang = CInt(Application.InputBox("Startzeile", Type:=1))
Delta = CInt(Application.InputBox("jede wievielte Zeile?", Type:=1))
letzeZeile = ActiveSheet.UsedRange.SpecialCells(xlCellTypeLastCell).Row
Set Zeilen = Rows(Anfang + Delta)
For cnt = Anfang + 2 * Delta To letzeZeile Step Delta
   Set Zeilen = Union(Zeilen, Rows(cnt))
Next
If Not Zeilen Is Nothing Then Zeilen.EntireRow.Delete
End Sub
Gruß Ralf

Anzeige
AW: Jetzt aber! ==>> wunderbar :)
04.01.2016 10:43:00
Erwin
Hallo Ralf,
vielen Dank für die Mühe und Geduld mit mir, jetzt ist es genau das, was ich haben wollte.
Grüße - Erwin

AW: RemoveDuplicates, das Beste zum Zeilen löschen
04.01.2016 16:27:09
Daniel
Hi
RemoveDuplikats entfernt Zeilen mit Duplikaten.
der grosse Vorteil von RemoveDupliacates ist, dass es dabei sehr schnell ist und mit grössten Datenmengen funktioniert, egal wie die Zeilen liegen.
Alle anderen Löschmethoden sind nur dann schnell, wenn die zu löschenenden Zeilen einen lückenlos zusammenhängenden Block bilden, welcher in einem Vorgang gelöscht wird, dh die Zeilen müssen vor dem Löschen sortiert werden.
Removeduplicates ist aber auch in unsortierten Tabellen sehr schnell beim Löschen.
daher bietet es sich an, das RemoveDuplicats generell zum Löschen von Zeilen zu verwenden.
hierzu schreibt man in eine Hilfsspalte am Tabellenende eine Formel, welche alle Zeilen die gelöscht werden sollen mit dem selben Wert kennzeichnet (z.B. die 0) und alle Zeilen die stehen bleilben müssen, mit einem individuellen Wert, (z.B. der aktuellen Zeilennummer), damit man das RemoveDuplikates dann anwenden kann.
da das RemoveDuplicats immer eine Zeile mit dem "gleichwert" (0) stehen lässt, sollte man dafür sorgen, dass dieser "gleichwert" zusätzlich in einer Zeile steht, die stehen bleiben muss, Idalerweise nimmt man die Überschriftenzeile (welche sowieso jede Tabelle haben sollte)
ein weitere Vorteil dieser Methode ist, dass man sie auch von Hand problemlos anwenden kann, unabhängig von der Anzahl der Zeilen der Tabelle (dh man muss nicht immer ein Makro schreiben, wenn die Aufgabe "einmalig" ist)
wenn man es per Makro schreibt, dann lässt sich die Methode auch relativ einfach so programmieren, dass sie sich automatisch an die Tabellengrösse anpasst (Zeilen wie Spalten)
schau dir mal da Beispiel an:
Sub löschen_jede_X_Zeile()
Dim ErsteLöschZeile As Long
Dim Abstand As Long
Dim FO As String
FO = "=IF(Row() 
Gruss Daniel

Anzeige
RemoveDuplicates, ...
04.01.2016 19:28:42
Erwin
Hallo Daniel,
mit dieser super Erklärung und dem Code funzt es wirklich sauschnell.
Ich dachte immer RemoveDuplikates hat immer was mit Dubletten zu tun :)
Danke - Erwin

AW: RemoveDuplicates, ...
04.01.2016 19:42:19
Daniel
Sicherlich hat RemoveDuplicates was mit Dubletten zu tun!
Aber weil das so gut funktioniert, setzt man es auch dann ein, wenn man in den Originaldaten keine Dubletten hat und erzeugt die benötigten Dubletten in einer Hilfsspalte per Formel
Gruss Daniel

Anzeige
Meine Formellogik als VBA
04.01.2016 10:24:01
lupo1

Sub LoescheXteZeile()
a = Cells(Cells.Rows.Count, 1).End(xlUp).Row * 2
b = CInt(Application.InputBox("Startzeile?", Type:=1))
x = CInt(Application.InputBox("Jede wievielte Zeile?", Type:=1))
arr = Range("A1:A" & a)
For i = b To a / 2
arr(i, 1) = arr(Int((i - 1) * x / (x - 1)) + 1, 1)
Next
Range("A1:A" & a) = arr
End Sub

Innerhalb der Schleife, die nur die Spalte A abarbeitet, könnte man noch eine weitere für mehrere Spalten einfügen.

Anzeige
AW: Meine Formellogik als VBA
04.01.2016 10:35:03
Erwin
Hallo Lupo1,
auch dein Makro funktioniert nicht wie gewünscht, weil ja die gesamte Zeile gelöscht werden soll und es auch vorkommt, dass in einer anderen Spalte (nicht A) die letzte Zelle auf dem Blatt ist.
Erwin

beide Punkte berücksichtigt
04.01.2016 10:49:57
lupo1

Sub LoescheXteZeile()
a = Cells.CurrentRegion.Rows.Count * 2
b = CInt(Application.InputBox("Startzeile?", Type:=1))
x = CInt(Application.InputBox("Jede wievielte Zeile?", Type:=1))
arr = Range("A1:DZ" & a)
For i = b To a / 2
For j = 1 To 100
arr(i, j) = arr(Int((i - 1) * x / (x - 1)) + 1, j)
Next
Next
Range("A1:DZ" & a) = arr
End Sub

Ich habe mal fix 100 Spalten angenommen, kannst Du ja anpassen (Die Anzahl von Spalten bleibt in 99% aller Anwendungen konstant).
Außerdem habe ich statt .UsedRange einfach .CurrentRegion angenommen (funktioniert so, wie die automatische Ausweitung einer Zelle auf einen Sortierbereich)

Anzeige
AW: beide Punkte berücksichtigt
04.01.2016 11:34:25
Erwin
Hallo Lupo1,
herzlichen Dank für deine Mühe. Beim testen ist mir aufgefallen, wenn ich z. B. ab 10. Zeile jede 3 löschen möchte, löscht der Code die Zeilen 10, 11, 12, 13, 15, 18, 21, 24, ...; da scheint es am Anfang ein Problem zu geben.
Erwin

vielleicht ja so erwünscht:
05.01.2016 07:58:43
lupo1

Sub LoescheXteZeile() 'b=7 mit x=7 löscht Zeile 13, 20, 27 ...
a = Cells.CurrentRegion.Rows.Count * 2
c = Cells.CurrentRegion.Columns.Count
b = CInt(Application.InputBox("Startzeile?", Type:=1))
x = CInt(Application.InputBox("Jede wievielte Zeile?", Type:=1))
arr = Cells(1, 1).Resize(a, c)
For i = b To a / 2
For j = 1 To c
arr(i, j) = arr(Int((i - b) * x / (x - 1)) + b, j)
Next
Next
Cells(1, 1).Resize(a, c) = arr
End Sub

Gebe ich nun 10 als Startzeile und 3 als Jede-Wievielte ein, werden 12, 15 ... gelöscht

Anzeige
AW: vielleicht ja so erwünscht: ==> Ja genau so
05.01.2016 08:10:42
Erwin
Hi lupo1,
super, Test passt, danke nochmals für deine Mühe.
Grüße - Erwin
;

Forumthreads zu verwandten Themen

Anzeige
Anzeige
Entdecke relevante Threads

Schau dir verwandte Threads basierend auf dem aktuellen Thema an

Alle relevanten Threads mit Inhaltsvorschau entdecken
Anzeige
Anzeige

Infobox / Tutorial

Jede x-te Zeile in Excel löschen


Schritt-für-Schritt-Anleitung

Um jede x-te Zeile in Excel zu löschen, kannst Du ein VBA-Makro verwenden. Hier ist eine einfache Schritt-für-Schritt-Anleitung:

  1. Öffne Excel und drücke ALT + F11, um den VBA-Editor zu öffnen.
  2. Klicke auf Einfügen > Modul, um ein neues Modul zu erstellen.
  3. Füge den folgenden Code in das Modul ein:
Sub Jede_X_te_Zeile_loeschen()
    Dim Zeile1 As Long, x As Long
    Dim letzeZeile As Long
    Application.ScreenUpdating = False
    Zeile1 = Val(InputBox("Beginn in Zeile?", "Zeilen löschen"))
    x = Val(InputBox("Jede wievielte?"))

    letzeZeile = ActiveSheet.UsedRange.SpecialCells(xlCellTypeLastCell).Row
    Do While Zeile1 <= letzeZeile
        Rows(Zeile1).Delete
        Zeile1 = Zeile1 + x - 1
    Loop
    Application.ScreenUpdating = True
End Sub
  1. Schließe den VBA-Editor und kehre zu Excel zurück.
  2. Führe das Makro aus, indem Du ALT + F8 drückst, das Makro auswählst und auf Ausführen klickst.

Mit diesem Makro kannst Du jede zweite Zeile in Excel, jede dritte Zeile oder sogar jede vierte Zeile auswählen und löschen.


Häufige Fehler und Lösungen

  • Problem: Das Makro löscht nicht die gewünschten Zeilen.

    • Lösung: Stelle sicher, dass Du die richtigen Werte für die Startzeile und den Abstand (x) eingibst.
  • Problem: Das Makro läuft sehr lange.

    • Lösung: Achte darauf, dass Du das Application.ScreenUpdating auf False setzt, um die Ausführung zu beschleunigen.
  • Problem: Fehler beim Zugriff auf UsedRange.

    • Lösung: Stelle sicher, dass Deine Daten keine leeren Zeilen enthalten, die das Makro stören könnten.

Alternative Methoden

Wenn Du nicht mit VBA arbeiten möchtest, kannst Du auch Formeln verwenden:

  1. Erstelle eine Hilfsspalte neben Deinen Daten.

  2. Verwende eine Formel wie:

    =WENN(REST(ZEILE();x)=0;ZEILE();"")

    Ersetze x durch die Anzahl der Zeilen, die Du überspringen möchtest.

  3. Filtere die Hilfsspalte, um nur die Zeilen mit Werten anzuzeigen, und kopiere sie an einen neuen Ort.


Praktische Beispiele

  1. Jede zweite Zeile löschen:

    • Setze x auf 2 im Makro.
  2. Jede dritte Zeile löschen:

    • Setze x auf 3 im Makro.
  3. Nur jede zehnte Zeile verwenden:

    • Setze x auf 10 im Makro.

Das Beispiel passt sowohl für Excel 2010 als auch für spätere Versionen.


Tipps für Profis

  • Du kannst das Makro anpassen, um nur bestimmte Spalten zu bearbeiten, indem Du die Rows-Methode durch Cells ersetzt.
  • Verwende Application.InputBox anstelle von InputBox, um Datentypen zu überprüfen und Benutzerfehler zu minimieren.
  • Wenn Du regelmäßig jede x-te Zeile löschen musst, überlege, eine Schaltfläche in Deinem Excel-Dokument zu erstellen, um das Makro auszuführen.

FAQ: Häufige Fragen

1. Wie kann ich jede zweite Zelle in Excel löschen? Du kannst eine ähnliche Technik verwenden, jedoch mit einer Formel, die die Zellen in einer Hilfsspalte markiert.

2. Funktioniert dies in allen Excel-Versionen? Ja, die beschriebenen Methoden und das VBA-Makro funktionieren ab Excel 2007 und in allen späteren Versionen.

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Entdecke mehr
Finde genau, was du suchst

Die erweiterte Suchfunktion hilft dir, gezielt die besten Antworten zu finden

Suche nach den besten Antworten
Unsere beliebtesten Threads

Entdecke unsere meistgeklickten Beiträge in der Google Suche

Top 100 Threads jetzt ansehen
Anzeige