首先公布上一期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调试时最常用的按键。执行进入当前的代码。 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、掌握调试的按键、调试的步骤
|