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

Zeilen löschen

Zeilen löschen
17.09.2007 15:51:00
Matze
Hallo!
Komme einfach nicht weiter! Ab Zeile 26 soll das Makro checken, ob in der Zeile im Bereich (L bis BT) 0-Werte in der Zeile sind. Ist dies der Fall wird die Zeile gelöscht und die beiden Folgenden auch. Dann wird weiter geprüft. Leider habe ich quasi eine Endlosschleife, da irgendwann ja nur noch leere Zeilen kommen.
Die letzte Zeile lasse ich verringern um 3, wenn ein Datensatz gelöscht wurde. Nur irgendwie muss ich ja noch definieren wann Ende ist und er weitermacht mit dem speichern. Begreife ich nicht. Habt ihr 'ne Idee?
DANKE!

Sub Wertkopie2()
Dim i As Long, lastRow As Long
Dim saveName As String
ActiveSheet.Copy
With ActiveSheet
.Unprotect ("XX")
.Cells.Select
With Selection
.Copy
.PasteSpecial Paste:=xlPasteValues
End With
Application.CutCopyMode = False
.Cells(1, 1).Select
End With
lastRow = ActiveSheet.Range("L" & Rows.Count).End(xlUp).Row
For i = 26 To lastRow Step 1
If Application.WorksheetFunction.Sum(Range("L" & i & ":BT" & i)) = 0 Then
Rows(i).Delete
Rows(i).Delete
Rows(i).Delete
i = i - 1
lastRow = lastRow - 3
End If
Next i
saveName = Application.GetSaveAsFilename(fileFilter:="EXCEL Files (*.xls), *.xls")
Debug.Print saveName
If StrPtr(saveName)  0 Then
ActiveWorkbook.SaveAs saveName
Else
MsgBox "Datei wird nicht gespeichert"
End If
End Sub


7
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Zeilen löschen
17.09.2007 15:56:00
Rudi
Hallo,
immer von unten löschen.

For i = lastRow To 26 Step -1
If Application.WorksheetFunction.Sum(Range("L" & i & ":BT" & i)) = 0 Then
Range(Rows(i), Rows(i + 2)).Delete
End If
Next i


Gruß
Rudi
Eine Kuh macht Muh, viele Kühe machen Mühe

AW: Zeilen löschen
17.09.2007 16:01:49
Matze
Ich habe jetzt den alten Part von For bis Next i raus und deinen rein. Dann bleibt am Ende nur eine Zeile übrig - alle anderen sind gelöscht.

AW: Zeilen löschen
17.09.2007 16:40:23
Rudi
Hallo,
jepp, die folgezeilen muss man in der Schleife überspringen:
For i = (lastRow-2) To 26 Step -3
If Application.WorksheetFunction.Sum(Range("L" & i & ":BT" & i)) = 0 Then
Range(Rows(i), Rows(i + 2)).Delete
End If
Next i
Gruß
Rudi
Eine Kuh macht Muh, viele Kühe machen Mühe

Anzeige
AW: Zeilen löschen
17.09.2007 16:09:05
frigo
Hallo Matze,
beim Initialisieren der For-next Schleife bestimmt Deine LastRow den Ziel-Wert.
Wenn Du die Variable LastRow innerhalb der Schleife änderst, hat dies keinen Einfluss mehr.
Benutze entweder innerhalb der Schleife eine If-abfrage:
If i = lastrow then exit for
oder wesentlich sauber die do...loop until -funktion
Gruß, frigo

AW: Zeilen löschen
17.09.2007 16:12:04
Matze
Ok... das Letzte sagt mir nun gar nichts. Bin ja blutjunger Anfänger. Habe mühsam mit Hilfe hier und einem Kollegen überhaupt dies zusammengebaut.

AW: Zeilen löschen
17.09.2007 16:30:00
frigo
Es gibt verschiedene Arten von Schleifen:
- Zählschleife for...next
- "Solange wie ... mach" Do While ... loop (Solange die Bedingung erfüllt ist (evtl. überhaupt nicht))
- "mach ... bis" Do ... Loop until (läuft solange bis die Endbedingung stimmt (im Gegensatz zu Do While mindestens 1 Durchlauf).
D.h. bei Dir:
i = 25 'hier 1 weniger als deine startzeile, da in der schleife hochgezählt wird
DO
i = i + 1
If Application.WorksheetFunction.Sum(Range("L" & i & ":BT" & i)) = 0 Then
Rows(i).Delete
Rows(i).Delete
Rows(i).Delete
i = i - 1
lastRow = lastRow - 3
End if
LOOP UNTIL i >= lastRow
nicht getestet, aber sollte funktionieren!
frigo

Anzeige
AW: Zeilen löschen ohne Schleife
17.09.2007 21:09:00
Daniel
Hi Matze
besser als löschen mit Schleife ist löschen OHNE Schleife, einfach weils weniger kompliziert und meistens auch viel schneller ist.
Prinzip dahinte ist, daß man ne Formel entwickelt, die als Ergebnis für alle Zeilen, die gelöscht werden sollen den Wert WAHR hat, und für Zeilen die nicht gelöscht werden sollen, irgend was anderes (ich bevorzuge die Zeilen-Nummer)
Excel hat nämlich die möglichkeit, geziehlt alle Zellen mit einem Wahrheitswert zu selektieren, so daß du auf diese Weise alle Zellen auf einmal löschen kannst (die Funktion findest du unter BEARBEITEN - GEHE ZU - INHALTE)
Ersetze also deine Lösch-Schleife

For i = 26 To lastRow Step 1
If Application.WorksheetFunction.Sum(Range("L" & i & ":BT" & i)) = 0 Then
Rows(i).Delete
Rows(i).Delete
Rows(i).Delete
i = i - 1
lastRow = lastRow - 3
End If
Next i


durch diesen Code:


Columns(1).Insert
With Range("A26:A" & lastrow)
.FormulaR1C1 = "=IF(OR(SUM(R[-2]C[12]:R[-2]C[72])=0,SUM(R[-1]C[12]:R[-1]C[72])=0,SUM(RC[ _
12]:RC[72])=0),TRUE,ROW())"
.Cells(2, 1).FormulaR1C1 = "=IF(OR(SUM(R[-1]C[12]:R[-1]C[72])=0,SUM(RC[12]:RC[72])=0), _
TRUE,ROW())"
.Cells(1, 1).FormulaR1C1 = "=IF(SUM(RC[12]:RC[72])=0,TRUE,ROW())"
.Formula = .Value
.EntireRow.Sort key1:=Range("A26"), order1:=xlAscending, header:=xlNo
.SpecialCells(xlCellTypeConstants, 4).EntireRow.Delete
End With
Columns(1).Delete


Gruß, Daniel

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige