在函数中使用递归时堆栈空间不足

时间:2014-11-18 12:01:35

标签: vba sorting excel-vba recursion 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

所有内容都已正确排序,但在我收到Out of stack space

的消息后

非常感谢任何帮助!

修改

excel示例数据如下所示:

测试数据

1

100

1000

8

9

9

50

100

500

(来自F3-F12)

1 个答案:

答案 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