Nicht zusammenhängende Zeilen mit Mako löschen

Hallo miteinander,

Ich möchte gern eine Tabelle aufbereiten und bin relativ neu im VBA-Geschäft.

Und zwar habe ich eine große Tabelle in der immer die Zeilen 2+(i*24), 3+(i*24), 4+(i*24) gelöscht werden sollen, wobei i = 0 to 20000 (oder so). D.h. ich will die Zeilen 2,3,4,26,27,28,50,51,52, usw. löschen.

Hintergrund ist eine große Datenbank in Excel, in der ich unwichtige Daten raus löschen möchte. Ein Datensatz besteht aus 26 Zeilen, wobei jeweils die ersten drei Zeilen uninteressant sind (erst mal). Die erste Zeile ist die Kopfzeile und soll nicht berücksichtigt werden.

Weiter gäbe es eine Spalte ©, in der die ersten 4 Zeilen jedes Datensatzes mit den Zahlen 0,1,2,3 durch numeriert sind. Ich hab hier auch schon sowas wie:

Sub delete_3()
Range(„C2:C100“).Select (C100 damit’s nicht so lang dauert)
For Each cell In Selection
If cell.Value = „0“ Or „1“ Or „2“ Then cell.EntireRow.Delete
Next
End Sub

geht auch nicht. Lieber wäre mir sowieso eine Lösung in der ich keine Zelleninhalte abprüfen muss.

Ich hab schon einiges ausprobiert, aber leider hat nix wirklich funktioniert.
Vielleicht könnte mir jemand unter die Arme greifen. Ich wäre euch sehr Verbunden.
Vielen Dank

Hallo 123Sirob,
fühle mich geschmeichelt. Bin selbst wenig erfahren und im Wesentlichen ein Copy + Paste Anwendere. Du weisst, dass man auch komplette Spalten markieren kann, oder? Mit
Rows(„A:B“).Select
Selection.Delete Shift:=xlUp
kann man ganze Zeilen löschen. Dabei wären A und B ganze Zahlen, die man über die Reihenbildung, die Du schon beschrieben hast ansteuern könnte.
Über Do Until … Loop könnte man die Zeilen ansteuern und Löschen.
Wenn das unklar war, lass mich 's wissen.
LG MwieMichel

Hallo du,
mit der Löscherei ist das so eine Sache … die geht man am besten vom anderen Ende aus an; probier’s mal gedanklich einfach damit, die Schleife „verkehrt herum“ aufzubauen,
also in einer Schleife vom Ende her nach oben zu laufen;
oder alternativ:
in deiner Lösung die Textbegrenzungen wegzulassen und die Bedingung korrekt zu formulieren:
If cell.Value = 0 Or cell.Value =1 Or cell.Value =2 Then …

Wenn du damit nicht zurecht kommst, meld dich gerne noch einmal, dann nehm ich mir gerne mehr Zeit.
Viel Erfolg,
Katharina

Hallo,

probier mal das:

Sub delete_4()
dim i as integer
for i = 1 to 2000
cells(2+(i*24),1).EntireRow.Delete
cells(3+(i*24),1).EntireRow.Delete
cells(4+(i*24),1).EntireRow.Delete
next i
End Sub

mfg

Hallo Boris,

…ich will die Zeilen 2,3,4,26,27,28,50,51,52, usw. löschen.

Probier’ 'mal

With Sheets("yadda")
 For i = 2000 to 0 Step -1
 .Rows(i\*24+4).Delete
 .Rows(i\*24+3).Delete
 .Rows(i\*24+2).Delete
 Next i
End With 'Sheets("yadda")

Anmerkung:
Beim Löschen fängt man immer am Ende an, weil das Programm die Elemente nach jedem Löschen neu zählt. Fängt man unten an und löscht bspw. Zeile 2, wird danach die frühere Zeile 3 zu Zeile 2. Das heißt, der nächste Löschbefehl löscht die frühere Zeile 4.
Ach, und: Select braucht man äußerst selten, man kann direkt auf die Ranges zugreifen.

Weiter gäbe es eine Spalte ©, in der die ersten 4 Zeilen jedes Datensatzes mit den Zahlen 0,1,2,3 durch numeriert sind.
Ich hab hier auch schon sowas wie:

Sub delete_3()
Range(„C2:C100“).Select '(C100 damit’s …)
For Each cell In Selection
If cell.Value = „0“ Or „1“ Or „2“ Then cell.EntireRow.Delete
Next
End Sub

Diese Bedingung kann nicht funktionieren. .VALUE erwartet eine Zahl, Du prüfst aber auf Text („0“).

Lieber wäre mir sowieso eine Lösung in der ich keine Zelleninhalte abprüfen muss.

Das verstehe ich nicht. Es sei denn, die Inhaltsprüfung wäre Deine Alternative, um das Löschen zu erreichen. Wenn die Bedingung aber auch relevant ist, kannst Du sie mit AND bzw. OR mit der obigen Schleife kombinieren.
HTH.

Markus
_____________
Und Sterne sammel’ ich noch immer.

Hi 123Sirob,
probier’s mal so.


Sub ZeilenLoeschen()
Rem Testdaten generieren
Sheets(„Tabelle1“).Range(„A1“).Value = „Überschrift“
n = 1
For Each Zelle In Sheets(„Tabelle1“).Range(„A2:A1000“)
Zelle.Value = n
n = n + 1
If n = 27 Then
n = 1
End If
Next

Rem Die ersten 3 Zeilen in jedem Block löschen
For n = 2 To 1000
Sheets(„Tabelle1“).Rows(n).Delete
Sheets(„Tabelle1“).Rows(n).Delete
Sheets(„Tabelle1“).Rows(n).Delete

n = n + 22
Next n
End Sub

Danke für die guten Idee, Vorschläge und Anregungen. Hab mir da jetzt aus all den Tips was Zusammengebastellt und es funktioniert tatsächlich!
Sieht jetzt so aus:

Dim i As Integer

For i = 4 To 0 Step -1
Rows(i * 24 + 4).Delete Shift:=xlUp
Rows(i * 24 + 3).Delete Shift:=xlUp
Rows(i * 24 + 2).Delete Shift:=xlUp
Next i

War wirklich sehr hilfreich.
Vielen Dank nochmal. Da wird noch ein bisschen was zu tun sein und ich werd sicher bald wieder Hilfe brauchen. Über weitere Unterstützung freu ich mich
natürlich :smile:.
Gruß

Hi,

leider kann ich dazu nicht viel Infos geben, ich hatte mich nur mit Access beschäftigt.
Aus aktuellem Anlasse habe ich das aber auch sehr stark eingeschränkt und beschäftige mich nur noch mit Datenbanken (Schwerpunkt mySQL) und C#.
BTW: Wenn Du eine große „…Datenbank in Excel…“ hast ist das eigentlich ein Wiederspruch: entweder Datenbank oder Tabellenkalkulation.
Versuche Dein (Daten -) Problem in einer Datenbank zu lösen, ist meist einfacher als man denkt.

Grundlage ist eine XML-Datenbank. Bis jetzt versuche ich diese Datenbank als Liste in Excel zu importieren und sie dann anschließend so aufzubereiten, dass ich damit leicht weiter arbeiten kann.

Von Zeit zu Zeit wird die Datenbank aktualisiert. Die Idee ist dann die alte Datenliste mit der neuen zu ersetzen, diese mit einem Makro (oder wie auch immer) aufzubereiten um anschließend auf die aktuellen Daten in den Excel-Berechungen zurück zu greifen.

Da ich mich bei den Excel-Berechnungen mit Dropdown-Listen, Sverweisen und Sonstigem auf diese Datenliste beziehen möchte, muss die Position der neuen Daten die selbe wie die der alten Daten haben.

Ob XML-Dateien in Excel anders als als Liste eingebunden werden können weiß ich nicht. Wenn ich anschließend Zahlenwerte aus den XML-Dateien zur Berechnung in Excel benützen kann wäre das natürlich auch eine sehr gute Lösung.

Gruß Sirob

sry…kann leider nicht helfen

Hallo, kan leider nicht helfen, bin kein Prgrammierer