Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Vba 在函数中使用递归时堆栈空间不足_Vba_Sorting_Excel_Recursion - Fatal编程技术网

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”。现在我没有得到错误,但它不再正确排序