Nächste, leere Zeile finden - nur in Bereich
Hallo!
Ich habe ein kleines Programm geschrieben, das eine nächste leere Zeile sucht.
Nun ist dieser Code jedoch so, dass die gesamte Spalte kontrolliert wird, wo der letzte Inhalt steht.
Wie kann ich diesen Suchberich nun auf einen Bereich (A2:A30) begrenzen?
Lg mike
Ich habe ein kleines Programm geschrieben, das eine nächste leere Zeile sucht.
....
...
With Worksheets("Mitarbeiter")
lngZeile = .Cells(.Rows.Count, 1).End(xlUp).Row
If lngZeile = 1 Then
If Not IsEmpty(.Cells(1, 1)) Then lngZeile = lngZeile + 1
ElseIf lngZeile < .Rows.Count And IsEmpty(.Cells(.Rows.Count, 1)) Then
lngZeile = lngZeile + 1
Else
MsgBox "VOLL!": Exit Sub
End If
...
...
Nun ist dieser Code jedoch so, dass die gesamte Spalte kontrolliert wird, wo der letzte Inhalt steht.
Wie kann ich diesen Suchberich nun auf einen Bereich (A2:A30) begrenzen?
Lg mike
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 149621
Url: https://administrator.de/contentid/149621
Ausgedruckt am: 22.11.2024 um 20:11 Uhr
14 Kommentare
Neuester Kommentar
Hallo Mike, Hallo bastla!
Code entfernt. Funktioniert leider nicht, wenn alle Zeilen leer sind
Gruß Dieter
Code entfernt. Funktioniert leider nicht, wenn alle Zeilen leer sind
Gruß Dieter
@Dieter: Hätte mir aber trotzdem gut gefallen ... - außerdem soll es ja in Zeile 1 offensichtlich eine Überschrift geben - daher also einfach den Bereich um diese Zeile erweitern ...
Grüße
bastla
Grüße
bastla
@bastla
Gruß Dieter
Zitat von @bastla:
@Dieter: Hätte mir aber trotzdem gut gefallen ... - außerdem soll es ja in Zeile 1 offensichtlich eine
Überschrift geben - daher also einfach den Bereich um diese Zeile erweitern ...
Stimmt, in diesem Fall würde es funktionieren Aber bei anderen Gegebenheiten funktioniert's dann leider nicht korrekt. Von Daher gesehen keine gute Lösung@Dieter: Hätte mir aber trotzdem gut gefallen ... - außerdem soll es ja in Zeile 1 offensichtlich eine
Überschrift geben - daher also einfach den Bereich um diese Zeile erweitern ...
Gruß Dieter
Hallo zusammen!
Yepp, dem stimme ich zu. Bastlas Ansatz funktioniert, wobei man allerdings die überflüssige Variable lngZeileFrei und Voll noch entfernen könnte, da der Zähler lngZeile ja schon das Ergebnis nach dem Schleifenabbruch beinhaltet bzw. bei Voll den ungültigen Wert 31 enthält. Also sollte ein Test mit
nach der For-Schleife ausreichend sein
Es geht zwar auch über die .Cells(...).End(xlUp).Row-Methode, wobei anstatt Rows.Count der Wert der letzen Range-Zeile angegeben wird. Aber im Endeffekt ist diese Funktion etwas aufwendiger, weil bei dieser Methode, die letzte Zeile (Rows.Count oder sonstige Zeilenangabe) leer sein muss, ansonsten wird die Zeilennummer zurückgegeben, die sich aufwärts vor der nächsten Leerzeile befindet. D.h. wenn die letzte Zeile nicht leer ist und in Zeile 1 eine Überschrift steht, dann wird die Zeile 1 zurückgegeben. Deswegen sollte man diese Methode auch nur mit Rows.Count (Maxzeile) und der Sicherheit, das die allerletzte Zeile (bei mir 65536) leer ist, verwenden.
Gruß Dieter
Yepp, dem stimme ich zu. Bastlas Ansatz funktioniert, wobei man allerdings die überflüssige Variable lngZeileFrei und Voll noch entfernen könnte, da der Zähler lngZeile ja schon das Ergebnis nach dem Schleifenabbruch beinhaltet bzw. bei Voll den ungültigen Wert 31 enthält. Also sollte ein Test mit
If lngZeile > 30 Then MsgBox "Voll": Exit Sub
Es geht zwar auch über die .Cells(...).End(xlUp).Row-Methode, wobei anstatt Rows.Count der Wert der letzen Range-Zeile angegeben wird. Aber im Endeffekt ist diese Funktion etwas aufwendiger, weil bei dieser Methode, die letzte Zeile (Rows.Count oder sonstige Zeilenangabe) leer sein muss, ansonsten wird die Zeilennummer zurückgegeben, die sich aufwärts vor der nächsten Leerzeile befindet. D.h. wenn die letzte Zeile nicht leer ist und in Zeile 1 eine Überschrift steht, dann wird die Zeile 1 zurückgegeben. Deswegen sollte man diese Methode auch nur mit Rows.Count (Maxzeile) und der Sicherheit, das die allerletzte Zeile (bei mir 65536) leer ist, verwenden.
Gruß Dieter
@Dieter
Was "lngZeileFrei" anlangt hast Du natürlich Recht ...
Bei den wenigen Zeilen, um die es hier geht, wird der Sprung aus der Schleife wohl nicht wesentlich zu einer Verbesserung der Laufzeit beitragen - bei einem größeren Bereich dürfte es aber sinnvoll sein, nicht alle Zeilen durchlaufen zu müssen ...
Grüße
bastla
Was "lngZeileFrei" anlangt hast Du natürlich Recht ...
Bei den wenigen Zeilen, um die es hier geht, wird der Sprung aus der Schleife wohl nicht wesentlich zu einer Verbesserung der Laufzeit beitragen - bei einem größeren Bereich dürfte es aber sinnvoll sein, nicht alle Zeilen durchlaufen zu müssen ...
Grüße
bastla
Hallo bastla!
Der Vorteil des Schleifenabbruchs liegt ja gerade darin, die Zeilennummer ohne größeren Aufwand zu ermitteln:
sieht dann auch etwas hübscher aus
Gruß Dieter
Zitat von @bastla:
Bei den wenigen Zeilen, um die es hier geht, wird der Sprung aus der Schleife wohl nicht wesentlich zu einer Verbesserung der
Laufzeit beitragen - bei einem größeren Bereich dürfte es aber sinnvoll sein, nicht alle Zeilen durchlaufen zu
müssen ...
Bei den wenigen Zeilen, um die es hier geht, wird der Sprung aus der Schleife wohl nicht wesentlich zu einer Verbesserung der
Laufzeit beitragen - bei einem größeren Bereich dürfte es aber sinnvoll sein, nicht alle Zeilen durchlaufen zu
müssen ...
Der Vorteil des Schleifenabbruchs liegt ja gerade darin, die Zeilennummer ohne größeren Aufwand zu ermitteln:
With Sheets("Mitarbeiter")
For lngZeile = 2 To 30
If IsEmpty(.Cells(lngZeile, 1)) Then Exit For
Next
If lngZeile > 30 Then MsgBox "Voll!": Exit Sub
'.....
End With
Gruß Dieter
Hallo bastla!
Sehe ich auch so
Gruß Dieter
Sehe ich auch so
Mit der Einschätzung, dass Du das Ganze damit jetzt optimiert hast, sollte ich dann aber zur Abwechslung mal richtig liegen
...
Was heißt denn zur Abwechslung? Kommt doch recht selten vor, dass Du den Wald vor lauter Bäumen nicht siehst...
Gruß Dieter