2017-10-25 3 views
2

Ich versuche, einen Code einzurichten, der eine Nachricht anzeigt, wenn der Wert einer Zelle höher ist als jede der 5 vorherigen Zellen in derselben Spalte.Double Loop absoluter Wert

Dies ist mein Code:

Sub IncreasingFor_5Steps() 

Dim i, j As Integer 

For i = 7 To 20 
    For j = 1 To 5 
     If Cells(i, 5).Value > Cells(i - j, 5).Value Then  
      Cells(i, 6) = "Increased for 5 steps"  
     End If   
    Next j 
Next i 

End Sub 

Wenn ich diesen Code ausführen, wird die Meldung „für 5 Stufen erhöht“ angezeigt wird, wenn die Zelle höher als mindestens eine Zelle ist (über die 5 vorherigen Zellen), aber was ich möchte ist die Nachricht nur anzeigen, wenn die Zellen höher als alle 5 vorherigen Zellen ist, aber ich weiß nicht, wie zu tun ist.

Siehe zum Beispiel in F7 wird die Nachricht angezeigt, während E7 niedriger als E4 ist, auch E20 ist niedriger als E19, aber die Nachricht wird angezeigt, weil E20 höher ist als E15, E16, E17, E18, aber ich don ‚t wollen, dass:

enter image description here,

Antwort

1

Versuchen Sie, wie diese benötigen Sie einen boolean Flagge um es zu gehen:

Sub IncreasingFor_5Steps() 

    Dim i  As Integer, j As Integer 
    Dim flag As Boolean 

    For i = 7 To 20 
     flag = False 
     For j = 1 To 5 
      If Cells(i, 5).Value <= Cells(i - j, 5).Value Then 
       flag = True 
      End If 
     Next j 
     If Not flag Then Cells(i, 6) = "Increased for 5 steps" 
    Next i 

End Sub 

Die Idee des boolean-Flag ist, dass sie alle 5 Zellen für kleiner sind überprüft und wenn einer von ihnen nicht kleiner ist, wird es dann true Wenn es wahr ist, wird die Cells(i,6) nicht erhöht.

1

enter image description here Sie es tun können, einfach mit dieser Formel:

=IFERROR(IF(MAX(OFFSET(E1,-5,0))<E1,"Increased for 5 steps",""),"")

1

Ist dies in VBA erforderlich? Würde diese Formel in F7 platziert und nach unten gezogen?

=IF(E7>MAX(E2:E6),"Increased for 5 steps","") 
0

Wenn SieVBA verwenden möchten, können Sie die WorksheetFunction.Max verwenden Sie den Maximalwert in einem bestimmten Bereich zu bekommen, und somit entfällt die Notwendigkeit, 2 For Schleifen zu haben.

Option Explicit 

Sub IncreasingFor_5Steps() 

Dim i As Long 

For i = 7 To 20 
    ' use WorkshettFunction Max instead of a 2nd loop 
    If Cells(i, 5).Value > WorksheetFunction.Max(Range(Cells(i - 5, 5), Cells(i - 1, 5))) Then 
     Cells(i, 6) = "Increased for 5 steps" 
    End If 
Next i 

End Sub