Clever-Excel-Forum

Normale Version: Schleife soll bei erster leeren Zelle stoppen
Du siehst gerade eine vereinfachte Darstellung unserer Inhalte. Normale Ansicht mit richtiger Formatierung.
Hallo,

in meinem Makro habe ich eine Schleife eingebaut die 66 Zeilen nach unten durchläuft. jetzt habe ich bemerkt das dieser feste Wert bei manchen Tabellen schlecht ist da es auch schon vor der letzten Zeile Nr 66 schon leere Zellen gibt und das wäre schlecht beim Versand per eMail.

Code:
For z = 5 To 70 ' normal bis 70 Schleifendurchlauf = 66 x
   
     'Beitrag
     Beitrag = ActiveSheet.Cells(z, 47)
     
     'Akz
     akz = ActiveSheet.Cells(z, 49)
     
     'Kind
     Kind = ActiveSheet.Cells(z, 46)
     
     'Buchungen
     Buchungen = ActiveSheet.Cells(z, 48)
   
     'Monat
     Datum = ActiveSheet.Cells(1, 4)
     Monat = Format(Datum, "mmmm yyyy")

   Next z

End With

Wie bekomme ich das hin das z nur bis zur ersten leeren Zelle durchläuft?

Gruß Daniel
Hallo

kommen denn nach der ersten leeren Zelle noch befüllte Zellen?

MfG Tom
Guten Morgen,

nein kann zum Glück nicht mehr vorkommen durch den User "Jockel".

Habe ich in folgenden Thread schon lösen können

http://www.clever-excel-forum.de/thread-7634.html

Nun fehlt nur noch die Lösung, dass die Schleife keine leeren eMails erzeugt :)
Hallo Daniel,

ungefähr so

Code:
Dim lngLetzteZelle As Long


With ActiveSheet

For Z = 5 To .Cells(.Rows.Count, 1).End(xlUp).Row '70 ' normal bis 70 Schleifendurchlauf = 66 x bezogen auf die Spalte A, bitte anpassen!!!!!!!!!
    
      'Beitrag
      Beitrag = .Cells(Z, 47)
      
      'Akz
      akz = .Cells(Z, 49)
      
      'Kind
      Kind = .Cells(Z, 46)
      
      'Buchungen
      Buchungen = .Cells(Z, 48)
    
      'Monat
      Datum = .Cells(1, 4)
      Monat = Format(Datum, "mmmm yyyy")

    Next Z

End With
Hallo,

funktioniert leider nicht, die schleife läuft weiter:


Code:
Sub Test()
Dim olApp As Object
Dim z As Long
Dim Empfänger As String
Dim Mandatsnummer As String
Dim Beitrag As String
Dim Monat As String
Dim Datum As String
Dim Kind As String
Dim lngLetzteZelle As Long

Set olApp = CreateObject("Outlook.Application")

With ActiveSheet

For z = 5 To .Cells(.Rows.Count, 5).End(xlUp).Row ' normal bis 70 Schleifendurchlauf = 66 x

     'Empfänger festelegen
     Empfänger = ActiveSheet.Cells(z, 41)
             
     'Mandatsnummer erstellen
     Mandatsnummer = ActiveSheet.Cells(z, 42)
     
     'Beitrag
     Beitrag = ActiveSheet.Cells(z, 43)
     
     'Kind
     Kind = ActiveSheet.Cells(z, 44)
   
     'Monat
     Datum = ActiveSheet.Cells(1, 4)
     Monat = Format(Datum, "mmmm yyyy")

With olApp.CreateItem(0)
Rem Empfänger
         .To = Empfänger
         
Rem Betreff
         .Subject = "Ankündigung Abbuchung Differenzbuchung - Mittagsessen für den Vormonat in Höhe von " & Beitrag & " €"

Rem Textkörper (Body) im HTML-Format. (1 = Nur-Text, 2 = HTML, 3 = Rich-Text)
         .BodyFormat = 2
Rem "<br>" = Zeilenumbruch-Anweisung (nur bei HTML)
         .HTMLBody = "Sehr geehrte Eltern,<br><br> " & _
                         "wir werden von Ihrem Konto den Differenzbeitrag für das Mittagessen für den vergangenen Monat (<b>" & Monat & "</b>) in Höhe von <b>" & Beitrag & " Euro</b> abbuchen.<br><br>" & _
                         "Die Abbuchung findet in den kommenden 5 Tagen über die Mandatsreferenznummer<b> " & Mandatsnummer & "</b> statt.<br><br>" & _
                         "Mit freundlichen Grüßen<br><br>" & _
                         "Mittagsbetreuung Penzing - Kassierer - " & .HTMLBody
         
Rem Name des Sendekontos in Anführungszeichen
     Set .SendUsingAccount = .Session.Accounts.Item("Mittagsbetreuung@.de")
     
Rem  Mail sofort senden
'          .Send
.Display

End With

   Next z

End With

End Sub


Die schleife beginnt in Zelle AO5. Ich habe die Inhalte mal in den Zellen darunter gelöscht aber die Schleife läuft weiter

Gruß Daniel
Hallo Daniel Albert

ich denke es gibt drei Lösungen für dein Problem:  eine Exit For/Sub oder Goto Anweisung direkt nach der For z=5 Zeile
For z = 5 To .Cells(.Rows.Count, 5).End(xlUp).Row
If .Cells(z, "AO") = Empty Then Exit For   springt aus der For Schleife heraus!  Wird verwendet wenn nach Next z noch Befehle kommen 
If .Cells(z, "AO") = Empty Then Exit Sub   verlaesst endgültig das Makro, beendet das Programm!
If .Cells(z, "AO") = Empty Then GoTo weiter   überspringt den gesamten Code, dafür muss vor Nezt z "Weiter:" steheni mit ":" !!

Bei .Cells(z, "AO") = Empty musst du die gewünschte Leerzelle angeben. Wenns nicht "AO" ist bitte selbst anpassen. Würde mich freuen wenn es klappt!

mfg  Gast 123
Hallo Daniel,

ich zitiere mal nur einen Teil deiner Antwort

(13.12.2016, 21:14)Daniel Albert schrieb: [ -> ]funktioniert leider nicht, die schleife läuft weiter:

Code:
For z = 5 To .Cells(.Rows.Count, 5).End(xlUp).Row ' normal bis 70 Schleifendurchlauf = 66 x


Die schleife beginnt in Zelle AO5. Ich habe die Inhalte mal in den Zellen darunter gelöscht aber die Schleife läuft weiter

in dem geänderten Code verweist Du aber auf Spalte E! Cells hat die Syntax Cells(Zeile, Spalte) Übrigens: Eine Zelle, die eine Formel enthält ist nicht leer.
Hallo steffi, da muss natrülich 41 hin.

Habe ich gemacht, aber du hast recht da ist eine Formel in dieser Zelle. Wie bekomme ich es dann hin das er trotzdem die Schleife dann beendet ?

Habe gerade von Gast123 den Punkt If .Cells(z, "AO") = Empty Then Exit For

scheint zu funktionieren :)

Werde es mal am WE ausprobieren
Hallo Daniel,

wenn es sich um Formel handelt, die dir einen Leerstring zurückgibt versuchs mal so (mit Empty dürfte es nicht funktionieren, das dies Falsch zurückgibt).

Code:
For z = 5 To .Cells(.Rows.Count, 41).End(xlUp).Row
If .Cells(z, 41) = "" Then Exit For