xaumichi
Goto Top

Nächste, leere Zeile finden - nur in Bereich

Hallo!

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

Content-Key: 149621

Url: https://administrator.de/contentid/149621

Ausgedruckt am: 29.03.2024 um 06:03 Uhr

Mitglied: bastla
bastla 24.08.2010 um 16:03:37 Uhr
Goto Top
Hallo xaumichi!

Ungetestet etwa so:
With Worksheets("Mitarbeiter")  
            Voll = True
            For lngZeile = 2 To 30
                If IsEmpty(.Cells(lngZeile,"A")) Then  
                    Voll = False
                    lngZeileFrei = lngZeile
                    Exit For
                End If
            Next
            If Voll Then
                MsgBox "VOLL!":  Exit Sub  
            Else
                MsgBox "Frei: A" & lngZeileFrei  
            End If
End With
Grüße
bastla
Mitglied: 76109
76109 24.08.2010 um 16:37:32 Uhr
Goto Top
Hallo Mike, Hallo bastla!

Code entfernt. Funktioniert leider nicht, wenn alle Zeilen leer sindface-smile

Gruß Dieter
Mitglied: bastla
bastla 24.08.2010 um 16:43:48 Uhr
Goto Top
@Dieter: Hybsch face-smile

Grüße
bastla
Mitglied: 76109
76109 24.08.2010 um 16:47:46 Uhr
Goto Top
Zitat von @bastla:
@Dieter: Hybsch face-smile
Dankeface-smile Funktioniert aber nicht so wie gedacht (siehe letzte Antwort)face-wink

Gruß Dieter
Mitglied: bastla
bastla 24.08.2010 um 16:55:30 Uhr
Goto Top
@Dieter: Hätte mir aber trotzdem gut gefallen ... face-wink - außerdem soll es ja in Zeile 1 offensichtlich eine Überschrift geben - daher also einfach den Bereich um diese Zeile erweitern ...

Grüße
bastla
Mitglied: 76109
76109 24.08.2010 um 17:12:22 Uhr
Goto Top
@bastla

Zitat von @bastla:
@Dieter: Hätte mir aber trotzdem gut gefallen ... face-wink - 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 funktionierenface-wink Aber bei anderen Gegebenheiten funktioniert's dann leider nicht korrekt. Von Daher gesehen keine gute Lösungface-smile

Gruß Dieter
Mitglied: xaumichi
xaumichi 24.08.2010 um 18:30:32 Uhr
Goto Top
Hm...dürfte doch nicht ganz so einfach sein!
Hätte jetzt auch ein bisschen herum probiert, hab aber auch leider nichts funktionstüchtiges zusammengebracht....

Lg Mike
Mitglied: bastla
bastla 24.08.2010 um 18:49:38 Uhr
Goto Top
Hallo xaumichi!

Habe inzwischen meinen Ansatz getestet - bei mir funktioniert das ...

Grüße
bastla
Mitglied: 76109
76109 24.08.2010 um 19:31:38 Uhr
Goto Top
Hallo zusammen!

Yepp, dem stimme ich zu. Bastlas Ansatz funktioniertface-smile, 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  
nach der For-Schleife ausreichend seinface-wink

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
Mitglied: xaumichi
xaumichi 25.08.2010 um 08:19:45 Uhr
Goto Top
Jup, hat geklappt!

Danke schön!

Lg Mike
Mitglied: bastla
bastla 25.08.2010 um 13:31:21 Uhr
Goto Top
@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 face-wink - bei einem größeren Bereich dürfte es aber sinnvoll sein, nicht alle Zeilen durchlaufen zu müssen ...

Grüße
bastla
Mitglied: 76109
76109 25.08.2010 um 13:51:53 Uhr
Goto Top
Hallo bastla!

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 face-wink - 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
sieht dann auch etwas hübscher ausface-smile

Gruß Dieter
Mitglied: bastla
bastla 25.08.2010 um 14:31:12 Uhr
Goto Top
Hallo Dieter!

Sorry - da war ich voll daneben ... face-sad

Mit der Einschätzung, dass Du das Ganze damit jetzt optimiert hast, sollte ich dann aber zur Abwechslung mal richtig liegen ... face-wink

Grüße
bastla
Mitglied: 76109
76109 25.08.2010 um 14:41:51 Uhr
Goto Top
Hallo bastla!

Zitat von @bastla:
Sorry - da war ich voll daneben ... face-sad
Sehe ich auch soface-wink
Mit der Einschätzung, dass Du das Ganze damit jetzt optimiert hast, sollte ich dann aber zur Abwechslung mal richtig liegen
... face-wink
Was heißt denn zur Abwechslung?face-smile Kommt doch recht selten vor, dass Du den Wald vor lauter Bäumen nicht siehstface-smile

Gruß Dieter