会员登录 - 用户注册 - 网站地图 Office中国(office-cn.net),专业Office论坛
当前位置:主页 > 技巧 > Excel技巧 > 操作 > 正文

Excel 97/VBA技术讲座之六

时间:2005-02-24 12:28 来源:Excel Home 作者:admin 阅读:

二、VBA程序调试

    在程序运行过程中,总会或多或少地遇到各种各样的错误,这些错误大致可分为以下几类:
    语法错误:指程序的某一语句的语法出现错误,如左右引号或括号不匹配等。当程序设计人员输入完一行语句时,Visual Baisc编辑器会自动检测语法错误,并提醒程序员错误所在。
    编译错误:指在程序的编译过程中检测出来的错误。只检测单行语句是不能发现编译错误的。例如,以For Each开始的循环结构没有Next语句。通常语法错误和编译错误是容易发现和改正的。
    逻辑错误:指思维错误——导致程序运行结果与程序员的预期结果不同的编程思路错误。例如,想把工作簿的标题改为“My Workbook”,却拼写成“My Werkbook”;应该是“>=”却写成“>”等等。逻辑错误是最常见也是最麻烦的一类错误,程序调试的大部分时间都耗费在发现和纠正逻辑错误上。一般可通过设置断点、单步执行、观察值的变化来发现和纠正逻辑错误。
    实时错误:指在程序运行过程中发现的错误。有时过程中的某条语句在某些条件下能正确执行,而在另一些条件下就不能正确执行。例如,有一条语句用于打开硬盘上某个文件,若文件存在,可以打开,语句执行正确;若文件不存在,怎么打开?在实时错误中,有些是Visual Baisc能指出错误所在的,有些是程序员能预料的、能让Visual Baisc自动处理的。
    在程序调试过程中,VBA提供了各种强有力的调试工具来查找和纠正错误。
   

1.使用中断模式

    中断模式是指在程序执行过程中被暂时停止。此时所有变量、属性、表达式之值都维持在最新的状态,可以进行分析、测试或是重新设置等,以便检错纠错。
    进入中断模式的方法有以下几种:
    单步执行:按F8键。单步执行类似在下一条语句上设置断点,执行当前语句并清除断点。单步执行时,可观察每条语句的执行情况。
    设置断点:单击要设置断点的语句行的左侧边界区域;或从“调试”菜单中选“切换断点”命令。相应语句行左侧出现一个深红色圆点,该行也以深红色背景显示。
    设置临时断点(即只用一次的断点):单击要设置断点的语句行,从“调试”菜单中选“运行到光标处”命令。
    在宏程序中需中断处加入Stop语句。
    在宏执行时,按Ctrl+Break键。
    在宏执行时,产生实时错误,程序自动进入中断模式。
    符合〈监视表达式〉的条件与设定,程序进入中断模式。
   

2.利用各种窗口

    在VBA程序设计环境中,提供了“代码”窗口、“本地”窗口、“立即”窗口、“监视”窗口、“工程”窗口、“属性”窗口和“对象浏览器”窗口等7个窗口。从“查看”菜单中选择相应的命令可以显示出这些窗口。其中,“代码”窗口、“本地”窗口、“立即”窗口、“监视”窗口是调试程序的得力工具。
   

    “代码”窗口:在中断模式下运行宏时,可以通过“代码”窗口来仔细地观察宏的执行过程,也可以通过将鼠标指针指向某变量来检测变量的值。此时,在“代码”窗口内,准备执行的语句以黄色高亮方式显示,在其左边有一个黄色箭头。
“本地”窗口:在运行一个宏时,可以通过“本地”窗口观察宏程序所使用的变量、表达式、对象的变化来寻找程序错误;也可在“本地”窗口直接改变属性值,这与用VBA语句改变属性具有同样的效果;还可以通过“本地”窗口快速浏览某个对象的所有属性。它清楚地显示了哪些是包含值的属性(在值栏中有值的属性)和哪些是包含对象引用的属性(在旁边有加号的属性)。通过单击属性的值看它能否改变,能很容易地发现具有值的属性是不是只读的。
    “立即”窗口:在程序调试中,有时需要给某一变量指定一个新值,或输出显示某些变量的值,对此使用“立即”窗口最为方便。在“立即”窗口,可以输入任何语句并立即执行它。例如,要查看活动工作簿中所有工作表的名称,则可在“立即”窗口中键入语句For Each x in Workskeets: ?x.Name:Next x。通常,在“立即”窗口中,一条语句占一行,当多条语句排列在一行上时,要用冒号将其分开。并且在“立即”窗口中大都使用简短、无意义的变量名,这并不影响语句的执行。
    “监视”窗口:在执行宏前,或进入中断模式后,打开“监视”窗口,添加监视表达式以便观察关键的测试变量或表达式随宏执行的变化情况。在“监视”窗口中添加监视表达式的方法是:使用鼠标选中监视表达式,再单击“调试”菜单上的“添加监视”或“快速监视”命令。要移去监视的变量,只需单击该变量,再按Del键。
   

3.错误处理

    当发生实时错误时,VBA一般会显示一个错误信息对话框,进入中断模式。对于这样的错误,在宏设计中可以采用程序加以控制、监测错误,这种方法称为“错误捕获”。它可检测出错误并控制程序的流向。
   

设置忽略错误

    语句1:On Error Resume Next
    表示:若发生错误,则忽略它,跳到下一条语句继续执行。
    语句2:On Error GoTo 行号(或标号)
    表示:若运行有错,则跳到标号指定位置,转去执行错误处理例程。
   

获取错误信息

    在宏执行过程中,可以通过专用调试对象Err的属性值来了解是否发生实时错误以及发生了什么样的错误。若Err.Number值为0,则表明没有产生错误,反之有错误。
    下面通过两个例子说明如何使用错误捕获技术。
    例1,假设有一学生档案工作簿StudentBook,其中已有若干学生档案工作表Student1、Student2……以及其它一些工作表。现需要建立一个新的Student学生档案工作表,但又不想删除已有的Student工作表,如同Excel增加新工作表一样,只是将工作表名称的后缀加1。则实现这一功能的VBA宏程序如下所示:

Sub MakeNextStudent( )

Dim Sheet As Worksheet

Dim Base As String

Dim Suffix As Integer

Set Sheet = WorkSheets.Add

Base = “Student”

Suffix = 1

On Error Resume Next

Sheet.Name = Base & Suffix

Do Until Err.number = 0

Err.Clear

Suffix = Suffix + 1

Sheet.Name = Base & Suffix

Loop

End Sub

    MakeNextStudent宏的执行过程是:先建立一个新工作表,再试着以Student为基本名、1为后缀构成的名称给新工作表命名。On Error Resume Next语句的作用是:若已有同名工作表存在,Excel不能给新工作表命名时,Visual Baisc并不终止所执行的程序,而是自动给Err对象的Number属性赋值,设置出错信息代码,执行Do Until循环。Do Until循环首先检查命名是否成功,若不成功,则增加后缀值,再试着重新命名,再检查……直到没有产生错误(即重新命名成功Err.Number=0),才结束循环。
    Do语句后面的Err.Clear语句的作用是将出错信息代码重新置为0,让Visual Baisc忘记曾经发生的错误。
    例2,下面宏的功能是:当试图删除打开的文件时,错误处理例程先调用MsgBox函数提示用户文件正在使用,让用户确认是否要删除该文件,再作相应的处理。

Sub KillFile( )

On Error GoTo KillFile_Err

Open "MyFile" For Output as #1

Kill "MyFile"

Exit Sub

KillFile_Err:

myCheck = MsgBox("MyFile文件正在使用,是否要删除?", vbYesNo)

If myCheck = vbYes Then

Close #1

Kill "MyFile"

End If

End Sub

    综上所述,VBA为程序的调试、查错、纠错以及错误处理提供了方便的工具和方法,是一个优秀的程序设计环境。

(责任编辑:admin)

顶一下
(0)
0%
踩一下
(0)
0%
发表评论
请自觉遵守互联网相关的政策法规,严禁发布色情、暴力、反动的言论。
评价: