Supportnet Computer
Planet of Tech

Supportnet / Forum / Tabellenkalkulation

mehrmaliger Aufruf einer Funktion zur Ermittlung von Zeilen(Anzahl)





Frage

Hallo, ich brauche dringend Hilfe. Bin leider nicht besonders fit in VBA. Mein Problem ist : Ich habe eine Excel-Datei, in der ich Leerzeilen lösche und danach in der ersten Spalte Daten einfüge. Hierfür berechne ich zuerst die Anzahl der Zeilen. Danach werden die Leerzeilen und andere Zeilen nach bestimmten Kriterien gelöscht. Als nächsten Schritt soll wieder die Anzahl der Zeilen ermittelt werden, damit ich in einer Schleife die Spalte 1 durchlaufen und diese mit Daten auffüllen kann. Leider füllt er zuviele Zeilen aus. Das Programm rechnet immer mit der gleichen Anzahl von Zeilen, obwohl nach dem Löschen ja weniger Zeilen vorhanden sind und ich die Zeilenanzahl neu berechnen lasse. Wieso gibt er immer wieder dieselbe Zeilenzahl aus? kann mir jemand bei dem Problem helfen? Der Code: [code] [b]Public Sub Vervollstaendigen()[/b] Dim i As Integer Dim wert As String Worksheets("Tabelle1").Activate ´Zuerst alle Leerzeilen loeschen Loeschen ´Anzahl der Zeilen in der Tabelle ermitteln LetzteZeile = LastRowInWS Debug.Print (LetzteZeile) ´Erste Spalte füllen (Zweck: Gruppierung Daten) wert = ActiveSheet.Cells(1, 1).Value For i = 1 To LetzteZeile If (ActiveSheet.Cells(i, 1).Value = "") Then ActiveSheet.Cells(i, 1).Value = wert Else wert = ActiveSheet.Cells(i, 1) Debug.Print (wert) End If Next i End Sub [b]Function Loeschen()[/b] ´Anzahl Zeilen ermitteln LetzteZeile = LastRowInWS ´Diese Forschleife sorgt dafür, dass die Spalten 1 bis Letzte Spalte durchlaufen werden Dim minus As Integer Debug.Print (LetzteZeile) For zeile = 1 To LetzteZeile ´Step 1 ´NichtLoeschen wird benötigt, um festzustellen, dass die Zeile wirklich von A bis F leer ist ´Siehe if- Bedingung NichtLoeschen = False ´Spalte 1 --> A bis Spalte 6 --> F For spalte = 1 To 6 Wort1 = Cells(zeile, spalte) If Wort1 <> "" Then NichtLoeschen = True End If Next spalte ´Wenn in der aktuellen Zeilein Spalte 2 eine Linie beinhaltet, Zeile auch loeschen Wort2 = Cells(zeile, 2) If Wort2 Like "*———*" Then NichtLoeschen = False End If ´Wenn in der aktuellen Zeile die Spalten 1,3,4 leer sind, Zeile auch loeschen ´In Spalte 2 würde dann nur eine Bemerkung stehen. Wort1 = Cells(zeile, 1) Wort3 = Cells(zeile, 3) Wort4 = Cells(zeile, 4) If (Wort1 = "") And (Wort3 = "") And (Wort4 = "") Then NichtLoeschen = False End If ´Wenn noch irgendein Eintrag in Zeile innerhalb der Spalten A-F, wird nicht gelöscht If NichtLoeschen = False Then Rows(zeile & ":" & zeile).Select Selection.EntireRow.Delete Shift:=xlUp LetzteZeile = LetzteZeile - 1 zeile = zeile - 1 minus = minus + 1 End If ´Wenn das Ende der Tabelle erreicht, For-Schleife verlassen If zeile = LetzteZeile Then Exit For End If Next zeile Debug.Print (minus) Debug.Print (LetzteZeile) ´Erste Zeile Spalte 1 anwählen --> Nicht unbedingt nötig Range("A1").Select End Function [b]Function LastRowInWS() As Long[/b] LastRowInWS = Sheets("Tabelle1").Cells.SpecialCells(xlCellTypeLastCell).Row Debug.Print (LastRowInWS) End Function [/code]

Antwort 1 von CaroS

Hallo semra,

als Ursache des Fehlers würde ich die SpecialCells-Methode SpecialCells(xlCellTypeLastCell) bezeichnen, ich würde auch bewußt von einem Fehler in dieser Methode sprechen, denn bei relativ umfangreichen Versuchen im Einzelschritt-Debugmodus lieferte sie jede Menge seltsame Ergebnisse, in der Mehrzahl zu hohe Zeilennummern (sogar von Zeilen, in denen nie ein Wert gestanden hat).

Oder anders ausgedrückt, ich habe weder eine Erklärung für das beobachtete Verhalten dieser SpecialCells-Methode noch weiß ich, wie man ihr "bessere" Ergebnisse entlocken kann. Also schlage ich vor, bis uns nighty vielleicht erlöst, das Übel zu umgehen und Deine Function LastRowInWS-Function etwas zu verändern.

Function LastRowInWS() As Long

LastRowInWS = ActiveSheet.Range(Chr(Sheets("Tabelle1").Cells.SpecialCells(xlCellTypeLastCell).Column + 64) & "65536").End(xlUp).Row

Debug.Print (LastRowInWS)

End Function


Hier wird SpecialCells(xlCellTypeLastCell) nur benutzt, um mit .Column die Spalte zu ermitteln, in der die letzte Zelle liegt. Die Zeilennummer, um die es eigentlich geht, wird dann "in altbewährter Weise" mit .End(xlUp).Row ermittelt.

Gruß,
CaroS

Antwort 2 von nighty

hi semra :)

hab versucht umzubauen

gruss nighty

wenn net laeuft schick email mit datei und sehr ausfuehrlicher beschreibung der wünsche :)

oberley@t-online.de

Option Explicit
Public Sub Vervollstaendigen()
Dim i As Integer
Dim wert As String
Worksheets("Tabelle1").Activate
Loeschen
wert = ActiveSheet.Cells(1, 1).Value
For i = 1 To Sheets("Tabelle1").UsedRange.SpecialCells(xlCellTypeLastCell).Row
If (ActiveSheet.Cells(i, 1).Value = "") Then
ActiveSheet.Cells(i, 1).Value = wert
Else
wert = ActiveSheet.Cells(i, 1)
End If
Next i
End Sub

Function Loeschen()
Dim zeile As Long
Dim NichtLoeschen As Boolean
Dim spalte As Integer
Dim wort1 As Variant
Dim wort2 As Variant
Dim wort3 As Variant
Dim wort4 As Variant
For zeile = 1 To Sheets("Tabelle1").UsedRange.SpecialCells(xlCellTypeLastCell).Row
NichtLoeschen = False
For spalte = 1 To 6
wort1 = Cells(zeile, spalte)
If wort1 <> "" Then
NichtLoeschen = True
End If
Next spalte
wort2 = Cells(zeile, 2)
If wort2 Like "*———*" Then
NichtLoeschen = False
End If
wort1 = Cells(zeile, 1)
wort3 = Cells(zeile, 3)
wort4 = Cells(zeile, 4)
If (wort1 = "") And (wort3 = "") And (wort4 = "") Then
NichtLoeschen = False
End If
If NichtLoeschen = False Then
Rows(zeile & ":" & zeile).EntireRow.Delete Shift:=xlUp
End If
Next zeile
End Function

Antwort 3 von semra

Hallo CaroS, hi nighty,

vielen Dank für eure Unterstützung.
Werde eure Vorschläge mal ausprobieren.
Melde mich dann wieder bei positivem wie auch negativem Erfolg :-)

Gruß
Semra