当按下OnKey事件时,我有几个可以互相调用的子服务器。一段时间后,调用堆栈建立起来,我得到一个“堆栈外”错误。有清除堆栈的方法吗?或者至少在我不使用时结束sub? EG。
Sub MoveRight()
if GetKeyState(vbKeyDown) <0 then MoveDown
...
...
sub MoveDown
if GetKeyState(vbKeyRight) < 0 then MoveRight
...
...
etc
答案 0 :(得分:3)
“Out of Stack”是严重致命错误。清除它的方法是重新启动Excel。虽然重启VBA可能就足够了,但我肯定不会相信它。
这里的问题是你已经编写了一对带有无限递归的方法。不要那样做。最简单的一般修复方法是让您的例程设置静态标志以防止重新进入:
Sub MoveRight()
Static InUse As Boolean
If InUse Then Exit Sub
InUse = True
if GetKeyState(vbKeyDown) <0 then MoveDown
...
...
InUse = False
End Sub
更具体的解决方案需要了解您实际上要做的事情,这在此时看起来非常可疑。
答案 1 :(得分:3)
显示的代码有点过分,但是,如果你同时按下“向下”和“向右”,你的代码会在subs之间进行循环调用,这是一个永远不会返回的调用循环,所以堆栈会溢出很快。 最好检查subs(伪代码)之外的密钥:
if (key_down is pressed)
call do_move_down
if (key_right is pressed)
call do_move_right
...
...
答案 2 :(得分:0)
您正在递归调用MoveRight()
和MoveDown()
方法。
您测试GetKeyState
的来电应该位于存根/事件处理程序之外。
如果您已经正确配置了OnKey
事件,则更广泛的问题可能就是您需要这些调用的原因。