靠谱电子书 > 经管其他电子书 > excel_vba_编程教程(完整版) >

第74部分

excel_vba_编程教程(完整版)-第74部分

小说: excel_vba_编程教程(完整版) 字数: 每页4000字

按键盘上方向键 ← 或 → 可快速上下翻页,按键盘上的 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

返回目录 上一页 下一页 回到顶部 0 0

你可能喜欢的