友情提示:如果本网页打开太慢或显示不完整,请尝试鼠标右键“刷新”本网页!阅读过程发现任何错误请告诉我们,谢谢!! 报告错误
八万小说网 返回本书目录 我的书架 我的书签 TXT全本下载 进入书吧 加入书签

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

按键盘上方向键 ← 或 → 可快速上下翻页,按键盘上的 Enter 键可回到本书目录页,按键盘上方向键 ↑ 可回到本页顶部!
————未阅读完?加入书签已便下次继续阅读!



签。要清除单个书签的话,那么只要点击书签的任意地方然后选择编辑|书签|切换书签,或者点击 
编辑工具栏上的切换书签按钮。  

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和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代码。有些事件只需要简单 的一行代码,然而,其它的可能更复杂�
返回目录 上一页 下一页 回到顶部 赞(5) 踩(3)
未阅读完?加入书签已便下次继续阅读!
温馨提示: 温看小说的同时发表评论,说出自己的看法和其它小伙伴们分享也不错哦!发表书评还可以获得积分和经验奖励,认真写原创书评 被采纳为精评可以获得大量金币、积分和经验奖励哦!