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

第75部分

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

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

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



我们来看看另外一个程序例子,下面显示的过程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代码。有些事件只需要简单 的一行代码,然而,其它的可能更复杂。事件过程拥有名称,按 
 下述方式创建:  
 对象名称_事件名称() 在事件名称后面的括号里,你可以放置需要 

                                           266 

… 页面 283…

 发送到过程里的参数。程序员不能更改事件过程名称。 在你编写事 
 件过程对Excel事件作出反应之前,你需要知道:  
 *   想要响应的具体对象和事件的名称  
     响应事件的对象在代码窗口的过程下拉清单里显示了一系列事件(见图14…1)。同样,你 
     也可以使用对象浏览器找到事件 名称(见图14…2)。  
 *   你需要放置代码的地方 有些事件在标准模块里,其它的在类模块里。然而,工作簿,图表 
     和工作表事件对任何打开的工作表或者工作簿可用。要 给一个内嵌的图表,透视表或者应 
     用软件对象创建事件过程的话,那么你必须首先使用关键字With Events在类模块里创建 一 
     个新对象  

                                                                                         
 图14…1 你可以在代码窗口找到事件名称  

                                                                               
 图14…2 你可以在对象浏览器里找到事件名称  

2。激活和失活事件  

  你可以使用应用软件对象的EnableEvents属性来激活或者失活事件。如果你编写了VBA过程但是 
 不希望有个具体事件发生,那 么就将EnableEvents属性设置为False。例如,为了避免在运行过 
 程EnterData(参见下面代码)引发Workbook_BeforeClose事 件,那么在调用Workbook对象Close 
 方法之前,设置EnableEvents属性为False。在你的程序结束之前,你得将EnableEvents 属性设 
 置回True,确保事件被激活了。  
 1。  打开一新工作簿并另存为DisableEvents。xls  
 2。  切换到VB编辑器屏幕,双击工程浏览器窗口的ThisWorkbook,并且在出现的代码窗口里输入 
     Workbook_BeforeSave事件 过程        
      Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean; _  
             Cancel As Boolean)  
              If MsgBox(〃Would you like to copy 〃 & vbCrLf _  
                                          267 

… 页面 284…

                & 〃this worksheet to 〃 & vbCrLf _  
                & 〃a new workbook?〃; vbYesNo) = vbYes Then  
               Sheets(ActiveSheet。Name)py  
          End If  
      End Sub  
 3。  选择插入|模块添加一个标准模块激活VBA工程,并且输入下面显示的过程:  
       Sub EnterData()  
            With ActiveSheet。Range(〃A1:B1〃)  
               。Fontlor = vbRed  
               。Value = 15  
            End With  
                        
           Application。EnableEvents = False  
           ActiveWorkbook。Save  
           Application。EnableEvents = True  
      End Sub  
 4。  切换到Excel应用软件窗口,并且选择文件|保存。这时将引发Workbook_BeforeSave事件。点 
     击是响应该信息框。Excel会 打开一个新工作簿,复制当前的工作表内容。  
 5。  激活DisableEvents工作簿,并且选择工具|宏|宏。在对话框上,点击EnterData然后运行 注 
     意,当你运行EnterData过程时,你没有被提示在保存之前复制工作表。这表明 
     Workbook_BeforeSave事件没有运行。  

3。事件次序  

  事件发生以相应具体的动作并且按预先设计的次序发生。下面的表格示范了打开新工作簿,往工 
 作簿里添加新工作表以及关闭工 作簿时事件的顺序。  
 动作                            对象            事件顺序  
 打开一个新工作簿        

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

你可能喜欢的