《excel_vba_编程教程(完整版)》

下载本书

添加书签

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在运行时,不会 
显示自己的警告和信息。下一
小提示:按 回车 [Enter] 键 返回书目,按 ← 键 返回上一页, 按 → 键 进入下一页。 赞一下 添加书签加入书架