【问题标题】:Find Error Line Number in VBA在 VBA 中查找错误行号
【发布时间】:2016-04-11 16:06:05
【问题描述】:

我试图找到我的代码崩溃的行号,但是这个网站上的许多解释对于我的水平来说似乎很复杂。

我的代码基本上如下,我不知道它在哪里中断。

Sub1   
    Call function1  
    Call function2  
End Sub  

本网站上的其他答案似乎只是一个简短的功能。但我不知道在我的代码中在哪里调用该函数或如何获取弹出消息。如果我打算将我的 sub1 代码放入他们的函数中,我也不知道在哪里。初学者在这里。

【问题讨论】:

  • 当您在提示符下按Debug 时,您没有转到发生错误的代码吗?也应该是Sub One() 而不是Sub1
  • "我的代码基本如下"。您是否有任何理由发布“基本上”是您的代码而不是您的实际代码的内容?

标签: vba


【解决方案1】:

如果您的代码没有行号,那么 VBA 无法为您提供行号

可以编写 VBA 并使其看起来像 1980 年那样:

Sub1
On Error GoTo 100
10   Call Function1
20   Call Function2
90   Exit Sub
100  Debug.Print Err.Message & " on line " & Erl
End Sub

但你不想那样做。真的,您不需要行号。

您需要更小的函数来处理运行时错误

On Error GoTo ErrHandler

当发生运行时错误时,执行跳转到名为ErrHandler行标签

     ...
     Exit Sub
ErrHandler: '<< the line label is denoted with a colon

该处理程序中发生了什么?如果您正在调试,您可能只想在那里执行 Stop 并检查您的本地人:

    Stop

然后在下一行添加Resume,然后按F8 进入它。 Resume 将返回导致错误的调用。如果这是一个函数调用,那么您需要在该函数中处理运行时错误。

确保您永远不会在生产代码中留下StopResume 指令:

Sub WhenWillThisEnd()
    On Error GoTo ErrHandler
    Debug.Print 42/0
    Exit Sub
ErrHandler:
    Resume 'jumps back to the line that caused the error
    Resume Next 'resumes execution on the line right after the one that went boom
End Sub

【讨论】:

  • 我不知道Erl,尽管我已经为 VBA 编程了十多年。我喜欢 Stack Overflow——你每天都能学到新东西。
  • 我也是,VBA 5 年,现在只有我在想这个。曾经有一段时间我看到有人的代码用数字标记每一行,并在想为什么 h*** 有人会标记每一行......现在我知道为什么了:D
  • 这个代码块是否意味着它的执行永远不会结束?而且,这与On Error Resume Next<...code...>On Error GoTo 0 组合相同吗?我只是试图将此处显示的错误处理与我发现最常见的错误处理相协调。
  • @KarthickGanesan On Error Resume Next 抑制错误处理,允许继续执行下一条语句,而不是跳转到处理程序子例程。明智地使用它,因为这样很容易让你大吃一惊:总是限制允许在未处理的错误状态下运行的语句 - On Error GoTo 0 通过清除错误上下文来恢复错误处理,使下一个运行时错误未处理,并防止 OERN 在其范围之外“泄漏”(这是一种极端情况:通常在过程退出时使用 OERN 重置错误上下文;最好对 OEG0 进行系统化)。
  • 另外,是的,底部的 sn-p 是一个(隐式)无限循环,最终会挂起主机 - 不要在没有断点 (F9) 和单步执行 (F8) 的情况下运行调试器!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-03-15
  • 2011-08-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-06-02
相关资源
最近更新 更多