RaiseEvent 语句

、窗体或文档中触发在模块级别声明的事件。

语法

RaiseEventeventname [ ( argumentlist ) ]

必需的 eventname模块内声明的事件的名称并遵循基本变量命名约定。

RaiseEvent 语句的语法包含以下部分:

Part 说明
eventname 必填。 要激发的事件的名称。
argumentlist 可选。 以逗号分隔的 变量数组表达式列表。 参数列表必须用括号括起来。 如果没有 参数,则必须省略括号。

备注

如果引发事件的模块内尚未声明该事件,则会出现错误。 以下代码段演示了事件声明和引发该事件的过程。

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

如果事件没有参数,则事件在 RaiseEvent 调用中包含空括号会导致错误。 不能使用 RaiseEvent 激发模块中未显式声明的事件。

例如,如果窗体具有 Click 事件,则无法使用 RaiseEvent 激发其 Click 事件。 如果在窗体模块中声明 Click 事件,它将隐藏窗体自己的 Click 事件。 你仍可以使用常规语法调用事件来调用表单的 Click 事件,但不能使用 RaiseEvent 语句调用。

事件激发按建立连接的顺序执行。 由于事件可以具有 ByRef 参数,因此延迟连接的进程可能会接收已由早期事件处理程序更改的参数。

示例

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

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

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

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

Option Explicit

Private WithEvents ts As TimerState
Private Const FinalTime As Double = 9.58

Private Sub UserForm_Initialize()
    Command1.Caption = "Click to start timer"
    Text1.Text = vbNullString
    Text2.Text = vbNullString
    Label1.Caption = "The fastest 100 meters ever run took this long:"
    Set ts = New TimerState
End Sub

Private Sub Command1_Click()
    Text1.Text = "From Now"
    Text2.Text = "0"
    ts.TimerTask FinalTime
End Sub

Private Sub ts_UpdateElapsedTime(ByVal elapsedTime As Double)
    Text2.Text = CStr(Format(elapsedTime, "0.00"))
End Sub

Private Sub ts_DisplayFinalTime()
    Text1.Text = "Until now"
    Text2.Text = CStr(FinalTime)
End Sub

其余代码位于名为 TimerState 的类模块中。 除其他命令外,该模块还包含 Raise Event 语句。

Option Explicit

Public Event UpdateElapsedTime(ByVal elapsedTime As Double)
Public Event DisplayFinalTime()
Private Const delta As Double = 0.01

Public Sub TimerTask(ByVal duration As Double)
    Dim startTime As Double
    startTime = Timer
    Dim timeElapsedSoFar As Double
    timeElapsedSoFar = startTime
    
    Do While Timer < startTime + duration
        If Timer - timeElapsedSoFar >= delta Then
            timeElapsedSoFar = timeElapsedSoFar + delta
            RaiseEvent UpdateElapsedTime(Timer - startTime)
            DoEvents
        End If
    Loop
    
    RaiseEvent DisplayFinalTime
End Sub

另请参阅

支持和反馈

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