In Exceltabelle leere Zeilen per Makro löschen

Hallo zusammen,

eine Reihe gleichartig aufgebauter Exceltabellen enthält unterschiedlich viele Eintragungen. Es bleiben daher unterschiedlich viele Zeilen komplett leer und sollen per Makro gelöscht werden.
Ich hab’s mit einer For-Next-Schleife versucht, die abfragt, ob in Zelle A/zeilennummer etwas drinsteht oder nicht. Wenn A/zeilennummer leer ist, soll die entsprechende Zeile gelöscht werden.

Klingt simpel, aber ich muss irgendetwas nicht richtig gemacht haben. Weiß mir jemand diese kleine Routine?

Vielen Dank
Ludwig

Hallo Ludwig,

Klingt simpel, aber ich muss irgendetwas nicht richtig gemacht
haben.

sehe ich genauso :smile:

Weiß mir jemand diese kleine Routine?

Mal schauen, zeige bitte den Code, vllt. brauchst du nur einen kleinen Hilfstipp.
Z,B. daß man beim Zeilenlöschen von unten nach oben vorgeht. O.ä.

Gruß
Reinhard

Hallo Reinhard,

wieder einmal mehr hoff(t)e ich auf deine Hilfe.
Mein Makroversuch sieht so aus:

+++++++++++++++++++++++++++++++++++++

Sub Makro1()

’ Makro1 Makro

Dim zn As Integer 'zn für „Zeilennummer“
For zn = 1500 To 1 Step -1
If azn = „“ Then
Rows(„zn:zn“).Select [in dieser Zeile meldet VBA einen Fehler]
Selection.Delete Shift:=xlUp
End If
Next zn

End Sub

+++++++++++++++++++++++++++++

Ich hoffe sehr, du kannst mir helfen.

Übrigens zur Erklärung: Einsichtig, aber mit Schmerzen hab ich mich die Tage von XP getrennt und bin auf 8.1 umgestiegen. Eine der Folgen ist:

a) meine Access-Datenbank mit Adressen geht nicht mehr, weil Access 2003 jetzt nicht mehr läuft.
b) Wäre nicht schlimm. Ich habe meine Daten in Excel 2010 kopiert.
c) Blöd ist, dass Outlook 2010 keine Excel-2010-Dateien einliest. Folge:
d) Ich pflege die Adressdatei unter Excel 2010, bereinige sie um die leeren Zeilen (mein Makroproblem!), und speichere sie dann unter dem Excel-2003-Format ab. Dieses kann dann von Outlook problemlos eingelesen werden.
e) Das Blöde ist, ich sortiere die Daten alphanumerisch in der Masterdatei, und dort werden die leeren Zeilen ganz unten einsortiert - praktisch und nicht störend. Outlook aber setzt die vielen leeren Zeilen oben an, weshalb ich sie jeweils rausschmeißen will. Sonst wirst du beim Scrollen in Outlook zum Hirsch …

Sortieren per Makro geht wunderbar. Datei speichern unter per Makro auch.
Somit fehlt mir noch das Modul, weswegen ich um Hilfe bitte. Dann ist’s perfekt.

Dankeschön und Gruß
Ludwig

Hallo Reinhard,

Hallo Ludwig,

wieder einmal mehr hoff(t)e ich auf deine Hilfe.

Ich versuche mal, dir statt Reinhard eine Antwort zu geben:

+++++++++++++++++++++++++++++++++++++

Sub Makro1()

’ Makro1 Makro

Dim zn As Integer 'zn für „Zeilennummer“
For zn = 1500 To 1 Step -1
If azn = „“ Then

Hier meinst du wohl eine Abfrage ob die Zelle in Spalte A, Zeile zn leer ist.
Was du hier aber abfragst, ist eine Varialbe azn. Die ist noch garnicht belegt.
Die Abfrage müsste heißen:
If IsEmpty(Range(„A“ & zn))

Rows(„zn:zn“).Select [in dieser Zeile meldet VBA einen Fehler]

Ja, der Fehler kommt, weil es die Zeile zn nicht gibt. zn ist eine Variable, die einen Wert enthält. Wenn du diesen Wert benutzten willst geht das so:
Rows(zn).Select

Selection.Delete Shift:=xlUp

Die vorigen beiden Codezeilen kann man zusammenfassen (Select ist in 99% der Fälle unnötig):
Rows(zn).Delete Shift:=xlUp

End If
Next zn

End Sub

+++++++++++++++++++++++++++++

Ich hoffe sehr, du kannst mir helfen.

Ich hoffe sehr, ich konnte dir helfen.

Übrigens zur Erklärung: Einsichtig, aber mit Schmerzen hab ich
mich die Tage von XP getrennt und bin auf 8.1 umgestiegen.
Eine der Folgen ist:

Dankeschön und Gruß
Ludwig

Bitteschön und Gruß,
Andreas

Hallo Andreas,

herzlichen Dank für deine Hilfe, die mir natürlich ebenso willkommen ist.
Es funktioniert jetzt beinahe, nur werden auch Zeilen gelöscht, die stehen bleiben sollen.
Vermutlich habe ich Teile meiner „Baustelle“ ungewollt mit Teilen deines Vorschlags kombiniert.

Zum Testen habe ich eine eigene Exceldatei angelegt. Darin läuft folgendes dreiteilige Makro. Ich füge es nachstehend ein. Es ist denke ich ausreichend dokumentiert. „Unser“ Problem liegt im dritten, untersten und zugleich kleinsten Makro.

Ich bin mir sicher, dass du erkennst, woran es liegt.
Übrigens: wenn ich das darin enthaltene END IF aktiviere, erhalte ich eine Fehlermeldung.

Nochmals herzlichen Dank für jede Hilfe,
Ludwig

Und jetzt mein Makroentwurf:
**************************************************************
Sub Makro1()

’ Makro1 Makro

'Vorbereiten für Test (Teil 1)
'alles löschen; Farbe entfernen

Columns(„A:B“).Select
Selection.ClearContents
With Selection.Interior
.Pattern = xlNone
.TintAndShade = 0
.PatternTintAndShade = 0
End With
Range(„A1“).Select

'Vorbereiten für Test (Teil 2)
'in Spalte A Reihe (Spalte) ausfüllen von 1 bis 30
'dann einige Leerzeilen dazwischenschieben und diese gelb markieren

Range(„A1“).Select
ActiveCell.FormulaR1C1 = „1“
Selection.DataSeries Rowcol:=xlColumns, Type:=xlLinear, Date:=xlDay, _
Step:=1, stop:=30, Trend:=False
Range(„A6,A12,A18,A24“).Select
Range(„A24“).Activate
Selection.EntireRow.Insert , CopyOrigin:=xlFormatFromLeftOrAbove
Range(„A6,A13,A20“).Select
Range(„A20“).Activate
ActiveWindow.SmallScroll Down:=9
Range(„A6,A13,A20,A27“).Select
Range(„A27“).Activate
With Selection.Interior
.Pattern = xlSolid
.PatternColorIndex = xlAutomatic
.Color = 65535
.TintAndShade = 0
.PatternTintAndShade = 0
End With
ActiveWindow.SmallScroll Down:=-21
Range(„A1“).Select

'Wichtigstes Makro-Teil:

'Leerzeilen löschen
Dim zn As Integer
'zn für „Zeilennummer“
For zn = 40 To 1 Step -1
If IsEmpty(Range(„A“ & zn)) Then Rows(zn).Select
Selection.Delete Shift:=xlUp
'End If
Next zn

End Sub

Hallo Andreas,

Hallo Ludwig,

.

Ich bin mir sicher, dass du erkennst, woran es liegt.
Übrigens: wenn ich das darin enthaltene END IF aktiviere,
erhalte ich eine Fehlermeldung.

Und jetzt mein Makroentwurf:
**************************************************************

'Wichtigstes Makro-Teil:

'Leerzeilen löschen
Dim zn As Integer
'zn für „Zeilennummer“
For zn = 40 To 1 Step -1
If IsEmpty(Range(„A“ & zn)) Then Rows(zn).Select

Hier liegt dein Fehler: Die If-Abfrage ist beendet, weil du hinter dem Then eine Anweisung stehen hast.

Selection.Delete Shift:=xlUp

Da die If-Abfrage fertig war, wird die Delete-Anweisung in jedem Fall ausgeführt.

'End If

Da die If-Abfrage schon fertig war, entsteht ein Fehler, wenn du End If hier aktiverst.

Next zn

End Sub

Wenn du also auf das Select bestehst (ich sagte ja schon, es ist unnötig), dann mach es so:

Dim zn As Integer
'zn für "Zeilennummer"
For zn = 40 To 1 Step -1
If IsEmpty(Range("A" & zn)) Then
 Rows(zn).Select
 Selection.Delete Shift:=xlUp
End If
Next zn

Wenn’s ohne Select sein darf:

Dim zn As Integer
'zn für "Zeilennummer"
For zn = 40 To 1 Step -1
 If IsEmpty(Range("A" & zn)) Then Rows(zn).Delete Shift:=xlUp
Next zn

Gruß, Andreas

Hallo Andreas,

genial! Jetzt klappt’s. Vielen Dank.
Ich wollte übrigens auf nichts bestehen, bei mir herrschte „nur“ Mangel an Verständnis.

Schönen Gruß und nochmals danke,

Ludwig

Hallo Ludwig,

Rows(„zn:zn“) ist die falsche Syntax aber es klappt so wie bei
Range(„A“ & zn)
Versuche mal selbst darauf zu kommen, ansonsten steht die Lösung hier gaaaaanz tief unten…

Die Codebefehle in deiner ersten with selection.Interior-Schleife halte ich ungeprüft erstmal für Standardwerte. Müßten also nach .Clear auf Standard stehen.

Nachfolgend mein Codeansatz für deinen Fall.
Hinweis, wenn im Gegensatz zu hier unklar ist OB es leere Zellen gibt so benutze eine Fehlerbehandlung wegen Specialcells, wird keine leere Zelle im bereich gefunden kommt sonst ein Fehler, den mußt du abfangen.

Gruß
Reinhard

Option Explicit 'damit passiert sowas wie mit azn nicht!!!

Sub Makro1()
Dim zn As Long 'zn für "Zeilennummer"
'Vorbereiten für Test (Teil 1)
'alles löschen; Farbe entfernen
Columns("A:B").Clear
'Vorbereiten für Test (Teil 2)
'in Spalte A Reihe (Spalte) ausfüllen von 1 bis 30
'dann einige Leerzeilen dazwischenschieben und diese gelb markieren
Range("A1").Value = 1
Range("A1").DataSeries Rowcol:=xlColumns, Type:=xlLinear, Date:=xlDay, \_
Step:=1, Stop:=30, Trend:=False
Range("A6,A12,A18,A24").EntireRow.Insert ', CopyOrigin:=xlFormatFromLeftOrAbove
Range("A1:A34").SpecialCells(xlCellTypeBlanks).Interior.ColorIndex = 6
'Leerzeilen löschen
'For zn = 40 To 1 Step -1
' If IsEmpty(Range("A" & zn)) Then Rows(zn).Delete Shift:=xlUp
'Next zn
End Sub

Rows(zn & „:“ & zn)

Hi Reinhard,

auch dir nochmals vielen Dank. Wie oben geschrieben: Für dieses Mal ist mein Problem gelöst.

Noch einen schönen Abend und Gruß,

Ludwig