我的功能如下:
Sub sortNumbers()
Dim i As Integer
Dim j As Integer
Dim highestNumber As Integer
For i = 1 To 8
If IsEmpty(Cells(i + 4, 6).Value) = False Then
If Cells(i + 3, 6).Value > Cells(i + 4, 6).Value Then
highestNumber = Cells(i + 3, 6).Value
Cells(i + 3, 6).Value = Cells(i + 4, 6).Value
Cells(i + 4, 6).Value = highestNumber
End If
End If
Next i
For j = 1 To 8
If IsEmpty(Cells(j + 4, 6).Value) = False Then
If Cells(i + 3, 6).Value > Cells(i + 4, 6).Value Then
Call sortNumbers
Else
Exit Sub
End If
End If
Next j
End Sub
所有内容都已正确排序,但在我收到Out of stack space
非常感谢任何帮助!
修改
excel示例数据如下所示:
测试数据
1
100
1000
8
9
9
50
100
500
(来自F3-F12)
答案 0 :(得分:1)
如果删除IsEmpty行,则空单元格将被视为0.如果您希望将它们留空并对它们进行排序,则需要使用其他逻辑。
您的第二个循环需要调整。按原样,第一次
致电1: 第一个循环将给出: 1 100 8 9 9 50 100 500 1000
然后第二个循环将达到1> 100并退出sub。
但是......最好不要简单地删除exit子调用。 每次调用只调用一次sortNumbers会更有效率。
如果您只是删除了退出子。 然后第二个循环将达到100> 8并触发递归(Call 2)。
致电2: 第一个循环会给出: 1 8 9 9 50 100 100 500 1000
然后第二个循环将确定单元格(i + 3,6)永远不会>单元格(i + 4,6)并退出Sub。
自从第二个电话回来后,我们继续拨打电话1。这意味着我们完成了第二次循环。
如果这是一个较大的数据集,则可能需要进行数百次递归才能对数据集进行排序。当最后一次调用(让我们说它的第104次调用)返回前面的103个例程调用时,它们都将完成第二次循环(自从第104次调用返回后,数据已经被排序,因此是浪费)
第二个循环应该只检查召回是否为nessisary,如果是,则调用sortNumbers一次。
Sub sortNumbers()
Dim i As Integer
Dim j As Integer
Dim highestNumber As Integer
For i = 1 To 8
If Cells(i + 3, 6).value > Cells(i + 4, 6).value Then
highestNumber = Cells(i + 3, 6).value
Cells(i + 3, 6).value = Cells(i + 4, 6).value
Cells(i + 4, 6).value = highestNumber
End If
Next i
Dim ReCall As Boolean
ReCall = False
For i = 1 To 8
If Cells(i + 3, 6).value > Cells(i + 4, 6).value Then
ReCall = True
i = 8
End If
Next i
If ReCall Then Call sortNumbers
End Sub