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

下载本书

添加书签

excel_vba_编程教程(完整版)- 第85节


按键盘上方向键 ← 或 → 可快速上下翻页,按键盘上的 Enter 键可回到本书目录页,按键盘上方向键 ↑ 可回到本页顶部!

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。事件次序  

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

4。工作表事件  

  工作表对象相应例如工作表激活和失活事件,计算工作表事件,工作表更改事件和双击或右键单 
 击事件。本节讨论一些工作表对 象能够响应的事件。  
 事件名称                        激活  
 事件描述                        示例1  
    当用户激活工作表时,发生该  Dim shtName As String  ‘declared at the top 在模块上部声明  
 事 件                                                   ‘ of the module  
                                 Private Sub Worksheet_Activate()  
                                      shtName = ActiveSheet。Name  
      
                                     Range(〃B2〃)。Select  
                                 End Sub  
   
 示例程序中,每次该工作表被激活时,选择单元格B2  
 示例1 – 试验:在VB编辑器窗口,激活工程浏览器窗口并打开Excel对象文件夹。双击Sheet2(Sheet2), 
 并且输入示例程序到Sheet2  

                                            268 

… 页面 285…

代码窗口。接下来,切换到Excel窗口并激活Sheet2。注意,当Sheet2被激活时,被选择的总是单 
元格B2。  
事件名称                      失活  
事件描述                      示例2  
当用户激活不同的工作表时,发       Worksheet_Deactivate()  
生该事件                               MsgBox 〃You deactivated 〃 & _  
                                       shtName & 〃。〃 & vbCrLf & _  
                                      〃You switched to 〃 & _  
                                      ActiveSheet。Name & 〃。〃  
                                   End Sub  
Private Sub  
  
  
示例程序中,当Sheet2失活时,显示一个信息框  
示例2 – 试验:在VB编辑器窗口,激活工程浏览器窗口并且打开Excel对象文件夹,双击Sheet2  
(Sheet2),然后输入示例程序。 接下来,切换到Excel应用程序窗口并且激活Sheet2。你在示例1 
里创建的Worksheet_Activate过程将会运行,Excel会选中单元 格B2并且将工作表名称存储于你 
在Sheet2的代码模块上面声明的全局变量shtName里面。现在,点击当前工作簿里的其它工作 表, 
注意,Excel将显示你离开的工作表名称和你要切换到的工作表名称。  
事件名称                      选择变化  
事件描述                      示例3  
当用户选择工作表单元格时,发 Private Sub Worksheet_SelectionChange(ByVal Target As  
生该事件                         Excel。Range) ‘可省略Excel,下同。  
                                 On Error Resume Next  
                                 Set myRange = Intersect(Range(〃A1:A10〃); Target)  
                                 If Not myRange Is Nothing Then  
                                  MsgBox 〃Data entry or edits are not permitted。〃  
                                 End If  
                               End Sub  
示例程序中,当用户选择任何myRange中的单元格或区域时,显示一个信息框  
示例3 – 试验:在VB编辑器窗口,激活工程浏览器窗口并且打开Excel对象文件夹,双击Sheet3  
(Sheet3),并且在Sheet3代码窗 口里输入该示例程序。然后切换到Excel窗口并激活Sheet3。点 
击给定区域A1:A10中的任何单元格。注意,Excel将显示一个信 息。  
                               Private Sub Worksheet_Change(ByVal Target _  
事件名称                      变化  
                                 As Excel。Range)  
事件描述                      例4  
                                 Application。EnableEvents = False  
当用户更改单元格内容时,引发     Target = UCase(Target)  
该事件                           Columns(Targetlumn)。AutoFit  
                                 Application。EnableEvents = True  
                               End Sub  
  
  
示例程序中,你输入的内容会自动变为大写,并且该列列宽将自动适应内容文本长短  
 (Sheet1),并且在Sheet1代码窗 口里输入该示例程序。然后切换到Excel窗口并激活Sheet1。在 
任意单元格里输入任何文本,注意,你一旦按下回车键,Excel 就会将该文本变为大写,然后该 
列自动适应文本长度。  
事件名称                      计算  
事件描述                      示例5  
当用户重新计算工作表时,引发 Private Sub Worksheet_Calculate()  
该事件                           MsgBox 〃The worksheet was recalculated。〃  
                               End Sub  
  
一旦工作表重新计算,示例程序就会弹出一信息  
  
示例5 – 试验:在当前工作簿里添加一个新工作表,练习假定Excel会在你的工作簿里放置Sheet4。 
往Sheet4的单元格A2里输入1,B2里输入2。在单元格C2里输入下述公式:= A2 + B2。在VB编辑器 
窗口,激活工程浏览器窗口并且打开Excel对象文件夹, 双击Sheet4 (Sheet4),并且输入如上所 

                                 
小提示:按 回车 [Enter] 键 返回书目,按 ← 键 返回上一页, 按 → 键 进入下一页。 赞一下 添加书签加入书架