excel_vba_编程教程(完整版)-第83章
按键盘上方向键 ← 或 → 可快速上下翻页,按键盘上的 Enter 键可回到本书目录页,按键盘上方向键 ↑ 可回到本页顶部!
————未阅读完?加入书签已便下次继续阅读!
Macintosh,Win16或者Win32)上的应用软件。条件编译对于本地化使用于不同语言的应用软件也
是很有用的。在条件编译时排除的程序代码将从最终文件中忽略掉,因此,它对文件大小或程序功
效没有影响。
要激活条件编译的话,你应该使用叫做指示的特殊表达式。首先,你需要使用#Const指示声明一个
布尔值(True或者False)常量,接下来,你在#If 。 。 。Then。。。 #Else指示中核实该常量。你需
要进行条件编译的代码部分必须包括在这些指示中。注意,关键字If和Else前面都带有一个数字符
号(#)。
如果一部分代码将要运行,那么该条件常量必须设置为真(…1),否则为假(0)。在模块的声明部
分声明条件常量,例如:
#Const User = True
声明名为User的条件常量。
在接下来的过程中,当名叫verPolish条件常量为True时,数据就显示为波兰语。过程WhatDate调
用函数DayOfWeek,它基于提供的日前返回星期名称。要用英语编译该程序的话,你所要做的全部
就是将该条件常量改为False,然后VB就会跳到#Else指示后面的指令块去。
1。 在当前VBA工程插入一个新模块,并重命名为Conditional
260
… 页面 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在运行时,不会
显示自己的警告和信息。下一