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.
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
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 FunctionHier 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
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
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

