Live-Forum - Die aktuellen Beiträge
Datum
Titel
24.04.2024 19:29:30
24.04.2024 18:49:56
Anzeige
Archiv - Navigation
1464to1468
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
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

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)

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!

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
?

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

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.

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)

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

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

304 Forumthreads zu ähnlichen Themen

Anzeige
Anzeige
Anzeige

Links zu Excel-Dialogen

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige