次の方法で共有


RaiseEvent ステートメント

モジュール レベルで宣言したイベントをクラス、フォーム、またはドキュメント内で発生させます。

構文

RaiseEventeventname [ ( argumentlist ) ]

必須の eventname は、モジュール内で宣言されたイベントの名前です。この名前は Basic 変数の名前付け規則に従います。

RaiseEvent ステートメントの構文には、次の指定項目があります。

指定項目 説明
eventname 必須。 開始するイベントの名前。
argumentlist 省略可能。 変数配列、またはのコンマ区切りリストです。 argumentlist は、かっこで囲む必要があります。 引数がない場合は、かっこを省略する必要があります。

注釈

イベントが発生したモジュール内で、そのイベントが宣言されていない場合は、エラーが発生します。 次のフラグメントは、イベントの宣言と、そのイベントが発生するプロシージャを示しています。

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

イベントに引数がない場合は、イベントの RaiseEvent 呼び出しに空のかっこを含めるとエラーが発生します。 モジュール内で明示的に宣言されていないイベントは、RaiseEvent を使用して開始することはできません。

たとえば、フォームに Click イベントがある場合は、RaiseEvent を使用して Click イベントを開始することはできません。 フォーム モジュールClick イベントを宣言すると、フォーム自体の Click イベントはシャドウされます。 フォームの Click イベントは、そのイベントを呼び出すための標準の構文を使用することで引き続き呼び出すことができますが、RaiseEvent ステートメントを使用して呼び出すことはできません。

イベントは、接続が確立された順番で発生します。 イベントには ByRef パラメーターを指定できるため、以前のイベント ハンドラーで変更されたパラメーターを、その後で接続するプロセスが受け取る可能性があります。

次の例では、イベントを使用して、最速の 100 メートル走のデモ中にイベントを使用してタイムをカウントします。 コードではイベントに関連するすべてのメソッド、プロパティ、およびステートメントを示しています (RaiseEvent ステートメントを含む)。

イベントを発生させるクラスはイベント ソース、イベントを実装するクラスはシンクです。 イベント ソースには、生成されたイベントに対して複数のシンクを指定できます。 クラスがイベントを発生させると、そのイベントはすべてのクラス (オブジェクトのインスタンスに対してイベントをシンクするために選択したクラス) で開始されます。

また、この例では、ボタン (Command1)、ラベル (Label1)、および 2 つのテキスト ボックス (Text1Text2) を含むフォーム (Form1) を使用しています。 ボタンをクリックすると、1 番目のテキスト ボックスに From Now と表示され、2 番目のテキスト ボックスで秒数のカウントが始まります。 フルタイム (9.58 秒) が経過すると、1 番目のテキスト ボックスに Until Now と表示され、2 番目のテキスト ボックスに 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 のサポートおよびフィードバックを参照してください。