运行时错误 3 不使用 GoSub 返回

不正确的代码

Sub DoSomething()
    GoSub DoThis
DoThis:
    Debug.Print "Hi!"
    Return
End Sub

为什么这不起作用?

执行进入 DoSomething 程序,跳转到 DoThis 标签,打印“嗨!” 到调试输出,在 GoSub 调用后立即返回指令,打印“嗨!” 再次,然后遇到一个 Return 声明,但现在无处可,因为我们没有带到 GoSub 声明。

正确的代码

Sub DoSomething()
    GoSub DoThis
    Exit Sub
DoThis:
    Debug.Print "Hi!"
    Return
End Sub

为什么这样做?

通过在 DoThis 线标签之前引入 Exit Sub 指令,我们将 DoThis 子程序与程序体的其余部分隔离开来 - 执行 DoThis 子程序的唯一方法是通过 GoSub 跳转。

其他说明

GoSub / Return 已被弃用,应该避免使用实际的过程调用。除了错误处理程序之外,过程不应包含子例程。

这与运行时错误'20’ 非常相似 :恢复没有错误 ; 在这两种情况下,解决方案是确保正常执行路径不能在没有显式跳转的情况下进入子程序(由线标签标识)(假设 On Error GoTo 被认为是显式跳转 )。