VBA出堆栈错误

时间:2014-02-07 15:36:53

标签: vba excel-vba excel

当按下OnKey事件时,我有几个可以互相调用的子服务器。一段时间后,调用堆栈建立起来,我得到一个“堆栈外”错误。有清除堆栈的方法吗?或者至少在我不使用时结束sub? EG。

Sub MoveRight()
    if GetKeyState(vbKeyDown) <0 then MoveDown
  ...
  ...
sub MoveDown
    if GetKeyState(vbKeyRight) < 0 then MoveRight
  ...
  ...
 etc

3 个答案:

答案 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事件,则更广泛的问题可能就是您需要这些调用的原因。