VBA leere Zeilen löschen und Zeilen verschieben


#1

Hey zusammen. Ich hab ne Aufgabe bekommen, eine PDF-Tabelle in Excel zu konvertieren. Hab dazu nen Konverter benutzt, nur hat dieser wie erwartet es nicht perfekt hinterlassen.

Ich habe dazu bereits einige Formatierungen angepasst und mithilfe von Makros einiges löschen bzw berichtigen können, nur ich kriegs einfach nicht hin folgende 2 Sachen zu lösen:

  1. Ist der wichtigere, da dieser verhindert, das man damit arbeiten kann:
    Es handelt sich um die klassische Lohnsteuertabelle für 2018. Wir brauchen die in Excel, damit wir mit SVERWEISEN bzw WVERWESIEN diese benutzen können. Allerdings sind bis zu 1026€ die Steuerklassen alle um 1 nach links verschoben. Ich hab am Anfang bereits per Hand begonnen, aber das dauert ewig… finde auch keine brauchbare Lösung mit Makros die funktioniert, ohne das wichtiges gelöscht wird. Es müssen also quasi die Klassen einfach verschoben werden… aber nur die Klassse, nicht die Beträge

  2. Leerzeilen löschen
    Nachdem ich den ganzen Firlefanz zwischen den einzelnen Abschnitten mit Makros gelöscht bekommen habe, sind dort allerdings noch Leerzeilen. Immer wenn ich was versuche, krieg ich nur nen 1004-Error… Keine Ahnung warum. Google hilft auch nicht.

Das war mein Ansatz zu 2.:

Sub leeren()
Dim i As Integer
'
For i = 6 To 31192
    If IsEmpty(ActiveSheet.Cells(i, 0)) And IsEmpty(ActiveSheet.Cells(i, 1)) And IsEmpty(ActiveSheet.Cells(i, 2)) And IsEmpty(ActiveSheet.Cells(i, 3)) And IsEmpty(ActiveSheet.Cells(i, 4)) And IsEmpty(ActiveSheet.Cells(i, 5)) And IsEmpty(ActiveSheet.Cells(i, 6)) And IsEmpty(ActiveSheet.Cells(i, 7)) Then
        Rows(i).Delete
    End If
Next i
End Sub

Warum funktioniert das so nicht? Und hat wer nen anderen Vorschlag?
Hab die Tabelle mal angehängt, am Ende kann die bestimmt noch wer anders gebrauchen, zumindest fürs Interesse.

Lohnsteuertabelle 2018 monatlich mit 8%-Test.zip (1,7 MB)


#2

Du musst die Zählschleife rückwärts laufen lassen. Ansonsten überspringst du die Zeilen nach denen, die gelöscht wurden (der Index verschiebt sich).

Edit: bei dem Index bin ich mir gerade auch nicht ganz sicher. Muss das i, 0 nicht i, 1 etc. sein?


#3
Sub leeren()
Dim i As Integer

For i = 31192 To 6 Step -1
    If IsEmpty(ActiveSheet.Cells(i, 0)) And IsEmpty(ActiveSheet.Cells(i, 1)) And IsEmpty(ActiveSheet.Cells(i, 2)) And IsEmpty(ActiveSheet.Cells(i, 3)) And IsEmpty(ActiveSheet.Cells(i, 4)) And IsEmpty(ActiveSheet.Cells(i, 5)) And IsEmpty(ActiveSheet.Cells(i, 6)) And IsEmpty(ActiveSheet.Cells(i, 7)) Then
        Rows(i).Delete
    End If
Next i
End Sub

So funktioniert das aber auch nicht, krieg weiterhin den 1004-Error beim if


#4

Naja, das ist die zweite Sache, die ich im Edit angesprochen habe. Die Indizierung ist vielleicht nicht ganz intuitiv, aber es wird eben bei 1, 1 angefangen zu zählen.

Damit läufts:

Sub leeren()
    Dim i As Integer
    '
    For i = 31192 To 6 Step -1
        If IsEmpty(ActiveSheet.Cells(i, 1)) And IsEmpty(ActiveSheet.Cells(i, 2)) And IsEmpty(ActiveSheet.Cells(i, 3)) And IsEmpty(ActiveSheet.Cells(i, 4)) And IsEmpty(ActiveSheet.Cells(i, 5)) And IsEmpty(ActiveSheet.Cells(i, 6)) And IsEmpty(ActiveSheet.Cells(i, 7)) And IsEmpty(ActiveSheet.Cells(i, 8)) Then
            Rows(i).Delete
        End If
    Next i
End Sub

#5

Danke! Daran hab ich echt nicht gedacht… Bins von Indexen einfach gewohnt, bei 0 anzufangen.

Hätte dann noch eine Frage an dich, wo ich wahrscheinlich nur wegen der uhrzeit nicht drauf komme.
Ich möchte nun das per angegebenem Gehalt und der Steuerklasse die korrekte Lohnsteuer ausgelesen wird un später auch soli und KiSt. Nur verheddere ich mich grad extremst mit Wursteleien aus SVerweisen in Kombination mit WVERWEISEN und komm iwie nicht zu einer Lösung

Der SVERWEIS, der das Gehalt findet ist so:
=SVERWEIS(C8;Lohnsteuertabelle;3;WAHR)

Nur muss ich beim gefundenen ergebnis ja noch die höhe der Steuerklasse weiter nach unten… Und da hänge ich. Wie füge ich einem gefundenen zeilenindex eines sverweises noch eine Menge hinzu? Hab schon paar Sachen ausprobiert, aber iwie kam ich nicht zu dem gewünschten Ergebnis bzw. Wurde die Konstruktion so verzwickt, das ich selbst nicht mehr durchgeblickt hab.

Hab die Komplette Tabelle jetz mal hier. Die Tabelle ist die von oben, bei Abrechnung siehst du die Abrechnung, in die das ganze implementiert werden soll. Momentan wird noch alles händisch gemacht. In Sheet 2 hab ich das ausprobiert mit den Verweisen…

Lohnsteuertabelle 2018 monatlich mit 8%.zip (2,6 MB)


#6

Ad hoc kann ich aus Zeitgründen leider nicht helfen. VBA bekomme ich so hin, weil das “einfach nur programmieren” ist, aber die ganzen Excelfunktionen kenne ich so auch nicht alle im Detail.
Vielleicht kann dir ja jemand anders weiterhelfen.


#7

Wie installiert man denn VBA? [ Etwas verwirrt, da sowohl Strukturen “abgeschlossen” werden, aber auch indentation sensitive… ]

Es ist richtig, die Iteration-Richtung zu ändern, wenn Cells oder Rows deleteted werden sollen.

Die Hintereinanderschaltung von “Funktionen” geschieht so: a(b(arg)) [ b wird zuerst mit dem Argumenten arg aufgerufen - und das Ergebnis von b wird mit a aufgerufen ].

Nu kenne ich auch Excel zu wenig und das Inhaltliche mit der Lohnsteueren.

Du “solltest” dir unbedingt auch Listen ansehen


#8

VBA ist einfach direkt in Excel schon drin. Ist quasi VB für Office.

Das mit der Iterationsrichtung kam ich dann auch drauf, wobei ich denke, der Fehler eh eher beim Index 0 lag. Hätte so aber auch zu Fehlern geführt.

Das mit den Funktionen weiß ich ja, nur hab ich keine Ahnung, wie ich das am besten mache :sweat_smile: Ich muss ja im Prinzip zum gefundenen Zeilenindex des SVERWEISES manuell ein paar Zeilen hinzuaddieren.
Hab schon versucht mit VERWEIS was zu basteln, aber auch ohne Erfolg. Genauso wie ich am besten da die SVERWEISE verknüpfe, da ich die 2. Matrix für die Steuerklassen ja nicht vorher weiß, sondern die bei jedem Ergebnis anders ist.

Das inhaltliche mit den Lohnsteuern ist im Prinzip ja erstmal irrelevant um die Aufgabe zu lösen, geht ja nur darum, das Problem mit dem SVERWEIS zu lösen, die Lohnsteuertabelle ist da nur “Spielplatz” zum testen,also ein Beispiel.

Ich schau mir aber mal die Listen an, danke für den Tipp!