Excel VBA-嵌套…下一个循环比较两个值 – 不循环范围内的所有值

我正在编写一个macros,根据值是否上移/下移四分之一或者四分之一保持相同的季度来自动执行符号(上/下箭头,等号)的手动select。

我正在使用三个FOR EACH …. NEXT循环,每个循环都有自己的嵌套if,elseif,else语句。 我想正确的方法来处理这是第一个循环运行通过第一个旧的值(例如A1),并将其分配到适当的UDF桶中,其中分配四分位数。 一旦循环结束,让新循环运行相同的程序。 一旦两个值都被赋值,第三个循环将比较两个四分位数,然后进行符号input。 然后,它将重新开始并遍历指定范围内的所有单元格,直到所有单元格均被设置。

循环看起来是正确的迭代,但似乎并没有达到范围内的所有值。

我认为我的问题是循环的设置方式。 有谁知道更好的方法来处理这个?

理想情况下,代码查看b列中的第一个值,并为“currentQuart”variables赋值,然后循环到列a中,并为“oldQuart”variables赋值。 一旦完成,第三个循环比较两个值,并根据操作员input一个字符。

存储在模块中的函数:

函数quartOne(ByVal cellValue As Variant)As Boolean quartOne =(cellValue> = 0.01 And cellValue <= 25)End Function

Function quartTwo(ByVal cellValue As Variant) As Boolean quartTwo = (cellValue >= 25.01 And cellValue <= 50) End Function Function quartThree(ByVal cellValue As Variant) As Boolean quartThree = (cellValue >= 50.01 And cellValue <= 75) End Function Function quartFour(ByVal cellValue As Variant) As Boolean quartFour = (cellValue > 75) End Function 

Sub CommandButton1_Click()

 Dim cellOld As Range, cellCurrent As Range, cell As Range Dim oldRng1 Dim currentRng1 As Range Dim oldQuart As Integer Dim currentQuart As Integer Set oldRng1 = ActiveSheet.Range("A1:A4") Set currentRng1 = ActiveSheet.Range("B1:B4") For Each cellCurrent In currentRng1.Cells For Each cellOld In oldRng1.Cells For Each cell In currentRng1.Cells 'checks cellCurrent against functions in module and assigns variable If quartOne(cellCurrent.Value) Then currentQuart = 1 ElseIf quartTwo(cellCurrent.Value) Then currentQuart = 2 ElseIf quartThree(cellCurrent.Value) Then currentQuart = 3 ElseIf quartFour(cellCurrent.Value) Then currentQuart = 4 Else End If 'checks cellOld against functions in module and assigns variable If quartOne(cellOld.Value) Then oldQuart = 1 ElseIf quartTwo(cellOld.Value) Then oldQuart = 2 ElseIf quartThree(cellOld.Value) Then oldQuart = 3 ElseIf quartFour(cellOld.Value) Then oldQuart = 4 Else End If 'takes variable from above loops, runs through if/else and inputs corresponding character If currentQuart = 1 And oldQuart = 1 Then cell.Offset(, 1).Value = ChrW(&H3D) ElseIf currentQuart = 1 And oldQuart > 1 Then cell.Offset(, 1).Value = ChrW(&H2191) ElseIf currentQuart = 2 And oldQuart < 2 Then cell.Offset(, 1).Value = ChrW(&H2193) ElseIf currentQuart = 2 And oldQuart = 2 Then cell.Offset(, 1).Value = ChrW(&H3D) ElseIf currentQuart = 2 And oldQuart > 2 Then cell.Offset(, 1).Value = ChrW(&H2191) ElseIf currentQuart = 3 And oldQuart > 3 Then cell.Offset(, 1).Value = ChrW(&H2191) ElseIf currentQuart = 3 And oldQuart = 3 Then cell.Offset(, 1).Value = ChrW(&H3D) ElseIf currentQuart = 3 And oldQuart < 3 Then cell.Offset(, 1).Value = ChrW(&H2193) ElseIf currentQuart = 4 And oldQuart < 4 Then cell.Offset(, 1).Value = ChrW(&H2191) ElseIf currentQuart = 2 And oldQuart = 4 Then cell.Offset(, 1).Value = ChrW(&H3D) End If Exit For Next cell Next cellOld Next cellCurrent End Sub 

!testing数据在列ab中以单个值(1-100)存储!

你正在运行太多的循环。

只需循环一次循环标准,并逐行比较每个单元格。

 Sub CommandButton1_Click() Dim i As Long Dim oldRng1 As Range Dim currentRng1 As Range Dim oldQuart As Integer Dim currentQuart As Integer Set oldRng1 = ActiveSheet.Range("A1:A4") Set currentRng1 = ActiveSheet.Range("B1:B4") For i = 1 To currentRng1.Rows.Count 'checks cellCurrent against functions in module and assigns variable If quartOne(currentRng1(i, 1).Value) Then currentQuart = 1 ElseIf quartTwo(ccurrentRng1(i, 1).Value) Then currentQuart = 2 ElseIf quartThree(currentRng1(i, 1).Value) Then currentQuart = 3 ElseIf quartFour(currentRng1(i, 1).Value) Then currentQuart = 4 Else End If 'checks cellOld against functions in module and assigns variable If quartOne(oldRng1(i, 1).Value) Then oldQuart = 1 ElseIf quartTwo(oldRng1(i, 1).Value) Then oldQuart = 2 ElseIf quartThree(oldRng1(i, 1).Value) Then oldQuart = 3 ElseIf quartFour(oldRng1(i, 1).Value) Then oldQuart = 4 Else End If 'takes variable from above loops, runs through if/else and inputs corresponding character If currentQuart = 1 And oldQuart = 1 Then currentRng1(i, 1).Offset(, 1).Value = ChrW(&H3D) ElseIf currentQuart = 1 And oldQuart > 1 Then currentRng1(i, 1).Offset(, 1).Value = ChrW(&H2191) ElseIf currentQuart = 2 And oldQuart < 2 Then currentRng1(i, 1).Offset(, 1).Value = ChrW(&H2193) ElseIf currentQuart = 2 And oldQuart = 2 Then currentRng1(i, 1).Offset(, 1).Value = ChrW(&H3D) ElseIf currentQuart = 2 And oldQuart > 2 Then currentRng1(i, 1).Offset(, 1).Value = ChrW(&H2191) ElseIf currentQuart = 3 And oldQuart > 3 Then currentRng1(i, 1).Offset(, 1).Value = ChrW(&H2191) ElseIf currentQuart = 3 And oldQuart = 3 Then currentRng1(i, 1).Offset(, 1).Value = ChrW(&H3D) ElseIf currentQuart = 3 And oldQuart < 3 Then currentRng1(i, 1).Offset(, 1).Value = ChrW(&H2193) ElseIf currentQuart = 4 And oldQuart < 4 Then currentRng1(i, 1).Offset(, 1).Value = ChrW(&H2191) ElseIf currentQuart = 2 And oldQuart = 4 Then currentRng1(i, 1).Offset(, 1).Value = ChrW(&H3D) End If Next i End Sub