Anzeige
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
Anzeige
Inhaltsverzeichnis

VBA Tool zum löschen von Zeilenblöcken

Forumthread: VBA Tool zum löschen von Zeilenblöcken

VBA Tool zum löschen von Zeilenblöcken
09.03.2025 21:02:38
Phylosoraptor
Guten Tag!
Ich bin neu im Forum (und auch in der VBA Programmierung). Nachdem ich einen VBA Grundkurs absolviert habe, konnte ich bereits einige Erfolge erzielen. Allerdings bringt mich mein aktuelles Projekt an meine Grenzen. Aber vielleicht könnt ihr mir weiterhelfen und guten Input geben :)
Eine ausführliche Google Suche konnte mir leider keine befriedigenden Ergebnisse liefern.

Was soll das Makro können?

Es liegen mehrere Excel Sheets vor. Diese enthalten Zeilen mit mehreren Spalten an Daten. In der letzten Spalte sind die relevanten Daten für das Makro. Es gibt in unregelmäßigen Abständen Zeilenblöcke, in denen der Wert der letzten Spalte 0 ist.

Userbild

Das Makro soll diese Zeilenblöcke erkennen und löschen.

Userbild

Der Haken: Die ersten beiden und letzten beiden Zeilen dieser Blöcke sollen bestehen bleiben. Bonusfunktion: manchmal schleichen sich Zahlen im einstelligen Bereich in diese Nullblöcke. Die soll das Tool nach Möglichkeit übergehen und mit löschen.

Das Grundprinzip habe ich mir so gedacht:

- Gesamtlänge des Dokuments bestimmen
- Mit for Schleife von unten nach oben durchgehen
- sobald 0 auftaucht: Anfangspunkt des Blocks setzen
- sobald größer 0: Endpunkt des Blocks setzen
- Block löschen, wenn größer als 4 Zeilen und die ersten beiden und letzten beiden Zeilen behalten
- weiter loopen bis in Zeile 2 angekommen

Das ist aktuelle Schlachtfeld in meinem VBA Modul. Da ist noch sehr viel abstrakter Code drinnen.



Sub Nullwerte_loeschen()

Dim i As Integer 'Bereich in dem Loop läuft
Dim eingabe_user As String
Dim firstrow As Integer 'Erste Reihe des Blocks
Dim lastrow As Integer 'Endreihe des Blocks
Dim finalRow As Integer 'Gesamtlänge des Arbeitsblattes für Start des Check-Loops
Dim ws As Worksheet

'Messagebox mit Erklärung des Makros und Frage nach Ausführung

eingabe_user = MsgBox("Dieses Makro löscht alle Nullwerte. Bitte beachte, dass dies für die aktive Mappe und das aktive Blatt gilt! Möchtest du dieses Makro Ausführen?", vbOKCancel, "Löschen aller Nullwerte")

'start des Hauptloops
If eingabe_user = vbOK Then
Set ws = ThisWorkbook.ActiveSheet 'Arbeitsblatt und Arbeitsmappe definieren (aktive Mappe mit aktiven Blatt wird gewählt)
finalRow = Cells(65000, 1).End(xlUp).Row 'Gesamtlänge der Tabelle ermitteln
For i = finalRow To 2 Step -1 'starten des Check-Loops
If ws.Cells(i, 10).Value > 2 Then 'Hier ist ein Fehler!
firstrow = i 'Startpunkt des Blocks wird gespeichert (Aktuell wird jede Zeile gespeichert, oder keine)
'Elseif wert über 2 then
'lastrow bestimmen
'block löschen
Rows(firstrow & ":" & lastrow).EntireRow.Delete
'var reseten und weiter hochgehen
End If
Next i
MsgBox "Makro läuft"
Else
MsgBox "Fehler! Makro wird abgebrochen"

End If
End Sub


Lasst uns gerne über eure Ideen und Ansätze diskutieren! Ich freue mich auf euer Feedback.
Anzeige

11
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: VBA Tool zum löschen von Zeilenblöcken
09.03.2025 22:00:25
Daniel
Hi

keiner Tipp am Rande: wenn du konkret Hilfe haben willst, ist es immer hilfreich, nicht nur Bilder und den Code zu zeigen, sondern gleich die Datei mit den Daten und deinen Codeversuchen mit hochzuladen. Dann können Helfer auch gleich mal was ausprobieren und dann bekommst du meistens auch recht schnell hilfe.

ich würde hier so vorgehen:
im Schritt 1 per Formel mal kennzeichnen, was gelöscht werden muss und was nicht. zunächst einmal ohne irgendwelche Randbedingungen, dh alles was J 0 ist, soll gelöscht werden.
dazu folgende Formel ab K2: =Wenn(J2=0;1;"X")
entscheidend für das weitere vorgehen ist hier, dass wir für die Kennzeichung einmal eine Zahl und einmal einen Text verwenden (welche Werte, ist eigentlich egal), darüber kann man gezielt auf zu löschenden Block (Zahl) und nicht zu löschenden Block (Text) zugreifen.

der Code dafür wäre
With Columns(10).SpecialCells(xlcelltypeconstants, 1).Offset(0, 1)

.FormulaR1C1 = "=IF(RC10=0,1,""x"")"
.Formula = .value
End with

das SpecialCells wählt alle Zellen in Spalte J aus, die eine Zahl enthalten, so können wir alle Zellen bestimmen, ohne erst aufwendig erste und letzte Zeile ermitteln zu müssen.
der zweite Schritt eleminiert die formel und wandelt sie in feste Werte um, das brauchen wir, da wir diese Werte nochmal überarbeiten müssen

für den Berabeitungsschritt muss man das Konstrukt der AREA kennen. Während CELLS eine einzelne Zelle ist und RANGE eine beliebige Ansammlung von CELLS ist, ist eine AREA ein rechteckiger lückenloser Zellbereich. die RANGE("A1:B3,A5:B10") besteht aus den AREAS Range("A1:B3") und Range("A5:B10") und man kann jetzt bei so einer beliebig zusammengestetzen RANGE sich entscheiden, ob man eine Schleife über alle Einzelzellen dieser Range laufen lassen will, oder eine Schleife über alle AREAS, also alle lückenlos zusammenhängende Zellblöcke.
In Spalte 11 haben wir ja Zahlen und Texte, diese kann man über SpecialCells getrennt selektieren, so dass eine Range entsteht, die mehrere Areas enthält.

die nächste Bedingung war, dass Blöcke, die nur aus Zahlen kleiner 10 (einstellig) in Spalte J bestehen, auch gelöscht werden sollen
dh wir machen eine Schleife über alle Blöcke, die mit "x" gekennzeichnet sind und prüfen, welche Zahlen da in Spalte J stehen:
dim A as Range

for each A in columns(11).SpecialCells(xlcelltypeconstants, 2).Areas'2 = Texte (also unser x)
if worksheetfunction.Max(A.Offset(0, 1)) 10 Then A.Value = 1
next


so jetzt löschen wir die bereiche.
das stehenlassen der ersten und letzten zeilen löst man, in dem man die Größe des Bereichs anpasst und diesen verschiebt.
for each A in columns(11).SpecialCells(xlcelltypeconstants, 1).Areas

if A.Rows.Count > 4 Then A.offset(0, 2).Resize(A.Rows.Count - 4).EntireRow.Delete
next


damit sollte die Aufgabe dann gelöst sein.

Gruß Daniel

Anzeige
AW: VBA Tool zum löschen von Zeilenblöcken
09.03.2025 22:30:43
Phylosoraptor
Hallo Daniel,
vielen Dank für deine Hilfe! Ich habe dir mal eine Beispieldatei angehangen ;)

https://www.herber.de/bbs/user/176190.xlsx

Ich muss mich da Piet anschließen: Respekt!
Ich habe deinen Code mal durchlaufen lassen, aber leider wurden fast sämtliche Daten gelöscht. Vermutlich ein kleiner Fehler im Code beim Löschvorgang. Die Markierung der Blöcke finde ich eine kreative Lösung!
Anzeige
AW: VBA Tool zum löschen von Zeilenblöcken
09.03.2025 22:36:16
Daniel
Hi
eine Bitte: es ist nicht mein Code, es ist dein Code den du zwar mit meiner Hilfe, aber trotzdem selbst geschrieben hast.
Zeige bitte deinen Code (denn eigentlich habe ich ja kein fertiges Makro geliefert). und was auch immer hilfreich für Helfer ist:
markiere in der Beispieldatei von Hand die Zellen, die gelöscht werden sollen, damit man prüfen kann, ob das Makro dann auch nach deinen Wünschen arbeitet.
Gruß Daniel
Anzeige
AW: VBA Tool zum löschen von Zeilenblöcken
09.03.2025 23:05:58
Daniel
Ja, damit kann man dann was anfangen.
ich hatte da noch zwei Flüchtigkeitsfehler drin.
das erste Offset musst natürlich sein Offest(0, -1) und das zweite Offset(2, 0)
aber so ist halt, wenn man rein theoretisch arbeiten muss und nichts ausprobieren kann.

zum testen ist auch immer gut, wenn du erstmal die zu bearbeitenden Zellbereiche selektierst, bevor du sie bearbeitest und wenn du statt zu löschen erstmal einfärbst. Das erleichtert es, das Ergebnis zu kontrollieren, weil man die Daten nicht zerstört und damit wiederholt testen kann, ohne jedes mal die Daten neu laden zu müssen.
das Selektieren hilft beim Testen im Einzelstepmodus, weil man dann sieht, wo der nächste Bearbeitungsschritt stattfindet.
wenns dann funktioniert, nimmt man das Selektieren natürlich wieder raus.

also hier mal der Code zum Testen mit Rotfärbung statt löschen (das Löschen ist im Kommentar)


Sub nullwerte_loeschen_Daniel()


With Columns(10).SpecialCells(xlCellTypeConstants, 1).Offset(0, 1)
.FormulaR1C1 = "=IF(RC10=0,1,""x"")"
.Formula = .Value
End With

Dim A As Range
For Each A In Columns(11).SpecialCells(xlCellTypeConstants, 2).Areas '2 = Texte (also unser x)
A.Select
If WorksheetFunction.Max(A.Offset(0, -1)) 10 Then A.Value = 1
Next

For Each A In Columns(11).SpecialCells(xlCellTypeConstants, 1).Areas
If A.Rows.Count > 4 Then
A.Offset(2, 0).Resize(A.Rows.Count - 4).Select
A.Offset(2, 0).Resize(A.Rows.Count - 4).Interior.Color = vbRed '.EntireRow.Delete
End If
Next

End Sub


bis auf den vorletzten Block passt es, beim vorletzen Block hab ich aber grad keine Idee, wie man das in einem Sinne lösen könnte, da müsste man sich für die erste Schleife wahrscheinlich noch weitere Regeln überlegen, warum hier nicht gelöscht werden soll.

Gruß Daniel
Anzeige
AW: VBA Tool zum löschen von Zeilenblöcken (gelöst)
10.03.2025 10:19:58
Phylosoraptor
Vielen Dank für deine Hilfe! Ich habe das Makro noch etwas angepasst. An sich funktioniert es so erstmal gut genug. Ich werde es noch ein wenig testen und dann sollte diese Aufgabe auch erledigt sein. Danke für deinen Denkanstoß, ich habe eine Menge gelernt :)
AW: VBA Tool zum löschen von Zeilenblöcken
14.03.2025 21:51:29
Phylosoraptor
Hey Daniel,

ich habe noch ein kleines Problem. Vielleicht hast du ja eine Idee. Bei der letzten If Schleife für das Löschen der Blöcke:


For Each A In Columns(11).SpecialCells(xlCellTypeConstants, 1).Areas
If A.Rows.Count > 4 Then
A.Offset(2, 0).Resize(A.Rows.Count - 4).Select
A.Offset(2, 0).Resize(A.Rows.Count - 4).Interior.Color = vbRed '.EntireRow.Delete
End If
Next


brauche ich noch eine Zusatzbedingung. Die Werte in den Spalten D bis F müssen gleich sein. Ich habe jetzt eine ganze Weile herumprobiert und komme auf keine Lösung, die Funktioniert. Mein Ansatz:



For Each A In Columns(11).SpecialCells(xlCellTypeConstants, 1).Areas
If A.Rows.Count > 4 and A.Columns("4:6") = A.Columns("4:6") Then
A.Offset(2, 0).Resize(A.Rows.Count - 4).Select
A.Offset(2, 0).Resize(A.Rows.Count - 4).Interior.Color = vbRed '.EntireRow.Delete
End If
Next


Am Ende möchte ich nur die Werte der Spalten vergleichen, ob diese gleich sind. In den betreffenden Zellen steht Text, keine Zahlen. Leider meckert immer der Debugger. Ich komme auf keine funktionierende Syntax.
Anzeige
AW: VBA Tool zum löschen von Zeilenblöcken
09.03.2025 22:48:56
Phylosoraptor
Alles klar, das macht Sinn! Anbei die Tabelle mit dem unfertigen Code und gelber Markierung für zu löschende Zeilen.

https://www.herber.de/bbs/user/176192.xlsm

Ich werde mich mal zu Areas belesen, damit ich deinen Lösungsansatz besser nachvollziehen kann :)
Anzeige
AW: VBA Tool zum löschen von Zeilenblöcken
09.03.2025 22:05:46
Piet
Hallo

probiere es bitte mal mit diesem Code. Ich bin gespannt wie gut es klappt??

mfg Piet

Sub Nullwerte_Löschen()

Dim j As Long, i As Long
Dim n As Long, lz1 As Long
lz1 = Cells(Rows.Count, 1).End(xlUp).Row
'Untere Nullwerte ermitteln
For j = lz1 To 2 Step -1
If Cells(j - 0, 10) = 0 And _
Cells(j - 1, 10) = 0 Then
'Obere Nullwerte ermitteln
For i = j To 2 Step -1
If Cells(i - 0, 10) > 0 And _
Cells(i - 1, 10) = 0 And _
Cells(i - 1, 10) = 0 Then Exit For
Next i
'ausgewählten Block löschen
Rows(i - 1 & ":" & j - 2).Delete shift:=xlUp
End If
Next j
End Sub
Anzeige
AW: VBA Tool zum löschen von Zeilenblöcken
09.03.2025 22:12:52
Piet
Hallo

@Daniel -- wow, was für eine komplexe Berechnung, Hut ab vor deinem Wissen, aber ich habe so gut wie nix verstanden!

Jetzt bin ich gespannt wie mein Simpelmakro sich bei vielen Daten bewährt. Konnte es bei 20 Zeilen nicht richtig testen!

mfg Piet
AW: VBA Tool zum löschen von Zeilenblöcken
09.03.2025 22:19:32
Daniel
Danke für die Blumen, aber da ist doch nichts "komplexes" dran.
man muss halt nur das Konzept der AREAS kennen (Lückenlose rechteckige Zellblöcke als Teil einer Range, was ich ja erklärt habe) und die Excel-Funktion Inhalte auswählen Text/Zahl, bzw deren Umsetzung in VBA (specialCells)
und dann kombiniert man das ganze.
Damit wirds dann einfach.
Gruß Daniel
Anzeige
AW: VBA Tool zum löschen von Zeilenblöcken
09.03.2025 22:32:47
Phylosoraptor
Hallo Piet,
auch vielen Dank für deine Hilfe. Ich hab deinen Code mal durchlaufen lassen, allerdings meckert der Debugger herum und es werden alle Zeilen gelöscht. Ich habe auf Daniels Antwort mal eine Beispieldatei zum basteln geschickt :)

Forumthreads zu verwandten Themen

Anzeige
Anzeige
Anzeige