excel_vba_编程教程(完整版)-第74部分
按键盘上方向键 ← 或 → 可快速上下翻页,按键盘上的 Enter 键可回到本书目录页,按键盘上方向键 ↑ 可回到本页顶部!
————未阅读完?加入书签已便下次继续阅读!
… 页面 277…
2。 输入下述过程和函数:
‘ declare a conditional piler constant
#Const verPolish = True
Sub WhatDay()
Dim dayNr As Integer
#If verPolish = True Then
dayNr = WeekDay(InputBox(“Wpisz date; np。 01/01/2000”))
MsgBox “To bedzie “ & DayOfWeek(dayNr) & “。”
#Else
WeekdayName
#End If
End Sub
Function DayOfWeek(dayNr As Integer) As String
DayOfWeek = Choose(dayNr; “niedziela”; “poniedzialek”; “wtorek”; _
“sroda”; “czwartek”; “piatek”; “sobota”)
End Function
Function WeekdayName() As String
Select Case WeekDay(InputBox(“Enter date; e。g。 01/01/2000”))
Case 1
WeekdayName = “Sunday”
Case 2
WeekdayName = “Monday”
Case 3
WeekdayName = “Tuesday”
Case 4
WeekdayName = “Wednesday”
Case 5
WeekdayName = “Thursday”
Case 6
WeekdayName = “Friday”
Case 7
WeekdayName = “Saturday”
End Select
MsgBox “It will be “ & WeekdayName & “。”
End Function
3。 运行过程WhatDay。因为条件常量(verPolish)在模块顶端已被设置为True了,所以,VB将运
行波兰版过程WhatDay。它用波兰语询问用户输入日期并且将结果显示为波兰语。要运行代码
的英语版的话,需要将常量verPolish设置为False,然后重新运行过程
除了在模块顶部声明条件编译常量之外,你也可以选择工具|(VBAProject)属性(参见图
13…15)。当你使用该属性窗口,在条件编译参数文本框里输入下述内容,以激活过程WhatDay
的英语版本:
verPolish = 0
如果还有更多的条件编译常量的话,每个常量之间必须用冒号分割开。
4。 注释掉模块上部的#Const verPolish指示,并且在如图13…15所示地属性对话框里输入条件编
译常量。然后运行过程WhatDay,看看Else部分是如何执行给说英语的用户的。
261
… 页面 278…
图13…15 条件编译常量可以在模块上部也可以在属性窗口声明,但是,不能同时在两个地方声明
17。操纵书签
在分析和回顾你的VBA程序的过程中,你经常会发现你自己跳进了某代码区域。使用内置的书签功
能,你可以轻易地标示你需要浏览的地方。设置书签:
1。 点击你想要定义为书签的语句的任意地方
2。 选择编辑|书签|切换书签(或者点击编辑工具栏上的切换书签按钮——参见图13…16)。VB将在
语句左边的边界上放置一个蓝色的圆角矩形。
图13…16 你可以使用书签在经常要用的部分之间切换
你一旦设置了两个或以上的书签,就可以通过选择编辑|下一书签,或者简单地点击编辑工具栏上
的下一书签按钮,在标志的代码处切换。你也可以在代码窗口的任意地方单击右键(译者:没有验
证该快捷菜单),然后选择快捷菜单上的下一书签。要到前面的书签那里,则选择上一书签。
你随时可以通过选择编辑|书签|清除所有书签,或者点击编辑工具栏上的清楚按钮来清除所有书
签。要清除单个书签的话,那么只要点击书签的任意地方然后选择编辑|书签|切换书签,或者点击
编辑工具栏上的切换书签按钮。
18。捕捉错误
没有人第一次就编写没有错误的程序。当你创建VBA过程,你必须决定你的程序如何应对错误。许
多意想不到错误在运行时发生,例如,你的过程可能要试图给一个工作簿一个已经打开的工作簿的
名称。运行时间错误经常不是被程序员发现,而是被试图做一些程序员没有预测到的事情的用户发
现。如果程序运行时错误发生了,那么VB将显示一个错误信息,并且程序终止。大多情况下VB显示
的错误信息对用户来说很隐秘。你通过在你的VBA过程里加入错误处理代码,预防用户经常看到运
行时间错误。这样,当VB碰到错误,它就会显示一个更友好更好理解的错误信息,可能指导用户如
何去改正错误,而不是简单的显示一个缺省的错误信息。
如何在你的VBA过程里实行错误处理呢?第一步,要将On Error语句放到你的程序里。该语句告诉
VBA当运行时发生错误应该做什么,换句话说,VBA使用On Error 语句来激活错误处理程序以捕捉
运行时间错误。取决于你的程序类型,你可以通过以下任何方式推出错误陷阱:Exit Sub; Exit
Function; Exit Property; End Sub; End Function或者End Property。你应该给每个过程写一个
错误处理程序。
262
… 页面 279…
On Error语句可以按下述方式之一使用:
On Error GoTo 标签 明确一个标签,当错误发生时跳到该标签。该标签标示错误处理程序的
开始。错误处理是在你的应用软件中用来捕捉错误并作出响应的程序。
该标签必须和On Error语句出现在同一过程里面
On Error Resume Next 当运行时间错误发生时,VB将忽略该导致错误的代码行,不显示错误信
息,但是从下一行开始继续运行程序
On Error GoTo 0 关闭程序里的错误捕捉。当VBA运行该语句后,错误会被发现,但是没有
错误陷阱在程序里
技巧13…5 是错误(Error)还是失误(Mistake)
在编程中,错误与失误并非相同的事情。失误,比如错误拼写,漏掉语句,放错地方的引号或逗号,
或者给变量赋予了不匹配的值,通过适当的调试失误是可以从程序中清除的。尽管你的程序没有任
何失误,但是,这并不意味着不会发生错误。错误是指一个事件或者操作没有按预期工作。例如,
如果你的VBA程序需要访问硬盘上某个具体的文件,但是某人将该文件删除了或者移到别的地方去
了,不管什么你总会得到一个错误。错误阻止程序完成具体任务。
下面显示的过程Archive使用了错误处理程序(见过程的下部)。该过程使用内置的方法SaveCopyAs,
将当前工作簿保存复件到一文件,而不修改该已打开的工作簿在内存中的情况。
1。 在当前工程里插入一个新模块,并重命名为Traps
2。 输入过程Archive,如下所示:
Sub Archive()
Dim folderName As String
Dim DriveA As String
Dim BackupName As String
Dim Response As Integer
Application。DisplayAlerts = False
On Error GoTo DiskProblem
folderName = ActiveWorkbook。Path
If folderName = 〃〃 Then
MsgBox 〃You can't copy this file。 〃 & Chr(13) _
& 〃This file has not been saved。〃; _
vbInformation; 〃File Archive〃
Else
With ActiveWorkbook
If Not 。Saved Then 。Save
DriveA = 〃A:〃
MsgBox 〃Place a diskette in drive 〃 & DriveA & _
〃 and click OK。〃; ; 〃Copying to 〃 & DriveA
BackupName = DriveA & 。Name
。SaveCopyAs Filename:=BackupName
MsgBox 。Name & 〃 was copied to a disk in drive 〃 & _
DriveA; ; 〃End of Archiving〃
End With
End If
GoTo ProcEnd
DiskProblem:
Response = MsgBox(〃There is no disk in drive A 〃 & Chr(13) _
& 〃or disk in drive 〃 & DriveA & 〃 is not formatted 〃; _
vbRetryCancel; 〃Check Disk Drive〃)
263
… 页面 280…
If Response = 4 Then
Resume 0
Else
Exit Sub
End If
ProcEnd:
Application。DisplayAlerts = True
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和Err