获取"Out of Stack Space error",不知道为什么/我在代码中有递归的位置

DK9*_*K92 2 excel vba excel-vba

我有一个Excel/Vba程序,它通过excel中网格上的命令按钮"输入"一个"点",输入"点"的列中的所有行然后用于评分该点的"适用性".放在网格中(原因我现在不会进入).

我正在尝试编写另一个命令按钮代码,其中说:

如果我输入"点"&(由于其他标准等),该列的[第79行] ="p",则复制该列的[第75行]中的值.(我们称之为"Aboverow"

然后沿[行79]向后搜索(到C列)所有存在于其中的"r"的单元/列.

对于其中存在"r"的每个列,将"Aboverow"值粘贴到该列的[row 80]中.

我已经为此编写了代码,但我一直在"出堆栈空间错误",我试图调试它,但我不确定我哪里出错了.代码如下.任何帮助将非常感谢.

Private Sub commandButton12_Click()

    For Checkcol = 3 To 801

        Dim Isnote As Variant

        GoSub Isnote

Isnote:
        If Cells(78, Checkcol) <> "o" Then
            GoSub Isap
        Else
        End If

        Dim Isap As Variant        
Isap:
        If Cells(80, Checkcol) = "p" Or Cells(80, Checkcol) = "pf" Or Cells(80, Checkcol) = "ps" Then
            GoSub Myprocess
        ElseIf Cells(80, Checkcol) = "r" Or Cells(80, Checkcol) = "rf" Or Cells(80, Checkcol) = "rs" Then
        End If

        Dim Myprocess As Variant

        Dim Reg As Variant    
        Reg = "r"        

        Dim Rainj As Variant

        If ActiveCell.Column = Range("J79") Then
            Rainj = Range("J79") & ("C79")
        End If

        Dim Aboverow As Variant

Aboverow:
        If ActiveCell.Column = Range("J79") Then
            Range("J75").Select
            Selection.Copy
        End If

        Dim Belowrow As Variant    
Belowrow:
        If Range("I79") = Reg Then
            Range("I80").Select
        End If

Myprocess:
        GoSub Aboverow
        For Each Reg In Rainj
            GoSub Belowrow
            Selection.Paste
        Next Reg
    Next

End Sub
Run Code Online (Sandbox Code Playgroud)

Com*_*ern 5

正如评论中所提到的,这就是为什么你应该总是避免GoToGoSub喜欢瘟疫.堆栈溢出的直接原因是您正在调用GoSub并且没有任何Return语句.这意味着在这部分代码中(我注意到的第一个无限递归,但可能不是唯一的一个)...

Aboverow:
        If ActiveCell.Column = Range("J79") Then
            Range("J75").Select
            Selection.Copy
        End If

        Dim Belowrow As Variant

Belowrow:
        If Range("I79") = Reg Then
            Range("I80").Select
        End If

Myprocess:
        GoSub Aboverow
        For Each Reg In Rainj
            GoSub Belowrow
            Selection.Paste
        Next Reg
Run Code Online (Sandbox Code Playgroud)

...您的exceution从与线跳跃GoSub Belowrow,那么它属于右后卫到下面的代码Myprocess:标签,它跳到上面Belowrow:标签,它回落到下面的代码Belowrow:标签,这...你的想法.


虽然您可以尝试使用Return退出"Subs",但由于这个原因,这种编码风格在20世纪70年代的某个时候就会消失.如果你需要一个子程序,你应该做一个子程序.请注意,这只是一个示例 - 流量控制足够复杂,我不知道代码应该做什么:

Sub AboveRow()
    If ActiveCell.Column = Range("J79") Then
        Range("J75").Select
        Selection.Copy
    End If
End Sub

Sub BelowRow()
    If Range("I79") = Reg Then
        Range("I80").Select
    End If
End Sub

Sub Myprocess()
    AboveRow
    For Each Reg In Rainj
        BelowRow
        Selection.Paste
    Next Reg
End Sub
Run Code Online (Sandbox Code Playgroud)

然后上面引用的代码将变为:

    AboveRow
    BelowRow
    Myprocess
Run Code Online (Sandbox Code Playgroud)

请注意,依赖Select和跟踪活动单元存在许多其他问题,但这至少应该让您更接近于可以开始对此进行更有意义的调试.