Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
952to956
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
952to956
952to956
Aktuelles Verzeichnis
Verzeichnis Index
Verzeichnis Index
Übersicht Verzeichnisse
Inhaltsverzeichnis

Zeilen nach Kriterum löschen

Zeilen nach Kriterum löschen
Immanuel

Guten Tag
Ich habe nun schon ziemlich viele Foren durchforstet, aber leider keine Makro gefunden, resp anpassen können.
Hier kurz eine Schilderung meines Problems:
Ich habe ein Datenblatt mit langen Formeln hinterlegt. Ich möchte alle Zeilen löschen, welche keine Zahlen ergeben, d.h. leer sind! (aber sie haben trotzdem Formeln hinterlegt).
Da in Spalte A das Datum steht, sollte das Makro erst ab Spalte B suchen.
In den folgenden Spalten sind Renditen von verschiedenen Firmen aufgeführt. Da die Zeitreihen stark schwanken möchte ich jeweils oben und unten die leeren Zeilen löschen (damit die Grafik schöner aussieht)
Also ich versuche noch einmal zusammenzufassen:
Sobald in einer Zeile nach B3(suchen nach unten und nach rechts) eine Zahl steht, die Zeile nicht löschen.
Oder alle die keine Zahl haben löschen..
Ich hoffe ich habe mich einigermassen klar ausgedrückt.
Vielen Dank

AW: Zeilen nach Kriterum löschen
25.02.2008 11:41:00
mpb
Hallo Immanuel,

Sub Zeilen_loeschen()
Application.ScreenUpdating = False
z = Range("A1").SpecialCells(xlLastCell).Row
s = Range("A1").SpecialCells(xlLastCell).Column
For j = z To 4 Step -1
For i = s To 2 Step -1
If Cells(j, i) = "" Then
Rows(j).Delete
Exit For
End If
Next i
Next j
Application.ScreenUpdating = True
End Sub


Gruß
Martin

AW: Zeilen nach Kriterum löschen
25.02.2008 11:53:07
Michael
Ich hatte das Problem anders verstanden,
dai ichs nun schon geschreiben habe poste ichs ;-)
(ungetestet)

Sub test()
Dim Spalte As Long
Dim zeile As Long
Dim test As Double
z = Range("A1").SpecialCells(xlLastCell).Row
s = Range("A1").SpecialCells(xlLastCell).Column
For zeile = 1 To z
For Spalte = 3 To s
test = test + Cells(zeile, Spalte)
Next Spalte
If test > 0 Then
Rows(zeile).Delete
End If
test = 0
Next zeile
End Sub


Anzeige
AW: Zeilen nach Kriterum löschen
25.02.2008 12:04:55
Chris
Servus,
ohne Schleife:

Sub Löschen()
Dim lngLetzteRow As Long, lngLetzteSpalte As Long
lngLetzteRow = Cells.Find(what:="*", SearchOrder:=xlByRows, SearchDirection:=xlPrevious).Row
lngLetzteSpalte = Cells.Find(what:="*", SearchOrder:=xlByColumns, SearchDirection:=xlPrevious). _
Column
Columns(lngLetzteSpalte + 1).Insert
On Error Resume Next
With Range(Cells(3, lngLetzteSpalte + 1), Cells(lngLetzteRow, lngLetzteSpalte + 1))
.FormulaR1C1 = "=IF(SUM(RC[" & -lngLetzteSpalte + 1 & "]:RC[-1])>0,Row(),True)"
.Formula = .Value
.SpecialCells(xlCellTypeConstants, 4).EntireRow.Delete
End With
On Error GoTo 0
Columns(lngLetzteSpalte + 1).Delete
End Sub


Gruß
Chris

Anzeige
AW: Zeilen nach Kriterum löschen
Immanuel
Es funktioniert!! Vielen Dank. Ich hatte vorher bei der Anwendung noch einen Fehler gemacht.
Noch eine kleine Frage:

AW: Welche Frage? o.w.T.
25.02.2008 14:09:15
Chris
.

AW: Zeilen nach Kriterum löschen
Immanuel
Hallo Chris
Dein Makro funktioniert super. Ich sollte es nun aber noch erweitern auf die anderen Tabellenblätter.
Wie muss ich da vorgehen?
Ich wollte einfach sheets("Name").active machen, aber das funktioniert nur bei einem. Ich kann es nicht auf mehrere erweitern. Fehler wegen dem End with...
Vielen Dank

AW: Zeilen nach Kriterum löschen
25.02.2008 14:40:16
Chris
Servus Immanuel,
so für alle Sheets:

Sub Löschen()
Dim lngLetzteRow As Long, lngLetzteSpalte As Long
Dim lngSheet As Long
Dim iLauf As Integer
lngSheet = ThisWorkbook.Sheets.Count
For iLauf = 1 To lngSheet
With Sheets(iLauf)
lngLetzteRow = .Cells.Find(what:="*", SearchOrder:=xlByRows, SearchDirection:=xlPrevious).Row
lngLetzteSpalte = .Cells.Find(what:="*", SearchOrder:=xlByColumns, SearchDirection:=xlPrevious). _
Column
.Columns(lngLetzteSpalte + 1).Insert
On Error Resume Next
With .Range(.Cells(3, lngLetzteSpalte + 1), .Cells(lngLetzteRow, lngLetzteSpalte + 1))
.FormulaR1C1 = "=IF(SUM(RC[" & -lngLetzteSpalte + 1 & "]:RC[-1])>0,Row(),True)"
.Formula = .Value
.SpecialCells(xlCellTypeConstants, 4).EntireRow.Delete
End With
On Error GoTo 0
.Columns(lngLetzteSpalte + 1).Delete
End With
Next iLauf
End Sub


Grüße aus Bayern
Chris

Anzeige
AW: Zeilen nach Kriterum löschen
Immanuel
Vielen Dank. Es funktioniert.
Leider macht das Makro noch einen Fehler:
Es löscht mir die Letzte Zeile nicht! und zwar aus dem Grund, dass rechts in dieser Zeile in ein paar Spalten eine 1 steht, aber in Spalte A steht trotzdem ein *.. weisst du warum das sein könnte?
Bin daran den Code zu studieren, aber er ist mir ein bisschen zu kompliziert um selber darauf zu kommen.
Wäre super wenn du mir noch helfen könntest, denn dieses 1 lässt sich nicht so leicht eliminieren.
Vielen Dank

AW: Zeilen nach Kriterum löschen
25.02.2008 16:34:00
Chris
Servus Immanuel,
ich erklär dir mal kurz, was da passiert (Anmerkungen in Makro1[Original]):

Sub Löschen()
Dim lngLetzteRow As Long, lngLetzteSpalte As Long
Dim lngSheet As Long
Dim iLauf As Integer
lngSheet = ThisWorkbook.Sheets.Count ' Sheets zählen
For iLauf = 1 To lngSheet 'Schleife, um Makro in jedem Sheet auszuführen
With Sheets(iLauf) ' mit dem aktuellen SHeet
lngLetzteRow = .Cells.Find(what:="*", SearchOrder:=xlByRows, SearchDirection:=xlPrevious).Row '  _
letzte beschriebene Zeile finden  (auch Formeln mit "")
lngLetzteSpalte = .Cells.Find(what:="*", SearchOrder:=xlByColumns, SearchDirection:=xlPrevious). _
_
Column ' letzte beschriebene Spalte finden (auch Formeln mit "")
.Columns(lngLetzteSpalte + 1).Insert ' Einfügen einer Berechnungsspalte (hier kommen die  _
Formeln rein)
On Error Resume Next ' falls Fehler nächstes ausführen
With .Range(.Cells(3, lngLetzteSpalte + 1), .Cells(lngLetzteRow, lngLetzteSpalte + 1)) 'In  _
Berechnungsspalte
.FormulaR1C1 = "=IF(SUM(RC[" & -lngLetzteSpalte + 1 & "]:RC[-1])>0,Row(),True)" '  _
Summenformel einfügen (Wenn die Summe über die Zeile > 0 ist, dann, Zeilennummer, sonst TRUE,das True brauchen wir für die SpecialCells)
.Formula = .Value ' aus der Formel einen Wert machen
.SpecialCells(xlCellTypeConstants, 4).EntireRow.Delete ' Zeilen mit True in  _
Berechnungsspalte löschen
End With
On Error GoTo 0 ' falls Fehler zurücksetzen
.Columns(lngLetzteSpalte + 1).Delete ' Berechnungsspalte löschen
End With
Next iLauf
End Sub


so hier geht es um Schnelligkeit, deswegen auch keine Schleife über die einzelnen Zeilen. Wenn du aber jetzt in der letzten Zeile eine Zahl stehen hast, ist ja logischerweise die Summe > 0 und somit wird die zeile nicht gelöscht.
Der Ausdruck "*" steht nicht für den Stern, sondern als Lückenhalter für Text bzw. Zahlen. Wenn du die letzte Zeile auch noch löschen willst, dann solltest du sie mit X in Zelle A kennzeichenen statt mit * und folgendes in das Makro einfügen.
If .Range("A" & lngLetzteRow) = "X" Then
.Range("A" & lngLetzteRow).EntireRow.Delete
End if
Das sähe dann so aus:


Sub Löschen()
Dim lngLetzteRow As Long, lngLetzteSpalte As Long
Dim lngSheet As Long
Dim iLauf As Integer
lngSheet = ThisWorkbook.Sheets.Count
For iLauf = 1 To lngSheet
With Sheets(iLauf)
lngLetzteRow = .Cells.Find(what:="*", SearchOrder:=xlByRows, SearchDirection:=xlPrevious).Row
lngLetzteSpalte = .Cells.Find(what:="*", SearchOrder:=xlByColumns, SearchDirection:=xlPrevious). _
_
Column
.Columns(lngLetzteSpalte + 1).Insert
On Error Resume Next
With .Range(.Cells(3, lngLetzteSpalte + 1), .Cells(lngLetzteRow, lngLetzteSpalte + 1))
.FormulaR1C1 = "=IF(SUM(RC[" & -lngLetzteSpalte + 1 & "]:RC[-1])>0,Row(),True)"
.Formula = .Value
.SpecialCells(xlCellTypeConstants, 4).EntireRow.Delete
End With
On Error GoTo 0
.Columns(lngLetzteSpalte + 1).Delete
lngLetzteRow = .Cells.Find(what:="*", SearchOrder:=xlByRows, SearchDirection:=xlPrevious).Row '  _
Neuzuweisung, da ja schon gelöschte Zeilen
If .Range("A" & lngLetzteRow) = "X" Then
.Range("A" & lngLetzteRow).EntireRow.Delete
End if
End With
Next iLauf
End Sub


Gruß
Chris

Anzeige
AW: Zeilen nach Kriterum löschen
Immanuel
Super!!!! Es funktioniert! Da ich das Makro nicht in allen Sheets laufen lassen kann, musste ich noch ein bisschen reparieren, aber schlussendlich funktioniert alles.
Vielen Dank.
Bist du Profi? Kennst du ein gutes Buch oder wie kann ich ein bisschen mehr VB lernen?
Noch einmal Vielen Dank
Gruss
Immanuel

AW: Nö, kein Profi...
25.02.2008 17:43:27
Chris
... nur Hobbyprogger.
Ich selbst habe nie ein Buch besessen. Learning by Doing. hier im Forum kann man z.B. ziemlich viel lernen.
Hier mal ein Link zu Infos:
http://www.excel-center.de/excel/handbuch.htm
Gruß
Chris

Anzeige
AW: Nö, kein Profi...
25.02.2008 23:13:20
Daniel
Hi Chris
hurra, endlich ein Mitstreiter für die Kunst des Schleifenarmen (manchmal machts ja durchaus Sinn) Programmierens
allerdings hast du noch das Sortieren vergessen:

With .Range(.Cells(3, lngLetzteSpalte + 1), .Cells(lngLetzteRow, lngLetzteSpalte + 1))
.FormulaR1C1 = "=IF(SUM(RC[" & -lngLetzteSpalte + 1 & "]:RC[-1])>0,Row(),True)"
.Formula = .Value
 .entirerow.sort Key1:=.Cells(1,1), Order1:=xlAscending, Header:=xlno 
.SpecialCells(xlCellTypeConstants, 4).EntireRow.Delete
End With


Erst durch das Sortieren entsteht der enorme Geschwindigkeitsvorteil, wenn ALLE zu löschenden Zeilen als geschlossener Block zusammenstehen, so daß Excel nur eine Löschoperation durchführen muss.
Wird nicht sortiert und es besteht eine ungünstige Konstellation (bspw jede 2. Zeile muss gelöscht werden), dann ist diese Variante sogar langsamer als die normale Schleife !!
Gruß, Daniel

Anzeige
AW: Zeilen nach Kriterum löschen
25.02.2008 12:11:16
mpb
Hallo Michael,
wenn ich es richtig versehe, löscht Du Zeilen, in denen mindestens ein Wert ab Spalte C größer Null ist. Wie auch immer: Da Du die Zeilen nicht rückwärts durchläufst, werden möglicherweise nicht alle betroffenen Zeilen gelöscht, nämlich dann wenn 2 aufeinanderfolgen. Grund: die Zeilen unterhalb der gelöschten rutschen um eins nach oben, so dass der Schleifenindex um eins vermindert werden müsste.
Gruß
Martin

AW: Zeilen nach Kriterum löschen
Immanuel
Vielen Dank. Ich glaube ich habe mich nicht ganz klar ausgedrückt, resp. habe nun eine einfachere Idee:
Ich habe die Zeilen die ich löschen muss in Spalte A mit einem * als Ergebnis programmiert. Nun sollte ich also ein Makro haben, dass mir diejenigen Zeilen löscht, welche in Spalte A ein * haben.
Könnt ihr mir da noch einmal helfen?
Noch eine kleine Anmerkung: da es ziemlich grosse Daten sind, sollte das berechnen schnell gehen.. gibt es tipps dazu?
Vielen Dank

Anzeige
AW: Zeilen nach Kriterum löschen
25.02.2008 12:43:05
mpb
Hallo Immanuel,
nimm statt dem * besser ein X, da * auch als Wildcard benutzt wird.

Sub Zeilen_loeschen2()
Application.ScreenUpdating = False
z = Range("A65356").End(xlUp).row
For j = z To 4 Step -1
If Cells(j, 1) = "x" Then
Rows(j).Delete
End If
Next j
Application.ScreenUpdating = True
End Sub


Noch einfacher wäre das ganze, wenn die Zellen in Spalte A für die zu löschenden Zeilen leer wären (auch keine Formeln enthielten) und in den anderen Zellen in Spalte A irgendetwas stünde. Dann könntest Du alle Zeilen manuell auf einen Schlag lösche, und zwar
Spalte A markieren
BEARBEITEN - GEHE ZU - INHALT - Leerzellen
BEARBEITEN - ZELLEN LÖSCHREN - Ganze Zeile
Gruß
Martin

Anzeige
AW: Zeilen nach Kriterum löschen
25.02.2008 12:36:00
Erich
Hallo Immanuel,
probier mal

Sub test2()
Dim lngR As Long, lngC As Long, cc As Long
lngR = Range("A1").SpecialCells(xlLastCell).Row
For lngR = Range("A1").SpecialCells(xlLastCell).Row To 3 Step -1
lngC = Cells(lngR, Columns.Count).End(xlToLeft).Column
For cc = 2 To lngC
If IsNumeric(Cells(lngR, lngC)) Then Exit For
Next cc
If cc > lngC Then Rows(lngR).Delete
Next lngR
End Sub

Rückmeldung wäre nett! - Grüße von Erich aus Kamp-Lintfort

AW: Zeilen nach Kriterum löschen
Immanuel
Hallo Erich
Leider hat dein Makro mein Excel nun schon zum 2. mal blockiert.. ich weiss auch nicht warum!
Habe aber ein funktionierendes Makro erhalten von Chris.
Vielen Dank trotzdem!!
Gruss
Immanuel

Anzeige
AW: Zeilen nach Kriterum löschen
25.02.2008 15:49:50
Erich
Hallo
bei Chris' Lösung stört mich etwas die positive Summe als Kriterium.
Kommen keine negativen Zahlen vor?
Was, wenn in eine4r Zeile -3 steht, oder in drei Zellen 2, 3 und -5?
Hier ein neuer Versuch:

Sub test2()
Dim lngR As Long, lngC As Long, cc As Long, rngD As Range
For lngR = 3 To Range("A1").SpecialCells(xlLastCell).Row
lngC = Cells(lngR, Columns.Count).End(xlToLeft).Column
For cc = 2 To lngC
If Not IsEmpty(Cells(lngR, cc)) And IsNumeric(Cells(lngR, cc)) Then Exit For
Next cc
If cc > lngC Then
If rngD Is Nothing Then
Set rngD = Cells(lngR, 1)
MsgBox rngD.Address
Else
Set rngD = Union(rngD, Cells(lngR, 1))
MsgBox rngD.Address
End If
End If
Next lngR
rngD.EntireRow.Delete
End Sub

Rückmeldung wäre nett! - Grüße von Erich aus Kamp-Lintfort

AW: Zeilen nach Kriterum löschen
Immanuel
Hallo Erich
Nun es kommen keine negativen Zahlen vor, da es sich um Renditen handelt. Aber trotzdem wird bei der Version von Chris die letzte Zeile nicht gelöscht.
Bei deiner Version kommt bei mir der Fehler:
rngD.EntireRow.Delete
Danke

AW: Zeilen nach Kriterum löschen
25.02.2008 17:02:00
Erich
Hallo Immanuel,
vermutlich tritt der Fehler auf, wenn keine zu löschende Zeile gefunden wurde.
Den Fehler kannst du vermeiden mit
If Not rngD Is Nothing Then rngD.EntireRow.Delete
statt
rngD.EntireRow.Delete
Rückmeldung wäre nett! - Grüße von Erich aus Kamp-Lintfort

AW: @Erich
25.02.2008 16:46:01
Chris
Servus Erich,
da hast du schon recht. Rein theoretisch könnte die Summe natürlich auch negativ sein, aber das kann man ja durch ein <> 0 statt eines ~f~> 0 leicht umgehen.
Meine Lösung ist ja auch nicht so ganz ohne Tücken.
Wenns nicht so viele Zeilen sind, dann sind ja eigentlich Schleifenlösungen auch besser, aber wenn so richtig viel wird, dann dauert das so lang.
Gruß
Chris

AW: Zeilen nach Kriterum löschen
Immanuel
Hallo Erich
Ich habe zwar jetzt eine Version die funktioniert (von Chris), wollte aber deine auch noch probieren.
Nun:
Ich musste für jede Zeile eine MsgBox klicken und leider bliebe die letzte Zeile doch bestehen.
Leider kann ich dir nicht mehr sagen, da ich den Code auch nicht verstehe! (Bin wohl doch viel grösserer Anfänger als ich dachte : -)
Falls du noch änderungen vornimmst, so werde ich sie gerne noch einmal testen, aber wohl erst in einer Woche, da ich jeweils nur montags hier Arbeite.
Vielen Dank auch an dich
Gruss
Immanuel

AW: Zeilen nach Kriterum löschen
25.02.2008 18:49:00
Erich
Hallo
hier eine (hoffentlich endlich lauffähige) Version, ohne MsgBoxen,
dafür über (fast) alle Blätter:

Sub test3()
Dim wks As Worksheet, lngR As Long, lngC As Long, cc As Long, rngD As Range
For Each wks In ThisWorkbook.Worksheets
With wks
If .Name  "abc" Then ' wenn Blatt 'abc' nicht bearbeitet werden soll
For lngR = 3 To .Range("A1").SpecialCells(xlLastCell).Row
lngC = .Cells(lngR, .Columns.Count).End(xlToLeft).Column
For cc = 2 To lngC
If Not IsEmpty(.Cells(lngR, cc)) And IsNumeric(.Cells(lngR, cc)) _
Then Exit For
Next cc
If cc > lngC Then
If rngD Is Nothing Then
Set rngD = .Cells(lngR, 1)
Else
Set rngD = Union(rngD, .Cells(lngR, 1))
End If
End If
Next lngR
If Not rngD Is Nothing Then
rngD.EntireRow.Delete
Set rngD = Nothing
End If
End If
End With
Next wks
End Sub

Sorry für meine Fehler bisher!
Rückmeldung wäre nett! - Grüße von Erich aus Kamp-Lintfort

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige