分享

VBA从零学习之12——如何调试程序

 L罗乐 2017-10-03

  首先公布上一期VBA从零学习之11——自定义函数(公式)及返回值的课后问题的答案

1、首先插入一个模块

2、定义Function:Function 拼接( ByVal Target As Range ) As String

3、在Function中编写代码

    Dim v_Cell As Range

    For Each v_Cell In Target

        拼接 = 拼接 & v_Cell

    Next

4、在单元格中使用自定义公式就可以了,如:=拼接('A4:C4')




  在第一期中,我列出了自己学习VBA的三种主要方式:

1、看别人现成的代码

2、以Debug的方式研究Office的对象结构

3、遇到解决不了的问题,上网咨询

其中:

1、看别人现成的代码,如果看不懂,可以按F1打开帮助系统查看帮助,或者是上网查询解释

2、以Debug的方式研究,需要我们掌握Debug(即:调试)的方式方法

3、可以比较宽泛的搜索,也可以上ExcelHome等网站进行咨询


准备代码:

  这一期,我们以九九乘法表为例,重点讲述如何使用VBA中的代码调试的功能。首先,我们准备好九九乘法表的代码:

我们可以选择调试其中任何一段代码,或者调试双For循环的。


设置断点:

  首先解释一下断点。

还是拿出我们讲循环的时候说的例子:

我们在上班的时候,循环的检查自己还有没有未完成的工作,并一件件的去完成这些工作。


那断点是什么呢?

假如时间停住,就会对我们当前的工作状态有一个快照。我们在这个快照里,可以看到:

1、当前的日期、时间

2、今天的工作清单,包括我们已经完成的,我们正在进行的,我们还未完成的

3、每一项工作的内容是什么(当然在快照里,我们可能更关注当前工作的内容)

4、当前工作完成的进度

5、其他……

而对应到VBA程序里,我们可以查看程序中每个变量的类型、值、子成员等


断点的作用是什么?

1、在断点里,我们可以获取快照里的所有数据,并进行详细的分析

2、如果代码执行有问题,我们可以在断点里,检验我们预设的逻辑和执行逻辑的差异,并对代码进行调整。这就是调试——Debug

3、我们在断点里,可以更改某些属性的值


如何设置断点:

在每行代码的左侧,点一下即可设置断点,再点一下即可取消

(说明:Dim这种定义变量的语句[属于定义语句],是不能设置断点的。只有执行语句可以设置断点。)

断点设置完成后,代码窗口就变成了下面的样子:


代码调试:

  像往常一样,我们在代码中按下F5执行代码,代码窗口又变成了如下的样子:

如果我们把鼠标悬停在i上,会显示一个i = 0的提示框。它的含义是:程序一开始运行至此处时,i的值为0。


接下来我们认识调试的按键。

在工具栏-“调试”菜单中,我们看到有以下的菜单项。我们对其中常用的进行介绍:

1、F8,VBA调试时最常用的按键。执行进入当前的代码。

  • 如果当前代码中有自定义的Sub或Function,则进入到自定义的Sub或Function中

  • 如果当前代码中没有自定义的Sub或Function,执行到下一行代码

2、Shift F8,执行到下一行代码。与上一条的区别在于,不会执行进入到自定义的Sub或Function中

3、Ctrl Shift F8,跳出当前代码块。如果在自定义的Sub或Function中,则跳出Sub或Function代码块

4、Ctrl F8,执行到鼠标所在位置的代码


监控属性的值:

每次都把鼠标悬停在变量上,可以查看属性的值,但是:

1、每次只能查看一个属性

2、需要等待一小段时间才能显示值

那我们还有别的方法吗?有!

1、我们选中要监控的变量或一段代码,点右键,选择“添加到监视”。然后在弹出的对话框中,选择确定,如下图:

之后会出现一个监视的窗口,我们可以根据习惯拖拽此窗口到屏幕右侧或下方。

监视窗口中:

1、Expression为表达式,即一个变量或一段代码

2、Value为一段代码或变量的值

3、Type是变量的类型

4、Context是表达式所在的上下文

(关于上下文,先有个基本的了解:

如果我们有两个Sub,分别是MySub1、MySub2,每个Sub中都有变量i。

那么MySub1中的i和MySub2中的i是不同的,在同一个快照里,它们的值也不一样)


手动添加监控对象:

我们说了,Expression是一段代码或变量,那么我们可以在监视窗口中点右键,添加一些表达式进行监控。

添加的时候:

说明:

1、Procedure和Module代表的就是上下文

2、监视类型里,Break When Value Is True,意思是当变量为真的时候,程序自动进入断点状态

3、Break When Value Changes,意思是当变量的值发生变动时,程序自动进入断点状态

(也就是说,程序会在以下几种情况下进入断点状态:

a,执行到设置的断点时

b,根据监视表达式及类型的设置,满足某值为真的条件时

c,根据监视表达式及类型的设置,在值发生变化时)


如下图:

说明:

1、Sheet1.Range('A1')的值为1×1=1,类型为Object类型的子类型Range。

(“/”为下一级类型的意思。另外,因为我已经执行过一遍宏代码,所以Sheet1.Range('A1')的值为1×1=1。)

2、[A1].Value的类型为Variant的子类型String

3、i、i*j、j的类型都为Long类型


调试程序:

进行完以上设置,我们可以按F8一步步调试程序了,并且可以在调试的时候,查看监视窗口中属性的变化。比如下图是i=4,j=3时的情况:

(为方便后续的教程继续,请将代码执行到Next j处)


人工修改监控对象的值:

我们插入一个监控对象Cells(i,j).Value,来监视i行j列的值

这时,其值为3×4=12。我们可以更改此值——

双击3×4=12,然后更改为12,如下图:

然后我们按F5或Ctrl Shift F8执行完毕,看一下单元格的内容情况:

第4行第3列的值变成了12。


补充解释:

监视窗口的图中,Sheet1.Range('A1')的值是灰色的,其实也可以双击更改。这个灰色的含义是:

它在窗口中显示的值,实际上是来自于它的成员Value。

我们在Sheet1.Range('A1')前,点加号,可以查看Range对象下各个成员的值,如图:


课后总结:

  通过本期的分享,你应该具备以下技能:

1、掌握设置断点的方法(除手工点左键设置外,还包括在监视窗口中对变量设置)

2、知道程序进入断点的三种情况(同上)

3、知道如何查看监控变量的值及类型

4、知道如何修改变量的值

5、了解断点的意义

6、掌握调试的按键、调试的步骤




    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多