【分享成果,随喜正能量】知识缺乏,可以去汲取、去丰富;能力低下,可以去训练、去强化。唯有扩大胸襟、拓宽视野、升华境界不是一件容易的事。它需要不断地学习、自省、淬火、修炼和砥砺。做人、做事有了境界,就会成为仁者、智者。既仁又智,当天下无敌。人渴望被承认,也就是别人的目光,但是同时,当别人的目光围拢过来的时候,他又感到窒息,感到不自由。获得承认和追求自由之间,有一个多么辩证的关系。
《VBA之EXCEL应用》是非常经典的,是我推出的第七套教程,定位于初级。这套教程从简单的录制宏开始讲解,一直到窗体的搭建,内容丰富,实例众多。大家可以非常容易的掌握相关的知识,这套教程共三册,十七章,都是我们在利用EXCEL工作过程中需要掌握的知识点,希望大家能掌握利用。今日讲解的内容是“VBA之EXCEL应用”的第十六章“用户窗体(Userform)对象”的第3节:窗体及控件的常用事件
第三节 窗体及控件的常用事件上一讲讲了窗体的显示,这一讲讲解窗体的事件。所谓事件,简单地说就是对象的响应。对于窗体而言,它会响应用户的什么操作呢?我们看下面的详细讲解。
VBE中的对象可识别的事件是预先确定的,并不是所有对象都会具有相同事件。但每个事件都有一个事件过程的框架与之对应,当某一事件发生时,系统将立即执行对应的事件过程,因此,如果想利用这个过程去完成指定的任务,那么用户就必须在这个对应的事件过程中编写程序代码,以便响应发生的事件,否则,即使发生了可识别的事件,系统也不会做任何操作。
我们可以通过下面介绍的界面看到用户窗体中的事件:
1 常用的窗体事件1) Initialize事件 Initialize事件用来提供应用程序或用户窗体中的控件、变量等进行初始化。该事件的作用和类模块中的该事件相同。
2) QueryClose事件 该事件发生在UserForm关闭之前。通常用这个事件确保在关闭应用程序之前,应用程序包含的用户窗体中没有未完成的任务。该事件的语法格式如下:
格式:Private Sub UserForm_QueryClose(Cancel As Integer, CloseMode As Integer)
该事件括号内有两个参数。其中,参数Cancel是一个整数的值,用于指定是否在所有加载的用户窗体中停止QueryClose事件,当Cancel的值设置为0以外的任意值时,QueryClose事件将停止执行,并防止关闭UserForm与应用程序;参数CloseMode为一个值或常数,用来指示引起QueryClose事件的原因。
CloseMode参数返回下列的值
vbFormControlMenu 0 用户在UserForm上选择“控制”菜单中的“关闭”命令。
VbFormCode 1 由代码调用Unload语句。
vbAppWindows 2 正在结束当前Windows操作环境的过程。(仅用于Visual Basic 5.0。)
vbAppTaskManager 3 Windows 的“任务管理器”正在关闭这个应用。(仅用于Visual Basic 5.0。)
- “常数”是执行程序时保持常数值的命名项目。常数可以是字符串、数值、另一常数、任何(除乘幂与Is之外的)算术运算符或逻辑运算符的组合。每个主应用程序皆可定义自己的一组常数。用户也可以使用Const语句定义附加常数。可在代码中的任何地方使用常数代替实际的值。
3)Terminate事件 该事件用于删除窗体中对象事例的所有引用。Terminate事件发生在卸载窗体对象之后。如果应用程序为非正常退出,从而导致在内存中删除UserForm的示例,将不会触发Terminate事件。例如,在从内存中删除UserForm之前,应用程序调用了End语句,则UserForm不会触发Terminate事件。
4)Activate和Deactivate事件 当运行中的对象变成活动窗口的时候就会发生Activate事件。而当对象不再是活动窗口时,则会发生Deactivate事件。下面的情况会引发这两种事件:
① Show 对象可使用代码中的Show方法变成活动的,且只有在对象是可见的时候才会发生Activate事件。除非使用Show方法,否则用Load加载的UserForm是不可见的。
②切换焦点 在应用程序中移动焦点时,也会引发Activate和Deactivate事件。而将焦点移出或移动到另一个应用程序中的对象并不会触发此事件。在卸载对象时,并不会发生 Deactivate 事件。
5)C1ick单击事件。程序运行时,当用户用鼠标左键单击窗体时,引发该窗体的C1ick事件(也称单击事件)。
6) DblClick双击事件。程序运行时,当用户用鼠标左键双击窗体时,引发该窗体的DblClick事件(也称双击事件)。
7)Load装载事件。运行程序,当系统把窗体由外部存储介质装入内存时,引发该窗体的Load事件(也称装载事件)。
8)Resize改变窗体尺寸事件。程序运行时,当窗体大小被改变时,引发该窗体的Resize事件。
9)Activate激活窗体事件。程序运行时,当窗体变为当前窗体时,引发该窗体的Activate事件(也称激活事件)。
10) Deactivate失去激活事件。程序运行时,当A窗体取代B窗体变成当前窗体时,引发B窗体的Deactivate事件(也称失去激活事件)。
11) Unload卸载事件。当窗体被从内存中卸载时,引发该窗体的Unload事件(也称卸载事件)。
从上面介绍的几个事件来看,事件都是在特定的环境下发生的。比如Click事件,只有在单击某个对象时才会发生。可以跟据这一特点,看出窗体中这些自动执行的事件的顺序是:运行窗体后,窗体执行初始化Initialize事件;然后再执行激活Activate事件;当用户的操作完成后,单击关闭按钮,执行关闭QueryClose事件;然后系统再执行Terminate事件,释放对象和用户窗体在内存中的实例和引用。
2 利用窗体的QueryClose事件,完成不保存退出QueryClose事件在上面已经详细地讲解,在 UserForm关闭之前发生该事件。当点击窗体右上方的关闭按钮时会有触发,此事件在控制关闭窗体就退出关闭工作簿的时候很有用处,使用登录窗体的朋友不会错过它。如下代码,完整写入到对应窗体代码模块中即可实现点击该窗体的关闭按钮,就执行不保存工作簿就退出。
Private Sub UserForm_QueryClose(Cancel As Integer, CloseMode AsInteger)
Application.Quit
ThisWorkbook.Close False
End Sub
Sub mynz()
UserForm1.Show
End Sub
代码截图: