106543
Goto Top

VBA - Sämtliche Leerzeilen in Tabelle löschen

Hallo,

ich hab mal wieder ein kleineres Problem, bei dem meine Syntax anscheinend irgendwie nicht funktioniert wie ich mir das denke -.-
Mal seh´n, was ihr hier beitragen könnt/wollt :D
Ich habe eine Tabelle in der Leerzeilen vorhanden sind, z.B.
                   A                             B                           C
1)     Hier steht etwas Text     Hier steht eine Zahl      Hier steht ein Datum
2)     Hier steht etwas Text     Hier steht eine Zahl      Hier steht ein Datum
3)
4)     Hier steht etwas Text     Hier steht eine Zahl      Hier steht ein Datum
5)
6)
7)     Hier steht etwas Text     Hier steht eine Zahl      Hier steht ein Datum
8)
9)     Hier steht etwas Text     Hier steht eine Zahl      Hier steht ein Datum
10)     Hier steht etwas Text     Hier steht eine Zahl      Hier steht ein Datum
um das mal stümperhaft abzubilden.
was ich mir jetzt dachte, war, dass ich alle Zeile von 1000 aufwärts abgehe, gucke ob in der Zelle A/entsprechende Zahl ein Wert steht, wenn nicht soll die Zeile gelöscht werden
das ist was ich zustande gebracht habe...
Dim sLetzte As String
sLetzte = Range("A" & Range("A65536").End(xlUp).Column)  
For i = 1000 To 2 Step -1
    If ActiveWorkbook.ActiveSheet.Cells(i, sLetzte).Value = "" Then  
        Rows(i).EntireRow.Delete
    End If
Next
ich blicke bei dem Code nicht mehr durch :D
vielleicht hat ja jemand von euch ein kleines Schnipselchen für mich, was schnell mal läuft...

Grüße
Exze

Content-Key: 224146

Url: https://administrator.de/contentid/224146

Printed on: April 16, 2024 at 17:04 o'clock

Member: colinardo
Solution colinardo Dec 10, 2013 updated at 10:55:53 (UTC)
Goto Top
Hallo Exce,
das Problem was du hast ist folgendes: Bei jedem Durchlauf der Schleife löschst du eine Zeile aus dem Workbook, d.h. nach jedem Durchlauf stimmt die Zeilennummer nicht mehr da du ja gerade eine Zeile gelöscht hast.
Du machst es nun folgendermaßen: Du iterierst über die Zellen und fügst sie zu einer MultiSelection hinzu, und erst nach dem Durchlauf aller Zellen löschst du die Multi-Selection.
Sub delEmptyRows()
    Dim rngCells As Range, cell As Range, rngCombined As Range, sheet as Worksheet
    ' Hier das gewünschte Tabellenblatt angeben  
    set sheet = Worksheets(1)
    Set rngCells = sheet.Range("A1", sheet.Range("A65535").End(xlUp))  
    For Each cell In rngCells
        If cell.Value = "" Then  
            If rngCombined Is Nothing Then
                Set rngCombined = cell.EntireRow
            End If
            Set rngCombined = Union(rngCombined, cell.EntireRow)
        End If
    Next
    If Not rngCombined Is Nothing Then
        rngCombined.Delete
    End If
End Sub

Grüße Uwe
Mitglied: 106543
106543 Dec 10, 2013 at 10:34:16 (UTC)
Goto Top
Hi Uwe,

danke für deine Hilfe. Funktioniert natürlich alles wie es soll :D
daran zu denken, dass ich die Zeilen erst am Ende lösche, hab ich leider nicht gedacht face-confused und genau da war ich auch vorhin gehangen.

Vielen Dank und Grüße
Exze
Member: colinardo
Solution colinardo Dec 10, 2013 updated at 10:40:09 (UTC)
Goto Top
-edit- hab grad noch einen Check für den Fall das keine Leerzeilen vorhanden sind hinzugefügt...
Grüße Uwe
Mitglied: 106543
106543 Dec 10, 2013 at 10:43:40 (UTC)
Goto Top
Noch eine kurze Frage:
Der Code wird immer fur das aktive Workbook bzw. das aktive Worksheet ausgeführt oder ?

Grüße
Exze
Member: colinardo
Solution colinardo Dec 10, 2013 updated at 11:00:29 (UTC)
Goto Top
Zitat von @106543:

Noch eine kurze Frage:
Der Code wird immer fur das aktive Workbook bzw. das aktive Worksheet ausgeführt oder ?
Ja, obiger Code läuft nur im Code eines Tabellenblattes, wenn das nicht gewünscht ist lässt es sich aber einfach anpassen, hierzu passt du in folgendem Code einfach das Sheet in Zeile 3 an, in Zeile 4 werden dann die Ranges entsprechend referenziert, und der Code läuft dann auch in anderen Modulen.
Sub delEmptyRows()
    Dim rngCells As Range, cell As Range, rngCombined As Range, sheet as Worksheet
    set sheet = Worksheets(1)
    Set rngCells = sheet.Range("A1", sheet.Range("A65535").End(xlUp))  
    For Each cell In rngCells
        If cell.Value = "" Then  
            If rngCombined Is Nothing Then
                Set rngCombined = cell.EntireRow
            End If
            Set rngCombined = Union(rngCombined, cell.EntireRow)
        End If
    Next
    If Not rngCombined Is Nothing Then
        rngCombined.Delete
    End If
End Sub
p.s. werde den Code oben ergänzen.
Mitglied: 106543
106543 Dec 10, 2013 at 11:00:24 (UTC)
Goto Top
Jo danke, aber dann passt die einfache Variante face-smile ich aktiviere dann nacheinander die 3 Workbooks und lasse deinen Code dann drüber laufen.

Nochmal danke und Grüße
Exze