はいこれが可能です。ただし、オブジェクト指向のアプローチが必要です。 まず、フックするイベントを発生させるクラスを定義する必要があります。次に、通常のモジュールではイベントハンドラを使用できないため、イベントを実際に処理するクラスが必要になります。 第3に、通常のモジュールでは、これらのクラスを使用できます。
ここに簡単な例を示します。 "ClassWithEvent"という名前のクラスモジュールを作成します。次のコードを配置します。
Public Event VariableChange(value As Integer)
Private p_int As Integer
Public Property Get value() As Integer
value = p_int
End Property
Public Property Let value(value As Integer)
If p_int <> value Then RaiseEvent VariableChange(value) 'Only raise on actual change.
p_int = value
End Property
次に、このクラスによって生成されたイベントを処理できるクラスを作成します。 このクラスのモジュールには "ClassHandlesEvent"という名前を付けます。それに次のコードを配置します。
Private WithEvents SomeVar As ClassWithEvent
Private Sub SomeVar_VariableChange(value As Integer) 'This is the event handler.
Select Case value
Case 1:
MsgBox "here, 1!"
Case 2:
MsgBox "here, 2!"
Case Default:
'Do Nothing
End Select
End Sub
Public Property Get EventVariable() As ClassWithEvent
Set EventVariable = SomeVar
End Property
Public Property Let EventVariable(value As ClassWithEvent)
Set SomeVar = value
End Property
次に、通常のモジュールでは、あなたのClassWithEventをインスタンス化し、それらを処理するクラスのプロパティとしてこれを渡します。
Sub test()
Dim var As ClassHandlesEvent
Dim tst As ClassWithEvent
Set var = New ClassHandlesEvent
Set tst = New ClassWithEvent
var.EventVariable = tst
tst.value = 2 'A messagebox saying "Here, 2!" will pop-up
End Sub
拡張機能は、変数が変更された場合にのみイベントを発生させることを推奨します。現在、値を2に再度設定すると、イベントが発生します。 –
あなたは@BrianMStaffordです。値が等しくないかどうかを確認するコードを修正しました。 –
私の友人、私はあなたの詳細な答えと私にこれを見せる時間を取ってくれてありがとう、ありがとう。それは、ステップバイステップで何が起こっているかについて私に少しはわかります。私の言うことからあなたの答えは完璧に機能しました。 – Quint