leere Zeilen am Ende der Tabelle löschen funktioniert nicht
#1
Hallo Leute,

ich habe eine Tabelle, die insgesamt 30.000 Zeilen umfasst, wobei aber die letzte benutzte Zeile bei 4700 liegt (soll aber variabel bleiben).
Dadurch ist der Scroll-Balken natürlich elendig lang und die Tabelle langsam.

Ich habe auch schon durch die Foren-Recherche herausgefunden, wie ich per VBA nach der letzten Zeile suche und wie ich Zeilen danach wohl löschen kann.
Hier mein bisheriger Versuch:  Angel

 
Sub leere_zeilen_löschen()
 
    Dim zeil As Integer
    Dim z As Integer
    Dim leerAbWo As Long
 
    Sheets("Rufnummern").Select
   
    'letzte ausgefüllte Zeile
    zeil = ActiveSheet.UsedRange.Rows.Count
 
    For z = 3 To zeil

    If Cells(z, 1) = "" Then
    Range(Cells(z, 1), Cells(zeil, 27)).Delete
   
       
    Exit Sub
    End If
   
    Next z
   
End Sub




Das Makro löscht auch Zeilen aber die Tabelle wird trotzdem nicht kürzer!!??
Ich habe es auch schon mit .clean und .cleancontent versucht. Bringt auch nichts.   Undecided

Ich weiß nicht, wo da in den Zeilen noch versteckte Formate o.ä. sein sollen....

Mit welchem Code kann ich denn Zeilen nun endgültig und so hartnäckig entfernen, dass die Tabelle bis zur letzten benutzten Zeile kürzer wird?     Huh


Viele Grüße in die Runde,
Micha


me.hide
Antworten Top
#2
Hallo,

1. per Schleife, zeilenweise löschen, ist ziemlich langsam

2. wenn du Zeilen/Zellen per Schleife löschen willst, dann muss die Schleife von hinten nach vorne laufen.
Warum:
Annahme: Zelle A3 ist leer und A4 ist leer
mit der Schleife prüfst du Zeile 3 auf leer - trifft zu also wird gelöscht. Durch das Löschen rutschen aber die Folgezeilen nach oben.
Sprich: Die noch nicht geprüfte Zeile 4 rutscht nach oben und wird zu Zeile 3. Die Schleife macht jetzt aber mit Zeile 4 weiter und damit wird
die nach oben gerutschte Zeile "übersprungen" und nicht mehr geprüft und fällt raus.

Deshalb in solchen Fällen die Schleife von hinten nach vorne laufen lassen.

Also nicht: For z = 3 To zeil
sondern: For z = zeil To 3 Step - 1

Aber wie schon gesagt, das ist gähnend langsam.

Besser alles in einem Rutsch löschen.
Wenn die ganze Zeile gelöscht werden soll wenn in Spalte A leer dann:

Code:
Sub Schaltfläche1_Klicken()
Dim loLetzte As Long

'Blattname anpassen
With Worksheets("Tabelle1")
    loLetzte = .Cells(.Rows.Count, "A").End(xlUp).Row
    If WorksheetFunction.CountBlank(.Range(.Cells(3, "A"), .Cells(loLetzte, "A"))) > 0 Then
        .Range(.Cells(3, "A"), .Cells(loLetzte, "A")).SpecialCells(xlCellTypeBlanks).EntireRow.Delete
    End If
End With
End Sub


Gruß Werner
[-] Folgende(r) 1 Nutzer sagt Danke an Werner.M für diesen Beitrag:
  • junjor
Antworten Top
#3
Moin!
Es soll ja alles nach der letzten benutzten Zeile in Spalte A gelöscht werden.
Außerdem wird der Bereich erst nach der nächsten Speicherung verkleinert!
Wenn Spalte A ein Pflichtfeld ist, also gefüllt sein muss, dann einfach so:
Code:
Sub UsedRange_verkleinern()
Range("A:A").SpecialCells(xlCellTypeBlanks).EntireRow.Delete
ThisWorkbook.Save
End Sub

(und ich hoffe mal, dass in A keine Formeln "auf Vorrat" gehalten werden, die einen Leerstring "" ausgeben)

Gruß Ralf
Gib einem Mann einen Fisch und du ernährst ihn für einen Tag. 
Lehre einen Mann zu fischen und du ernährst ihn für sein Leben. (Konfuzius)
[-] Folgende(r) 1 Nutzer sagt Danke an RPP63 für diesen Beitrag:
  • junjor
Antworten Top
#4
Hallo Micha,

wie Werner schon schrieb, muss die Schleife rückwärts, also von unten nach oben, laufen ( For z = zeil To 3 Step - 1 ).
Aber ebenso wichtig ist es, dien Befehl Exit Sub zu entfernen, da ja sonst (nur) die erste gefundene Zeile gelöscht und anschließend das Makro beendet wird.

Gruß Uwe
[-] Folgende(r) 1 Nutzer sagt Danke an Kuwer für diesen Beitrag:
  • junjor
Antworten Top
#5
WOW!   Vielen Dank für eure Antworten, die alle geholfen und meinen Horizont erweitert haben!!

Super Forum!
Antworten Top
#6
@Ralf,

na ja, dann schau dir mal seinen Code an, was er da löschen will.

Oder schreib mal bei deinem Code in die Zelle A2 ne Überschrift rein und in Zelle A3 einen Wert, Zelle A1 bleibt leer. Davon, dass Zeile 1 gelöscht werden soll, war aber nicht die Rede.

Und SpecialCells(xlCelltypeBlanks) ohne Fehlerbehandlung kann gut gehen muss aber nicht.



@Uwe

das Exit Sub hatte ich überhaupt nicht wahrgenommen. War wohl zu sehr auf die falsche Schleifenrichtung fixiert.


Aber darüber zu diskutieren ist wohl jetzt eher müßig. Vom Beitragsersteller wird wohl nichts mehr kommen.
In dem Zusammenhang nerven mich Beitragsersteller, die bei Lösungsvorschlägen nur noch auf den Danke Button klicken können, ohne auch nur ein Wort dazu zu schreiben.
Das ist/wäre nicht meine Art.

Aber vielleicht ist ja inzwischen die Tastatur defekt und es geht nur noch die Maus.

Wobei bei meinem Vorschlag die Maus dann inzwischen wohl auch noch kaputt ist.


Gruß und einen schönen Tag

Werner
Antworten Top


Gehe zu:


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