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)
正如评论中所提到的,这就是为什么你应该总是避免GoTo和GoSub喜欢瘟疫.堆栈溢出的直接原因是您正在调用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和跟踪活动单元存在许多其他问题,但这至少应该让您更接近于可以开始对此进行更有意义的调试.