Event 语句

声明用户定义的事件。

语法

[ 公共 ] Eventprocedurename [ (arglist) ]

Event 语句包括这些组成部分:

Part 说明
Public 可选。 指定 事件 在整个 项目中可见。 默认情况下,“事件”类型为 Public。 请注意,事件只能在声明它们的模块中引发。
procedurename 必填。 事件名称;遵循标准变量命名约定。

arglist 参数具有以下语法和组成部分:

[ ByVal | ByRef ] varname [ ( ) ] [ Astype ]

Part 说明
ByVal 可选。 指示参数通过值传递。
ByRef 可选。 指示按引用传递参数。 ByRef 是 VBA 中的默认值,与 Visual Basic .NET 中不同。
varname 必填。 表示传递给过程的参数的变量名称;遵循标准变量命名约定。
type 可选。 传递给过程的参数的数据类型;可能是 ByteBooleanIntegerLongCurrencySingleDoubleDecimal(当前不受支持)、DateString(仅可变长度)、ObjectVariant用户定义的类型或某对象类型。

备注

声明事件后,使用 RaiseEvent 语句触发事件。 如果 Event 声明出现在标准模块中,则发生语法错误。 无法声明事件以返回值。 可以声明并引发典型事件,如以下片段所示。

' Declare an event at module level of a class module 
 
Event LogonCompleted (UserName as String) 
 
Sub 
 RaiseEvent LogonCompleted("AntoineJan") 
End Sub

注意

[!注释] 正如可以声明过程的参数一样,也可以声明事件参数,并出现以下异常:事件无法拥有命名参数、 Optional 参数或 ParamArray 参数。 事件没有返回值。

示例

以下示例使用事件在演示最快的 100 米比赛期间计算秒数。 该代码演示了与事件相关的所有方法、属性和语句,包括 Event 语句。

引发事件的类是事件源,实现该事件的类是接收器。 一个事件源可以有多个接收器用于它生成的事件。 当类引发事件时,该事件将在已选择接收该对象实例的事件的每个类上激发。

该示例还使用带有按钮 () 的窗体 (Form1Command1) 、标签 (Label1) 以及两个文本框 (Text1Text2) 。 当您单击该按钮时,第一个文本框显示"From Now",第二个文本框开始计算秒数。 当整个时间 (9.84 秒) 已过时,第一个文本框将显示“直到现在”,第二个文本框显示“9.84”。

代码指定窗体的初始状态和终端状态。 它还包含在引发事件时执行的代码。

Option Explicit 
 
Private WithEvents mText As TimerState 
 
Private Sub Command1_Click() 
 Text1.Text = "From Now" 
 Text1.Refresh 
 Text2.Text = "0" 
 Text2.Refresh 
Call mText.TimerTask(9.84) 
End Sub 
 
Private Sub Form_Load() 
 Command1.Caption = "Click to Start Timer" 
 Text1.Text = "" 
 Text2.Text = "" 
 Label1.Caption = "The fastest 100 meter run took this long:" 
 Set mText = New TimerState 
 End Sub 
 
Private Sub mText_ChangeText() 
 Text1.Text = "Until Now" 
 Text2.Text = "9.84" 
End Sub 
 
Private Sub mText_UpdateTime(ByVal dblJump As Double) 
 Text2.Text = Str(Format(dblJump, "0")) 
 DoEvents 
End Sub

剩余的代码位于名为 TimerState 的类模块中。 Event 语句声明在引发事件时启动的过程。

Option Explicit 
Public Event UpdateTime(ByVal dblJump As Double)
Public Event ChangeText() 
 
Public Sub TimerTask(ByVal Duration As Double) 
 Dim dblStart As Double 
 Dim dblSecond As Double 
 Dim dblSoFar As Double 
 dblStart = Timer 
 dblSoFar = dblStart 
 
 Do While Timer < dblStart + Duration 
 If Timer - dblSoFar >= 1 Then 
 dblSoFar = dblSoFar + 1 
 RaiseEvent UpdateTime(Timer - dblStart) 
 End If 
 Loop 
 
 RaiseEvent ChangeText 
 
End Sub

另请参阅

支持和反馈

有关于 Office VBA 或本文档的疑问或反馈? 请参阅 Office VBA 支持和反馈,获取有关如何接收支持和提供反馈的指南。