Live-Forum - Die aktuellen Beiträge
Anzeige
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender

Forumthread: If Bedingung in For Schleife

If Bedingung in For Schleife
08.07.2019 09:14:11
KathrinZ
Hallo zusammen,
ich hab ein kleines Problem mit meiner Bedingung innerhalb einer For Schleife:

Sub Verteilen()
Dim Suchrange As Range, Kopierrange As Range, Einfuegerange As Range
Dim wsOr As Worksheet, wsKo As Worksheet
Dim Zelle As Range
Set wsOr = ThisWorkbook.Worksheets("Upload")
Set wsKo = ThisWorkbook.Worksheets("Input ext.")
Set Kopierrange = wsKo.UsedRange.Columns(2).Offset(9, 0)
For Each Zelle In Kopierrange.Resize(Kopierrange.Rows.Count - 9).Cells
'Wenn Spalte 5 in jeweiliger Zeile leer ist, stoppe die Schleife und gehe zum Ende
If Zelle.Columns(5).Value = "" Then
Exit For
GoTo Ende
Else
'Wenn die Spalte 5 des Bereichs Zelle NICHT leer ist, dann führe aus
'If Zelle.Columns(5).Value  "" Then
Set Suchrange = wsOr.Columns(2).Find(what:=Zelle.Value, LookIn:=xlValues, LookAt:= _
xlWhole)
If Suchrange Is Nothing Then
Zelle.EntireRow.Copy wsOr.Cells(wsOr.Rows.Count, 5).End(xlUp).Offset(1, -4)
'Set Einfuegerange = wsOr.Cells(wsOr.Rows.Count, 3).End(xlUp).Offset(1, -2)
'Zelle.EntireRow.Copy Einfuegerange
'Zelle.EntireRow.Clear
Zelle.EntireRow.Delete
GoTo Weiter
Else
Zelle.EntireRow.Copy Suchrange.Offset(0, -1)
'Zelle.EntireRow.Clear
Zelle.EntireRow.Delete
GoTo Weiter
End If
End If
Weiter:
Next Zelle
Ende:
Set wsOr = Nothing
Set wsKo = Nothing
Set Kopierrange = Nothing
End Sub

Die Bedingung prüft für jeden Bereich, ob Spalte 5 leer ist oder nicht. Wenn die Zelle nicht leer ist, soll der Code innerhalb der Schleife ausgeführt werden. Wenn die Zelle leer ist, soll die Schleife abgebrochen werden und zum Ende des Codes gegangen werden. An eine Do while Schleife hab ich auch schon gedacht, aber ich glaub das funktioniert nicht, weil ich den Bereich ja erst mit Zelle in der For Schleife definiere.
Aktuell läuft es so, dass ich für jede Zeile einmal den Coden ausführen muss. Er macht zwar alles richtig, springt nur nicht in den nächsten Bereich, also in "Next Zelle".
Hat hier jemand eine Lösung?
VG
Kathrin
Anzeige

9
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: If Bedingung in For Schleife
08.07.2019 09:49:02
mmat
Hallo Kathrin,
"Exit For" und "GoTo Ende" sind in DIESEM FALL funktional identisch, es wird ein Sprung zu "Ende:" ausgeführt.
Nur der erste der beiden Befehle wird ausgeführt, der 2. ist überflüssig.
Den vorletzten Absatz hab ich nicht verstanden, warum sollte er nicht in die nächste Zelle springen, solang die Schleife nicht abgebrochen wird?
vg, MM
Anzeige
AW: If Bedingung in For Schleife
08.07.2019 10:01:24
KathrinZ
Hallo MM,
also ich hab GoTo Ende mal beseitigt, da irrelevant - danke!
Er soll immer in die nächste Zelle springen, wenn die Bedingung nicht erfüllt ist, also ein Wert in der Zelle steht bzw. sie nicht leer ist. Ich wiederum verstehe Deine Frage gerade nicht ganz bzw auf welchen Absatz Du Dich beziehst.
VG
Kathrin
Anzeige
AW: If Bedingung in For Schleife
08.07.2019 10:15:46
Daniel
HI
da Zelle in Spalte B liegt, refernziert Zelle.Columns(5) nicht auf Spalte E, sondern auf Spalte F
(.Columns(5)) ist die 5. Spalte des Zellbereichs!
wenn du den Wert aus der Spalte E haben willst, musst du
entweder die Kopierrange auf Spalte A setzen
oder die Zelle mit Zelle.Columns(4) ansprechen oder mit Zelle.Offset(0, 3)
oder die Zelle mit Zelle.EntireRow.Columns(5) ansprechen.
Gruß Daniel
Anzeige
AW: If Bedingung in For Schleife
08.07.2019 11:16:26
KathrinZ
Hallo Daniel,
danke für den Hinweis, hab ich abgeändert. Wobei es in dem Fall egal wäre, weil bei fehlender Kostenstellenplanung sowohl der Wert in Spalte E als auch in F leer wären.
Hast Du eine Idee wie ich die For Schleife mit der If Bedingung verschachtel ohne einen "Next ohne For" Fehler zu kriegen oder für jede Zeile einzeln den Code ausführen muss?
VG Kathrin
Anzeige
AW: If Bedingung in For Schleife
08.07.2019 13:00:46
Rudi
Hallo,
warum löschst du jeweils die Zeile? Das bringt die Schleife durcheinander.
Bsp: Zelle ist B20 und die Zeile wird gelöscht. Next Zelle verweist auf B21, das jetzt aber B20 ist.
Gruß
Rudi
AW: If Bedingung in For Schleife
08.07.2019 13:22:47
KathrinZ
Hi Rudi,
damit das Tabellenblatt am Ende leer ist und alle Werte kopiert wurden, lösche ich die Zeilen danach zur Überprüfung. Ich probiers mal ohne das löschen, ob es dann klappen würde..
VG
Kathrin
Anzeige
AW: If Bedingung in For Schleife
08.07.2019 14:29:43
Pierre
Hallo Kathrin,
nur als Idee: Das löschen der Zeilen ganz zum Schluss machen?
Oder vielleicht kann man den Code "falschrum" laufen lassen, also von unten nach oben, sodass die Schleife eben nicht durcheinander kommt, wenn wie von Rudi bemerkt, sich die Zeilennummern verschieben?
Vielleicht würde das ja den Fehler beheben?
Gruß Pierre
Anzeige
Teste mal
08.07.2019 15:01:37
Rudi

Sub Verteilen()
Dim SuchRange As Range, KopierRange As Range, EinfuegeRange As Range
Dim wsOr As Worksheet, wsKo As Worksheet
Dim Zelle As Range
Set wsOr = ThisWorkbook.Worksheets("Upload")
Set wsKo = ThisWorkbook.Worksheets("Input ext.")
With wsKo
Set KopierRange = .Range(.Cells(10, 2), .Cells(Rows.Count, 5).End(xlUp).Offset(, -3))
End With
For Each Zelle In KopierRange
'Wenn Spalte 5 in jeweiliger Zeile leer ist, stoppe die Schleife und gehe zum Ende
If Zelle.Offset(, 3).Value = "" Then
Exit For
Else
'Wenn die Spalte 5 des Bereichs Zelle NICHT leer ist, dann führe aus
Set SuchRange = wsOr.Columns(2).Find(what:=Zelle.Value, LookIn:=xlValues, LookAt:= _
xlWhole)
If SuchRange Is Nothing Then
Set SuchRange = wsOr.Cells(Rows.Count, 5).End(xlUp).Offset(1, -3)
End If
Zelle.EntireRow.Copy SuchRange.Offset(0, -1)
End If
Next Zelle
Set wsOr = Nothing
Set wsKo = Nothing
Set KopierRange = Nothing
Set SuchRange = Nothing
End Sub

Anzeige
AW: Teste mal
09.07.2019 08:01:26
KathrinZ
Danke Rudi, das klappt!
Damit wäre mein Problem erstmal wieder gelöst, vielen Dank an alle!
VG,
Kathrin
;

Forumthreads zu verwandten Themen

Anzeige
Anzeige
Anzeige
Anzeige
Anzeige

Infobox / Tutorial

If Bedingung in For Schleife


Schritt-für-Schritt-Anleitung

  1. Erstelle ein neues VBA-Modul:

    • Öffne Excel und drücke ALT + F11, um den VBA-Editor zu öffnen.
    • Klicke mit der rechten Maustaste im Projektfenster auf "VBAProject (DeineDatei.xlsx)" und wähle Einfügen > Modul.
  2. Füge den folgenden Code ein:

    Sub Verteilen()
       Dim SuchRange As Range, KopierRange As Range
       Dim wsOr As Worksheet, wsKo As Worksheet
       Dim Zelle As Range
    
       Set wsOr = ThisWorkbook.Worksheets("Upload")
       Set wsKo = ThisWorkbook.Worksheets("Input ext.")
       Set KopierRange = wsKo.UsedRange.Columns(2).Offset(9, 0)
    
       For Each Zelle In KopierRange.Resize(Kopierrange.Rows.Count - 9).Cells
           If Zelle.Offset(0, 3).Value = "" Then
               Exit For
           Else
               Set SuchRange = wsOr.Columns(2).Find(what:=Zelle.Value, LookIn:=xlValues, LookAt:=xlWhole)
               If SuchRange Is Nothing Then
                   Zelle.EntireRow.Copy wsOr.Cells(wsOr.Rows.Count, 5).End(xlUp).Offset(1, -4)
               Else
                   Zelle.EntireRow.Copy SuchRange.Offset(0, -1)
               End If
           End If
       Next Zelle
    
       Set wsOr = Nothing
       Set wsKo = Nothing
       Set KopierRange = Nothing
    End Sub
  3. Passen Sie die Zellenreferenzen an:

    • Stelle sicher, dass die Referenzen für die Zellen im Code mit deiner Excel-Tabelle übereinstimmen.
  4. Führe das Makro aus:

    • Gehe zurück zu Excel, drücke ALT + F8, wähle Verteilen und klicke auf Ausführen.

Häufige Fehler und Lösungen

  • Problem: Der Code springt nicht zur nächsten Zelle.

    • Lösung: Stelle sicher, dass du die Zeile nicht löschst, während die Schleife läuft. Lösche die Zeilen am Ende der Schleife, um Index-Probleme zu vermeiden.
  • Problem: Die Schleife stoppt, obwohl die Zelle nicht leer ist.

    • Lösung: Überprüfe die Bedingung in der If-Anweisung. Möglicherweise verwendest du Zelle.Columns(5), was auf die falsche Spalte verweist. Nutze stattdessen Zelle.Offset(0, 3).

Alternative Methoden

  • Do While Schleife: Du kannst auch eine Do While Schleife verwenden, um eine ähnliche Funktionalität zu erreichen. Dies kann nützlich sein, wenn du spezifische Bedingungen hast, die eine For Schleife nicht abdecken kann:

    Dim i As Integer
    i = 10
    Do While wsKo.Cells(i, 2).Value <> ""
       ' Deine Logik hier
       i = i + 1
    Loop
  • Reverse For Schleife: Um Probleme mit gelöschten Zeilen zu vermeiden, kannst du eine Schleife von unten nach oben durchführen:

    For i = KopierRange.Rows.Count To 1 Step -1
       ' Deine Logik hier
    Next i

Praktische Beispiele

Hier ist ein Beispiel für eine For Schleife mit einer If Bedingung in VBA:

Sub Beispiel()
    Dim Zelle As Range
    For Each Zelle In Range("B10:B20")
        If Zelle.Value = "" Then
            ' Wenn leer, mache nichts
        Else
            ' Wenn nicht leer, mache etwas
            Debug.Print Zelle.Value
        End If
    Next Zelle
End Sub

Diese Struktur zeigt, wie die If Bedingung in einer For Schleife verwendet wird, um nur relevante Zellen zu verarbeiten.


Tipps für Profis

  • Nutze die With-Anweisung, um den Code zu optimieren und die Lesbarkeit zu erhöhen:

    With wsKo
       ' Dein Code
    End With
  • Bevor du Zeilen löschst, überprüfe immer, ob dies die Logik deiner Schleife nicht stört. Ansonsten könnte es besser sein, die Zeilen am Ende des Prozesses zu löschen.

  • Halte den Code modular, indem du Logik in separate Subroutinen auslagerst.


FAQ: Häufige Fragen

1. Wie kann ich die Schleife anhalten, wenn eine Bedingung nicht erfüllt ist? Du kannst Exit For verwenden, um die Schleife sofort zu beenden, wenn eine bestimmte Bedingung erfüllt ist.

2. Was ist der Unterschied zwischen GoTo und Exit For? GoTo springt zu einer bestimmten Stelle im Code, während Exit For die Schleife beendet und zum nächsten Befehl außerhalb der Schleife springt. In den meisten Fällen ist Exit For die bessere Wahl, um die Lesbarkeit zu verbessern.

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Entdecke mehr
Finde genau, was du suchst

Die erweiterte Suchfunktion hilft dir, gezielt die besten Antworten zu finden

Suche nach den besten Antworten
Unsere beliebtesten Threads

Entdecke unsere meistgeklickten Beiträge in der Google Suche

Top 100 Threads jetzt ansehen
Anzeige