以下是引用[I]清风_ll[/I]在2005-9-2 15:38:13的发言:[BR]Excel提供了很多工作簿事件,合理的使用各个事件可以避免一些意料不到的错误发生以及提高代码的可读性,同时也可以提高代码的效率,以下是本人的学习经验,供大家参考,同时请大家批正
1、合理规范高效的使用工作簿事件之【Workbook_BeforeSave】
在论坛上看到一些关于如何禁止工作簿另存的贴子,发现大家对这个问题都是使用禁止菜单项等的办法,其实如果真正了解了BeforeSave事件的用法,大可不必如此麻烦。
认识Workbook_BeforeSave事件
VBA帮助里这么定义:
保存工作簿之前产生此事件。
Private Sub Workbook_BeforeSave(ByVal SaveAsUi As Boolean, Cancel As Boolean)
SaveAsUi 如果显示“另存为”对话框,则为 True。
Cancel 当事件产生时为 False。如果该事件过程将本参数设为 True,则该过程执行结束之后不保存工作簿。
我们都知道,在保存工作簿之前产生此事件,那么只要我们在该事件中写入一句代码就完全可以禁止文件另存了,而且连另存为对话框也不显示
Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)
If SaveAsUI = True Then Cancel = True'禁止另存为
End Sub
怎么样?一句代码就搞定了,效率很高吧? :)
那么如何使用Workbook_BeforeSave事件才算合理规范呢?
针对该事件的两个参数,个人认为该事件一般只做以下功能:
1、如上面所说,禁止文件另存,但可对原文件的修改进行保存
2、禁止保存修改,使保存与另存为功能都失效
代码如下:
Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)
Cancel = True'禁止保存修改
End Sub
注意:在禁止保存修改时应配合在BeforeClose事件中写入代码才能达到完美效果
Private Sub Workbook_BeforeClose(Cancel As Boolean)
Me.Saved=True
End Sub
2、合理规范高效的使用工作簿事件之【Workbook_Open】
认识Workbook_Open事件
VBA帮助里这么定义:
打开工作簿时,将产生本事件。
Workbook_Open事件只在工作簿打开的时候产生,在下一次打开之前不再发生此事件。
那么在此事件中我们可以写入一些什么样的代码呢?我们可以写入一些只需执行一次的代码,比如如果您需要在文件每次打开时在表1中A列记录下文件打开的时间,则应该使用此事件.
Private Sub Workbook_Open()
Sheet1.Range("A65536").end(xlup).offset(1,0).value =Vba.Now
End Sub
在这里如果要写入的表是Sheet1,而您无法保证在打开工作簿时活动工作表是Sheet1,不建议使用ActiveSheet,而应直接使用工作表名.
另对系统设置进行修改的代码不应该写在这里,而应写入Workbook_Activate事件中,Workbook_Activate事件紧随在Workbook_Open事件后面发生,为什么应该这么做将在下面Workbook_Activate事件中进行详述
3、合理规范高效的使用工作簿事件之【Workbook_Activate】和【Workbook_Deactivate】
认识Workbook_Activate事件
VBA帮助里Activate事件是这么定义:
激活一个工作簿、工作表、图表或嵌入图表时产生此事件。
对应于Workbook就是激活一个工作簿时产生此事件。
如何理解工作簿被激活,也就是说该事件在什么情况下发生呢?
1,工作簿打开时,在Open事件之后发生该事件
2,从另一工作簿中切换到本工作簿时,如当前打开了两个工作簿Book1和Book2,且当前活动工作簿为Book1,那么当从Book1切换至Book2时,此时将顺序发生一些事件,(这里我们只考虑Workbook_Activate事件和orkbook_Deactivate事件,不考虑其它比如Workbook_WindowActivate等事件)那么么将会先发生Book1的Workbook_Deactivate事件,然后才发生Book2的Workbook_Activate事件
一些修改系统设置之类的代码可放在此事件中
认识Workbook_Deactivate 事件
VBA帮助里Deactivate事件是这么定义:
图表、工作表或工作簿从活动状态转为非活动状态时产生此事件。
对应于Workbook就是工作簿从活动状态转为非活动状态时产生此事件。
那么该事件又是在什么情况下发生呢?
1,工作簿从活动状态转为非活动状态时
2,关闭工作簿时,在Workbook_BeforeClose事件之后发生此事件
前几天看到一个网友的一个问题:
在Workbook_Activate事件中向菜单栏添加了一个菜单,Workbook_Deactivate事件中删除该菜单,这本来非常不错,是比较规范的方法,但是该网友在Workbook_BeforeClose事件中也加入了删除该菜单的代码。这时麻烦就来了,当用户不小心点击按钮关闭工作簿时,在弹出了是否保存对话框之前Workbook_BeforeClose事件已经发生,当用户点击取消返回工作簿时,该菜单已被删除,这显然不是代码想要的效果。在这里将Workbook_BeforeClose事件中代码删除就可以了。这就是事件使用不当引起的麻烦。
在上面Open事件中说到应该把对系统设置进行修改的代码写入Activate事件中的原因是您无法保证用户只对一个工作簿进行操作,用户有可能需要在多个工作簿之间进行切换,当用户切换到另外一个工作簿时,恢复对系统的设置是非常有必要也是有道义的。
一些恢复系统设置之类的代码可放在此事件中
4、合理规范高效的使用工作簿事件之【Workbook_BeforeClose】
认识BeforeClose 事件
在关闭工作簿之前,先产生此事件。如果该工作簿已经更改过,则本事件在询问用户是否保存更改之前产生。
Private Sub Workbook_BeforeClose(Cancel As Boolean)
Cancel 当事件产生时为 False。如果该事件过程将本参数设为 True,则停止对工作簿的关闭操作,工作薄仍处于打开状态。
示例
本示例将 BeforeClose 事件的响应设置为保存工作簿的任何更改。
Private Sub Workbook_BeforeClose(Cancel as Boolean)
If Me.Saved = False Then Me.Save
End Sub
如何规范的使用该事件
看到有些网友在此事件中加上了ThisWorkbook.Close False,这显然是不对的方法,因为在执行Close方法时,代码又得执行了一次BeforeClose事件,何况一般情况这个功能只需用在此事件中设置一下工作簿的Saved属性就可以了
一般情况下,只应该在该事件中加上以下功能,而不应将对系统的设置或者恢复代码放在此处
1. 不显示是否保存修改对话框而保存工作簿的任何更改,如上面例子
2. 放弃保存工作簿的任何更改,而直接退出
Private Sub Workbook_BeforeClose(Cancel as Boolean)
Me.Saved = True
End Sub
3. 利用变量设置如果不是从代码或者是从代码关闭是有效或无效或类似的一些代码
Private Sub Workbook_BeforeClose(Cancel as Boolean)
If bFlag=False then Cancel=True'bFlag为变量标识
End Sub
待续.....
感谢版主为本帖加精华