excel_vba_编程教程(完整版)-第84章
按键盘上方向键 ← 或 → 可快速上下翻页,按键盘上的 Enter 键可回到本书目录页,按键盘上方向键 ↑ 可回到本页顶部!
————未阅读完?加入书签已便下次继续阅读!
End Sub
声明完变量后,过程Archive的语句Application。DisplayAlerts = False 确保VB在运行时,不会
显示自己的警告和信息。下一条语句, On Error GoTo DiskProblem,明确了一个标签,当发生错
误时跳过去。保存活动工作簿的路径名称存储在变量folderName上。
当VB找不到该工作簿路径时,就会假设该文件没有保存并且显示相应的信息。接下来,VB跳到End If
之后的语句处,并执行指令 GoTo ProcEnd,指向仅在End Sub之前的ProcEnd标签。注意,标签带
有一个冒号。VB执行语句Application。DisplayAlerts = True,恢复系统的内置警告和信息。因为
没有语句了,所以,过程结束。
如果活动工作簿的路径不是空字符串的话,那么VB就会检查该工作簿最近的更改是否已保存。如果
没有,VBA使用语句If Not 。Saved Then 。Save来保存活动工作簿。Saved是工作簿对象的VBA属性。
接下来,VB将软盘驱动名称”A:”存储到变量DriveA并且显示信息提示用户插入软盘。然后软盘名
称和活动工作簿名称合并在一起,并且存储到一个叫BackupName的变量上。
你应该知道,当往软盘拷文件的时候,所有的事情都可能出错。例如,软驱可能是空的,或者软盘
未格式化或已经满了。当VB检测到一错误时,它就会跳到以标签DiskProblem开始的代码行去,并
且会显示相应的信息。如果用户点击了信息框上的重试按钮(值为4),那么VB就执行语句Resume 0,
该语句就会将VB送到导致错误的语句那里(。SaveCopyAs FileName: = BackupName),然后VB会再
次执行它。如果用户点击取消按钮的话,VBA就会执行语句Exit Sub,过程结束。
如果软驱里面的A盘没有问题,那么VBA就会复制活动工作簿到该软盘,并且信息框会通知用户复制
操作已成功。
3。 运行几次过程Archive,每次响应不同的选项,确保尽可能多的可能性。使用你在本章学习的
多种调试技术。
技巧13…6 程序测试
你对你编写的代码负责,这意味着你在发布你的程序给其他人测试之前,你自己先测试它。毕竟,
你了解它应该如何工作。有些程序员认为测试他们自己的代码是一种降格的事情,特别是当他们在
一个有专门测试部门的组织中工作的时候。不要犯这种错误。程序员级别的测试过程是非常重要的,
如同编写代码本身一样。在你自己测试完过程后,你应该给用户们去测试。用户会为你的问题,如:
程序能产生预期的结果吗?用起来容易并且有趣吗?符合标准习惯吗?再有,将你的整个应用软件
交给某个懂得一些使用该种应用软件的人,请他使用并试图打破它。
我们来看看另外一个程序例子,下面显示的过程OpenToRead示范了Resume Next和Error语句的使
用,以及Err对象。
Sub OpenToRead()
Dim myFile As String
Dim myChar As String
Dim myText As String
Dim FileExists As Boolean
FileExists = True
On Error GoTo ErrorHandler
myFile = InputBox(〃Enter the name of file you want to open:〃)
Open myFile For Input As #1
If FileExists Then
Do While Not EOF(1) ' loop until the end of file 遍历文件
myChar = Input(1; #1) ' get one character 获取一个字符
myText = myText + myChar ' store in the variable myText 存储至变量
264
… 页面 281…
myText
Loop
Debug。Print myText ' print to the Immediate window 打印到立即窗口
' Close the file …menting out this
instruction will cause
‘ error 52。 关闭文件 – 注释掉该指令(Close
#1)会导致错误52
Close #1
End If
Exit Sub
ErrorHandler:
FileExists = False
Select Case Err。Number
Case 71
MsgBox 〃The diskette drive is empty。〃
Case 53
MsgBox 〃This file can’t be found on the specified drive。〃
Case 75
Exit Sub
Case Else
MsgBox 〃Error 〃 & Err。Number & 〃 :〃 & Error(Err。Number)
Exit Sub
End Select
Resume Next
End Sub
过程OpenToRead的目的是一字节一字节地读取用户提供的文本文件内容(操作文件在第八章里)。
当用户输入了一个文件名,各种各样的错误可能发生。例如,文件名可能是错误的,或者用户可能
试图从软盘上打开文件,而这时软驱里并没有软盘,或者试图打开一个已经打开了的文件。
要捕捉这些错误,过程OpenToRead结尾处的错误处理程序使用了Err对象的Number (原文为Name)
属性。Err对象包含有关运行时间错误的信息。如果程序运行时错误发生了,Err。Number语句就会
返回错误编号。
如果错误71,53或者75发生了,VB就会显示写在Select…Case代码块里的友好信息并且进行到语句
Resume Next,它会将VB发送到导致错误的代码行下面的一行。如果是其它(意想不到)的错误发
生了,那么VB就会返回错误编号(Err。Number)和错误描述(Error(Err。Number))
在过程的开始处,变量FileExists被设置为真,这样,如果该程序没遇到错误的话,所有在If
FileExists Then代码块里的指令就会被执行。然而,如果VBA遇到了错误,那么变量FileExists
的值就会被设置为假(参见标签ErrorHandler下面的错误处理程序的第一行语句)。这样,VB在试
图读取文件时就不会产生错误,导致打开错误。如果你注释掉语句Close #1的话,那么VB在下次试
图打开同一文件时,就会遭遇错误。
注意ErrorHandler之前的语句Exit Sub。将Exit Sub语句放在错误处理程序的上面,你不会希望如
果没有错误发生的时候还执行该错误处理程序。
我们来进行下述练习,测试过程OpenToRead并更好理解错误捕捉:
1。 用记事本准备一个名叫C:Vacation。txt文本文件,输入任何文本
2。 逐语句执行过程OpenToRead四次,每次提供下述之一的信息:
* C:Vacation。txt文件名称
* 不存在C:盘上的文件名
* A:盘上的任意文件,但是软驱是空的
* 注释掉语句Close #1,并且输入文件名C:Vacation。txt
技巧13…7 错误:制造错误一测试错误处理程序
你可以故意制造一些错误来测试你程序里的错误陷阱:
265
… 页面 282…
… 通过使用下述语法设置内置错误:Error error_number。例如,要显示当除数为0时发生的错误
的话,可以在立即窗口里输入:
Error 11
当你按下回车键后,VB就会显示错误信息:
运行时间错误”11”
除数为零
… 要检查产生错误的意义的话,可以使用语法: Error(error_number)。例如,想要知道编号为7
的错误是什么意思,可以在立即窗口里输入下述指令:
?Error(7)
当你回车后,VB会返回该错误描述:
内存溢出
17。接下来……
在本章,你学习了如何测试你的VBA过程,以确保他们按计划进行。你使用断点和监视逐步程序来
调试它。你学习了如何在中断模式下使用立即窗口。你知道了本地窗口如何能帮你检测变量值,以
及调用堆栈对话框如何能在你复杂的程序里帮你追踪你在哪里。你已经学习了在编译时确定哪些需
要包括哪些需要排除。最后,你也学习了如何使用错误处理程序捕捉错误。通过使用内置的调试工
具,你可以快速指出程序的问题所在。请试着多花一些时间来熟悉这些工具,掌握了调试艺术,可
以节省你许多时间并避免错误。
通过完成一到十三章,你已经获得了扎扎实实的VBA工作知识,很可能,你应该开始自己的Excel
自动化工程了。本章结束了你使用Excel 2002 VBA的中级级别,VBA提供了许多更高级的功能,这
些在本书的剩余章节将挖掘出来。
第十四章 微软 Excel 2002 中的事件编程
你如何使当用户点击工作表单元格时出现的内置快捷菜单失活?你如何在工作簿打开或者
关闭之前显示一个自定义信息?你如 何验证输入在单元格或者单元格区域里的数据?要想对
Excel获得彻底控制的话,你必须学习如何响应事件。学习如何进行事件 编程将让你贯彻你自己
的功能性到Excel应用软件里去。你需要学习有关该主题的第一件事情就是,什么是事件。这里
有个简单 的定义:
事件是发生的东西 无需说,对象发生的事件是Excel的一部分,然而,一旦你学习了Excel中的事
件知识,你将发现更容易去理解发生在Word或者 其它任何微软办公软件的对象事件。事件是由对
象认可的行动。 既然你知道了什么是事件,那么你需要知道事件是可以被一个应用软件用户(例
如你自己),另一个程序或者系统本身引发的。 因此,你如何能够引发事件呢?假设你右键单击
一个工作表单元格,该具体操作将显示一个内置的工作表单元格快捷菜单,允许 你快速的访问和
工作表单元格相关的频繁使用的命令。但是,万一在某种情况下该内置响应不对呢?你可能想要完
全不接受工作 表的右键单击,或者当用户右键单击任何单元格时,单元格快捷菜单上出现一个自
定义菜单。有个好消息,就是你可以使用VBA 来编写代码对事件进行反应。
Excel提供了许多事件供你响应,下述对象可以响应事件:
* 工作表
* 图表
* 透视表
* 工作簿
* 应用软件 通过编写时
间过程,你可以决定当事件
发生时发生什么。
1。事件过程介绍
事件过程,作为一种特殊的VBA过程,用来对特定的事件作出反应。该过程包含处理具体事件的
VBA代码。有