分享

[转载]学用Excel VBA对象的事件编程

 宛平2008 2016-04-27

前面几期,我们已经和大家一起学过了ExcelVBA对象的属性和方法以及它们的简单应用, 相信大家通过学习已经有了不小的收获。Excel中的各类VBA方案都是建立在工作薄和工作表事件的基础上的,熟练地运用Excel事件编程可以灵活地控制工作薄和工作表。

如何为工作薄和工作表对象指定事件

VBE编辑器窗口左侧的工程资源管理器中,双击其中的Thisworkbook(当前工作薄)或Sheet1Sheet2(工作表)等对象,打开相应的代码窗口(如图1),在代码窗口中单击“对象框”右侧的下拉按钮,从对象列表中可找到当前的工作薄(Workbook)或工作表(Worksheet)对象。当用户选择相应对象时,代码窗口中会自动出现工作薄或工作表对象的默认事件程序,这些代码均以“Private sub”开头,以“End Sub”结尾。其中工作薄默认的事件为“Open”事件,工作表默认的事件为“SelectionChange”事件,如果用户需要对当前对象的其它事件进行编程,可单击“过程/事件框”列表右侧的下拉按钮,从事件列表框中找到需要编写的事件,如选择工作薄的“BeforeClose”事件,此时系统会自动列出“Private Sub Workbook_BeforeClose(Cancel As Boolean)”和“End Sub”,然后就可以在这两行语句间编写有关的程序代码了,最后将不需要的事件程序删除即可。

[转载]学用Excel <wbr>VBA对象的事件编程

工作薄事件编程应用

当我们每次打开、保存工作薄、更改工作薄中的任何工作表,加载宏等等操作的时候,在不经意间已经触发了工作薄的各种事件,只不过是因为用户没有为这些事件编写相应的程序罢了。工作薄对象的事件有二十个多,在这些事件中最常用的有OpenBeforeCloseBeforSaveActivateDeactivate等事件。

1Open事件是工作薄对象的默认事件,当用户打开工作薄文件时,这个事件就被激活,这样我们就可以把创建过程(如检查用户的合法性、是否创建自定义菜单或添加工具栏按钮等等)的代码放到这个事件中,让系统自动执行从而达到我们需求。下面的例子是在打开工作薄时系统检查用户的合法性,如果密码正确,文档就可以被打开,否则强制退出Excel程序。

Private Sub Workbook_Open()

Dim pwd

pwd = InputBox("请输入打开文件的密码:", "密码框")

If pwd <> "12345" Then

MsgBox "非法用户,你无权使用本程序!", vbOKOnly

Application.Quit

End If

End Sub                                                                  

2BeforeClose事件在工作薄被关闭时自动触发,利用该事件可以删除用户的自定义菜单和工具栏等设置。下面的代码可实现工作薄在关闭时自动删除“分表工具”工具栏:

Private Sub Workbook_BeforeClose(Cancel As Boolean)

Application.CommandBars("分表工具").Delete

End Sub

如果在该事件中写入代码“Cancel = True”将会阻止文档的关闭。

3BeforeSave事件发生在工作薄执行保存操作时,如果我们希望工作薄在保存时提示用户是否进行保存操作可使用下面的代码:

Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)

Dim rel

rel = MsgBox("你确认要进行保存操作吗?", vbYesNo)

If rel = vbNo Then Cancel = True

End Sub

代码中的“Cancel = True”将阻止工作薄执行保存操作。

4Activate事件发生在工作薄对象被激活时,此时可根据需要自动切换到该工作薄中的某张工作表或显示自定义菜单以及打开指定窗体等操作。下面的代码可在工作薄被激活时自动切换到Sheet2,并在A1中显示“Welcome Back:

Private Sub Workbook_Activate()

Sheet2.Activate

Cells(1, 1) = "Welcome Back"

End Sub

5Deactivate事件将在工作薄由活动状态转变为非活动状态时激活。下面的代码可在工作薄成为非活动状态时自动保存工作薄中的数据:

Private Sub Workbook_Deactivate()

ThisWorkbook.Save

End Sub

这样在多个工作薄之间操作时就不要担心数据的丢失了,系统会自动保存用户数据的修改。

工作表事件编程应用

工作表事件的编程应用也是我们学习VBA编程的重点,当工作表被激活、选中某个单元格或单元格区域、更改工作表中的数据、重新计算工作表等操作时都会触发工作表事件。在VBE编辑器提供了9个工作表事件,其中用得较多的是:ActivateDeactivate CalculateChangeSelectionChange等事件。

1Activate事件:当工作表对象被激活时将引发该事件。如激活某工作表时显示当前工作工作表中已有的记录数,并询问用户是否打印这些数据。

Private Sub Worksheet_Activate()

Dim rel, icount

icount = [a65536].End(xlUp).Row - 1  '减去第一行(标题行)

rel = MsgBox("已成功录入" + Str(icount) + "个用户记录,立即打印吗?", vbYesNo)

If rel = vbYes Then ActiveSheet.PrintOut Else Cancel = True

End Sub

2Deactivate事件:当工作表对象由活动状态转变为非活动状态时触发该事件(即工作表失去焦点)。下面的例子就是当某工作表(如分表数据)转变为非活动状态时自动隐藏同时强制激活“总表”数据所在的工作表。

Private Sub Worksheet_Deactivate()

Worksheets("分表").Visible = False

Worksheets("总表").Activate

End Sub

3Calculate事件:当工作表重新计算时将触发该事件。如当工作表进行重新计算操作时自动调整表格中的列宽和行高到最合适的大小:

Private Sub Worksheet_Calculate()

ActiveSheet.Columns.AutoFit

ActiveSheet.Rows.AutoFit

End Sub

4Change事件:当用户更改单元格中的数据或外部链接引起单元格发生数值变化将会引发该事件。下面的例子是当用户在第2列(即B列)中输入数据时,如果输入的是数字“ 1将自动转换为文字“男”,输入其它内容全部变为文字“女”。

Private Sub Worksheet_Change(ByVal Target As Range)

If Target.Column = 2 And Target.Value = 1 Then

Target.Value = ""

Else

If Target.Value <> 1 And Target.Value <> "" Then Target.Value = ""

End If

End Sub

5SelectionChange事件:当工作表中的选定区域发生变化时将触发该事件,它是工作表的默认事件。下面的例子可以实现单击某行时给当前行设置一个填充色,再次单击时取消该行填充色的显示,可用于表格数据的浏览。

Private Sub Worksheet_SelectionChange(ByVal Target As Range)

If Target.EntireRow.Interior.ColorIndex <> 18 Then

Target.EntireRow.Interior.ColorIndex = 18

Else

Target.EntireRow.Interior.ColorIndex = 0

End If

End Sub

Change事件不同的是,SelectionChange事件是在选中某个单元格或单元格区域时触发,而Change事件是单元格或单元格区域的内容发生改变以后才会触发。

事实上,工作薄和工作表的事件及其应用远不止这些,我们给大家介绍的这些事件以及范例都是很常见、很实用的,通过这些范例的学习大家可以举一反三,从而能设计出更加便捷、实用的应用程序来。

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多