【问题标题】:Debugging VBA, Locating Problems & Troubleshooting Methods [closed]调试 VBA、定位问题和故障排除方法 [关闭]
【发布时间】:2018-10-15 18:45:14
【问题描述】:

调试VBA代码有哪些方法?

具体来说:

  • 单步执行代码
  • 断点和停止命令
  • Debug 命令
  • 本地和观察窗口
  • 调用堆栈

【问题讨论】:

  • re:投票支持过于广泛。是的,这篇文章只用了几页纸就涵盖了广泛的问题,它为我解决了无数问题,我已经推荐了几十个人。 几分钟后就获得了 3 票? 也许您没有通读它以了解作者涵盖了多少内容。当务之急是这些内容和更多内容不会在几周内丢失。我尊重意见并欣赏不同的观点,但“即时关闭”也不是。
  • @pnuts 似乎社区中有很大一部分人不喜欢规范,并且使发布一个艰难的斗争。有些人甚至声称这个概念是无效的。请参阅this Meta answer(警告:这有点杂乱无章)和随后的讨论。
  • 顺便说一句,我想这个问题也应该是一个wiki。
  • 由于cpearson.com 不再关闭,因此此问答(除了过于宽泛之外)现在是多余的。
  • @ashleedawg:你没有事先讨论过这个问题。你只是做了,然后宣布“哦,是的,我做了这个”。我敢肯定你的意图是光荣的,但事实是,这个问题不适合 Stack Overflow,而且它是冗余。该网站将被保留。

标签: vba debugging breakpoints callstack computation-theory


【解决方案1】:

调试 VBA 代码

本页介绍了调试 VBA 代码的方法。


简介

调试程序是软件开发中最重要的步骤之一。了解 VBA 的调试工具可以使调试更容易、更高效。本页介绍了几个 VBA 的内置调试工具,您可以在测试和调试应用程序时使用。


单步执行代码

调试代码的第一种方法是一次单步执行代码。要单步执行代码,请将光标放在要分析的第一行代码上,然后按 F8 或在 Debug 菜单上选择 Step Into。下一行要执行的代码将以黑色字体显示在黄色背景中。请注意,突出显示的代码行尚未执行——它是下一行要执行的。

如果您的代码调用另一个过程,使用 F8 单步执行代码将导致执行以逐行顺序进入被调用的过程。如果您想不单步执行被调用的过程,请按 Shift+F8。这将执行被调用的过程,然后在调用过程后在代码行上暂停。如果您已经在逐步执行某个过程,则可以按 Ctrl+ F8 逐行恢复代码执行。任何时候您在逐步模式或断点处暂停(见下文),您都可以在 RunF5 或 Continue /strong> 菜单使 VBA 运行完成或直到遇到暂停语句。

当您在逐步模式下暂停时,您可以从即时窗口查询或更改变量的值。


断点和停止命令

断点是放置在代码行上的标记,它会在执行该行之前立即暂停执行。您可以通过将光标放在有问题的代码行上并按 F9,在 Debug 上选择 Toggle Breakpoint 来为代码行添加断点strong> 菜单,或单击代码行旁边的左边距。设置断点后,该行以砖红色背景显示,带有白色字体。当您运行代码时,执行将在带有断点的代码行之前暂停,并以黄色背景和黑色字体显示。请注意,黄色行尚未执行——它是下一行要运行的代码。

当代码在断点处暂停时,您可以在“立即”窗口中发出命令来更改或查询变量的值。要查看变量的内容,请输入 ?字符后跟变量名称,然后按 Enter。您可以通过在即时窗口中输入 VariableName = NewValue 并按 Enter 来更改变量的值。

如果即时窗口不可见(通常位于 VBA 编辑器屏幕的底部),请按 Ctrl+G 或选择 即时窗口查看菜单使窗口可见。

要删除断点,请将光标放在代码行上并按F9。您可以通过从 Debug 菜单中选择 Clear All Breakpoints 或按 Ctrl+Shift+F9。 VBA 还提供 Stop 命令。这只是停止该行代码上的代码执行并进入中断模式。

完成代码调试后,请务必返回并清除所有断点(从 Debug 菜单中选择 Clear All Breakpoints或按 Ctrl+Shift+F9) 并确保删除或注释掉所有 Stop 语句。

当您在断点处暂停或处于分步模式时,您可以更改要执行的下一行,可以在当前行之前重新运行一段代码,也可以在该行之后跳过语句.右键单击要恢复执行的行并右键单击并选择 Set Next Statement 或从 Run 菜单中选择 Set Next Statement .将在选定的代码行处继续执行。


调试命令

VBA 提供了一个带有两个属性 Print 和 Assert 的 Debug 对象,您可以使用它们来显示变量的值并控制程序流程。 Debug.Print 会将后面的内容写入立即窗口。代码执行不会中断。在立即窗口中显示文本后,代码执行将继续运行。您可以在Debug.Print 语句中将文字文本与变量名混合使用。例如,

Debug.Print "The value of variable X is: " & X

您可以在“立即”窗口中同时显示多个变量,方法是用逗号分隔它们。例如,

Debug.Print X, Y, Z

Debug.Assert 命令是一个条件断点,如果 Assert 语句后面的表达式为 False,它将导致在 Debug 语句上暂停执行。例如,

Debug.Assert Var >= 0

如果Var >= 0False,这将在Debug.Assert 语句上暂停;也就是说,如果Var 为负数,它将暂停。当条件为 False 而不是 True 时暂停执行可能看起来倒退了,但 Assert 方法是从 C 语言中采用的,其用法与 C 中的用法相同。

完成调试后,请务必删除或注释掉 Debug.PrintDebug.Assert 语句。您通常不希望这些语句在您的应用程序的正常使用期间起作用。


当地人窗口

局部变量窗口允许您在单步执行过程时查看过程中所有变量的值。要显示 Locals 窗口,请从 View 菜单中选择 Locals Window。使用 Locals 窗口显示变量值比检查 Immediate 窗口中的值更容易。对于简单的变量类型(例如,Long 和 String 变量),值显示在一行上。对于复杂类型或对象(例如 Range 变量),其属性显示在可折叠的树状结构中。


监视窗口

Watch 窗口显示所有有效的 Watch。您可以通过从 查看 菜单中选择 Watch Window 来显示 Watch 窗口。 Watch 是 VBA 的指令,用于在表达式为 True 或被监视的变量更改值时暂停代码。要在变量上创建 Watch,请打开 Watch 窗口并右键单击 Watch 窗口并从弹出菜单中选择 Add Watch... 或选择 Add Watch... em> 从调试窗口。在“添加观察”对话框中,在“表达式”文本框中输入要观察其值的变量名称。然后选择值更改时中断。当您运行代码时,执行将在修改变量值的行之后的行处暂停。当代码暂停时,变量的值已经被更新了。

要删除手表,请在“手表”窗口中右键单击它,然后从弹出菜单中选择删除手表。要修改 Watch,请在 Watch 窗口中右键单击它,然后从弹出菜单中选择 Edit Watch


调用栈

调用堆栈是由 VBA 维护的一种数据结构,用于跟踪哪个过程调用了另一个过程。例如,如果过程AAA 调用BBB,而后者又调用CCC,则调用堆栈窗口将显示从最近的过程开始的过程列表,然后在其下方显示为到达当前过程而执行的过程链位置。您可以通过从查看菜单中选择调用堆栈来查看调用堆栈。这对于跟踪在当前位置结束的执行流程很有用。不幸的是,没有编程方式从调用堆栈中获取信息。


来源:Pearson Software Consulting 的 Chip Pearson:http://www.cpearson.com/Excel/DebuggingVBA.aspx

【讨论】:

  • 我将此答案标记为可能侵犯版权。
  • @RobertColumbia - 您(或模组,或任何人)可以直接与我联系,以解决任何有关合法性的问题。功课已经完成,投入了几个小时,尽职调查已经完成..(我的联系信息在相关meta 帖子的底部,以及my profile./ashleedawg?tab=profile 上)。
  • 这个答案是多余的,就像site is back online
  • @pnuts:不,应该关闭问题。
  • @pnuts:多余的问题也使答案变得多余。我们可以永远争论语义,但这毫无意义。
猜你喜欢
  • 2014-04-25
  • 2021-11-01
  • 2017-08-01
  • 2014-04-27
  • 2023-03-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多