2016-06-15 45 views
0

geht:Wie eine IF-Anweisung wiederholen itslef machen, wenn es ich dieses Stück Code muss sonst

If IsEmpty(Cells(8, M8 + 9).Value) And IsEmpty(Cells(12, M8 + 9).Value) Then 
    Sheets("Sheet3").Cells(8, M8 + 9).Value = info 
    Sheets("Sheet3").Cells(12, M8 + 9).Value = "--------------" 
    Sheets("Sheet3").Range(Cells(8, M8 + 9), Cells(12, M8 + 9)).Interior.Color = RColor 
    M8 = M8 + 1 
Else 
    M8 = M8 + 1 
End If 

ich mich gefragt, ob es eine Möglichkeit ist, dass, wenn die erste Bedingung der nicht erfüllt ist, und geht Else Verzweigung, um 1 zur VariablenAhinzuzufügen. Wenn ich 1 zu hinzufüge, möchte ich, dass es wieder nach oben geht und wiederhole die if-Anweisung mit dem neuen Wert .

+0

Ich denke, eine 'GoTo' Aussage ist genau das, was Sie suchen. Wenn Sie Ihre Werte nicht in else setzen, so dass die if-Anweisung letztendlich besteht, wird sie für immer wiederholt. –

+0

Sie sollten 'M8' wahrscheinlich in etwas Sinnvolles umbenennen. Wenn Sie 'M7',' M6', 'M5',' M4', 'M3',' M2' und 'M1' ebenfalls haben, benötigen Sie wahrscheinlich ein Array anstelle von nummerierten Variablen. Normalerweise, wenn Sie denken "Ich möchte etwas wiederholen, bis eine Bedingung erfüllt ist", dann brauchen Sie eine Schleife. –

Antwort

2

Verwenden Sie keine If? Dies würde eine Schleife durchlaufen, bis die angegebene Bedingung nicht mehr erfüllt ist. aber wie Gary oben erwähnt ist es möglich, in eine Endlosschleife zu bekommen, also habe ich eine zusätzliche Kriterien hinzugefügt, um die Schleife zu brechen, wenn es für 100 Iterationen auf geht

iTried = 0 
While IsEmpty(Cells(8, M8 + 9).Value) And IsEmpty(Cells(12, M8 + 9).Value) = True And iTried <=100 
    Sheets("Sheet3").Cells(8, M8 + 9).Value = info 
    Sheets("Sheet3").Cells(12, M8 + 9).Value = "--------------" 
    Sheets("Sheet3").Range(Cells(8, M8 + 9), Cells(12, M8 + 9)).Interior.Color = RColor 
    M8 = M8 + 1 
Wend 
' Now check WHY the loop ended... if the cells are empty and the counter is >100 throw a msgbox 
If IsEmpty(Cells(8, M8 + 9).Value) And IsEmpty(Cells(12, M8 + 9).Value) = True And iTried >100 Then 
    MsgBox "Too many tries; gave up!" 
End If 
+2

Die Schleife wird nicht endlos sein. Wenn 'M8' ein' Integer' ist, wird es überlaufen, wenn sein Wert 32768 erreicht. Es dauert etwas länger, wenn es ein 'Long' ist, aber es wird irgendwann überlaufen. –

+1

Ich denke nicht daran, um ehrlich zu sein, aber ich würde immer noch lieber seinen Ausgangspunkt selbst steuern, danke für die Klarstellung – Dave

+0

Ich habe diese Antworten als eine Schleife upvoted ist die bevorzugte/bessere Methode. –

2

Sie müssen sich an diese aus der anderen Richtung kommen . Wenn Sie M8 benötigen eine bestimmte Bedingung zu erfüllen, stellen Sie sicher, dass die Bedingung erfüllt ist vor Sie etwas anderes tun:

Dim aborted As Boolean 
Do While Not (IsEmpty(Cells(8, M8 + 9).Value) And IsEmpty(Cells(12, M8 + 9).Value)) 
    M8 = M8 + 1 
    If M8 > 100 Then 'Or whatever your "give up" condition is 
     aborted = True 
     Exit Do 
    End If 
Loop 

If Not aborted Then 
    Sheets("Sheet3").Cells(8, M8 + 9).Value = info 
    Sheets("Sheet3").Cells(12, M8 + 9).Value = "--------------" 
    Sheets("Sheet3").Range(Cells(8, M8 + 9), Cells(12, M8 + 9)).Interior.Color = RColor 
End If