Vba 在函数中使用递归时堆栈空间不足
我的函数如下所示:Vba 在函数中使用递归时堆栈空间不足,vba,sorting,excel,recursion,Vba,Sorting,Excel,Recursion,我的函数如下所示: 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 =
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
所有内容都得到了正确的排序,但就在我收到一条消息说超出堆栈空间之后
任何帮助都将不胜感激
编辑
excel示例数据如下所示:
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
测试数据
一,
一百
一千
八,
九,
九,
五十
一百
五百
(来自F3-F12)如果删除等空行,空单元格将被视为0。如果您希望将它们留空并围绕它们进行排序,则需要实现额外的逻辑 您的第二个循环需要调整。就目前情况而言,第一次 电话1: 第一个循环将给出: 1100 8 9 9 50 100 500 1000 然后第二个循环将达到1>100并退出sub 但是。。。最好不要简单地删除exit子调用。 每次调用只调用一次SortNumber更有效 如果您只是拆下了出口接头。 然后第二个循环将达到100>8并触发递归(调用2) 电话2: 第一个循环将给出: 1 8 9 9 50 100 500 1000 然后,第二个循环将确定单元格(i+3,6)永远不会>单元格(i+4,6)并退出Sub 由于第二次呼叫已返回,我们将在中断的位置继续呼叫1。这意味着我们完成第二个循环 如果这是一个较大的数据集,则可能需要数百个递归来对数据集进行排序。当最后一次调用(假设是第104次调用)返回之前的103次调用时,例程将全部完成其第二次循环(自第104次调用返回后,数据已被排序,因此是一种浪费) 第二个循环应该简单地检查一次召回是否为nessisary,如果是,则一次召回SortNumber
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
你能分享一份电子表格样本,这样我们就可以重现这个问题吗?@vba4all我更新了question@vba4all再次更新。它来自于你的
for j=
循环中的F3-F12(而不是F4),i=9,所以你在测试一个空白单元格(F13)并因此调用无限次。@Rory我看到了这个错误,并在第二个循环中将它从“i”改为“j”。现在我没有得到错误,但它不再正确排序