Dieses Forum nutzt Cookies
Dieses Forum verwendet Cookies, um deine Login-Informationen zu speichern, wenn du registriert bist, und deinen letzten Besuch, wenn du es nicht bist. Cookies sind kleine Textdokumente, die auf deinem Computer gespeichert werden. Die von diesem Forum gesetzten Cookies werden nur auf dieser Website verwendet und stellen kein Sicherheitsrisiko dar. Cookies aus diesem Forum speichern auch die spezifischen Themen, die du gelesen hast und wann du zum letzten Mal gelesen hast. Bitte bestätige, ob du diese Cookies akzeptierst oder ablehnst.

Ein Cookie wird in deinem Browser unabhängig von der Wahl gespeichert, um zu verhindern, dass dir diese Frage erneut gestellt wird. Du kannst deine Cookie-Einstellungen jederzeit über den Link in der Fußzeile ändern.

Zeile löschen wenn Spalte leeren Inhalt
#1
Guten Tag zusammen,

ich habe eine Tabelle in der viele Datensätze sind. Ich suche allerdings noch eine Makro welches mir alle zeilen löscht in denen in Spalte A kein Wert steht. Ich habe dazu schon einiges gefunden allerdings funktionieren diese Codes bei mir nicht, da meistens einfach gar nichts passiert. Am besten über die Schaltfläche. 

Code:
Public Sub LeereRaus()

Dim WkSh     As Worksheet
Dim lLetzte  As Long
Dim lZeile   As Long

  Application.ScreenUpdating = False
 
  Set WkSh = Worksheets("Tabelle1")  ' <== den Tabellenblattnamen ggf. anpassen !!!
 
  With WkSh
     lLetzte = WkSh.Cells(Rows.Count, 1).End(xlUp).Row
     For lZeile = lLetzte To 1
        If WkSh.Cells(lZeile, 1).Value = "" Then
           WkSh.Rows(lZeile).Delete Shift:=xlUp
        End If
     Next lZeile
  End With
 
  Application.ScreenUpdating = True

End Sub
Code:
Sub Makro3()
Columns(1).Insert
With Range("A1:A" & Cells(Rows.Count, 2).End(xlUp).Row)
   .Formula = "=IF(RC[1]="""",true,Row())"
   .Formula = .Value
   .CurrentRegion.Sort key1:=Cells(1, 1), Order1:=xlAscending, header:=xlNo
   .SpecialCells(xlCellTypeConstants, 4).EntireRow.Delete
End With
Columns(1).Delete
End Sub
Code:
Sub Zeilen_loeschen()

Dim loeschen As Double
For loeschen = Cells(Rows.Count, 1).End(xlUp).Row To 1 Step -1
If Cells(loeschen, 1).Value = "" Then
Rows(loeschen).Delete
End If
Next loeschen

End Sub


Angehängte Dateien
.xlsm   forum test.xlsm (Größe: 715,04 KB / Downloads: 3)
Antworten Top
#2
Keine Ahnung was du meinst, aber es funktioniert der Code
Code:
Sub Zeilen_loeschen()

Dim loeschen As Double
For loeschen = Cells(Rows.Count, 1).End(xlUp).Row To 1 Step -1
If Cells(loeschen, 1).Value = "" Then
Rows(loeschen).Delete
End If
Next loeschen

End Sub
ebenso tadellos wie
Code:
Sub löschen()
Dim i
For i = Cells(Rows.Count, 20).End(xlUp).Row To 1 Step -1
   On Error Resume Next
  If Cells(i, 1).Value = "x" Then
   Rows(i).Delete
 End If
 Next
End Sub

Der obere Code wird halt in deiner Beispielmappe nichts finden, da in Spalte A keine Zeile leer ist.

PS: On Error Resume Next ist ein schlechter Ratgeber...
Schöne Grüße
Berni
[-] Folgende(r) 1 Nutzer sagt Danke an MisterBurns für diesen Beitrag:
  • elamigo
Antworten Top
#3
Hi Berni danke fürs testen, aber es sind doch ab A16 alle Zellen in A leer oder versteh ich da etwas falsch?
Antworten Top
#4
Ach, da muss auch mal erst einer draufkommen, dass da erst ab Spalte AK wieder Daten drinstehen.
Dann ist klar, warum es nicht funktioniert hat. Wenn du die letzte befüllte Zelle mit
Code:
Cells(Rows.Count, 1).End(xlUp).Row
für Spalte A (= 1) ermittelst, dann ist das für Excel nun mal die Zeile 15. D.h. du musst die Zeile in einer Spalte ermitteln, wo auch tatsächlich Daten drinstehen.
Code:
Cells(Rows.Count, "AK").End(xlUp).Row
alternativ ginge sonst auch
Code:
letztezeile = Sheets(1).Cells.Find(What:="*", SearchOrder:=xlByRows, SearchDirection:=xlPrevious).Row
Dies hat den Vorteil, dass du nicht die Spalte kennen musst, in der auch wirklich Werte drinstehen.



Zuletzt noch der Tipp: Das zeilenweise Löschen gehört für Excel zu den mühsamen Aufgaben. Wenn du auf diese Weise an die Sache rangehst, brauchst du mindestens ein
Code:
Application.ScreenUpdating = False
am Beginn deines Codes (am Codeende wieder auf True setzen!). Damit beschleunigst du den Code schon mal ungemein. Dennoch habe ich in deiner Testdatei auch mit ausgeschaltetem Screenupdating eine Durchlaufzeit von 35 Sekunden gemessen, um alle Zeilen löschen zu lassen. Das ist nicht besonders sexy.

Daher ist bei so vielen Zeilen auf jeden Fall eine andere Methode zu bevorzugen. Benutze den Autofilter (gerne auch mittels VBA) und lösche alle Zeilen auf einmal. Das geht ratzfatz und kostet Excel nicht mal einen Huster.
Schöne Grüße
Berni
[-] Folgende(r) 1 Nutzer sagt Danke an MisterBurns für diesen Beitrag:
  • elamigo
Antworten Top
#5
Hey Berni, 
und wie immer großes Kino von dir danke! Klappt, ja es dauert echt lange. Weiss man wieso Excel so lange brauch? Aber danke für den Hinweis mit dem Autofilter werde ich mal checken.
Antworten Top
#6
Zitat:Weiss man wieso Excel so lange brauch
Nun, weil Excel nach jeder gelöschten Zeile neu berechnen muss, weil sich ja die Bezüge in der kompletten Mappe ändern. Dem kann man noch entgegenwirken, indem man am Anfang des Codes die Berechnung auf manuell stellt und am Ende wieder auf automatisch
Code:
Application.Calculation = xlCalculationManual

'dein Code hier

Application.Calculation = xlCalculationAutomatic
Wieviel Vorteil das bringt, kann ich nicht sagen.

Außerdem sind Schleifen generell ein sehr träger Prozess - überleg mal, wenn du das händisch für jede Zeile machen müsstest, dann wärst du auch einige Zeit beschäftigt. Auch hier würdest du mittels Autofilter auf einmal alle Zeilen löschen und wärst im Handumdrehen fertig.
Schöne Grüße
Berni
[-] Folgende(r) 1 Nutzer sagt Danke an MisterBurns für diesen Beitrag:
  • elamigo
Antworten Top


Gehe zu:


Benutzer, die gerade dieses Thema anschauen: 1 Gast/Gäste