Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/28.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Excel 变量的更改会触发一个事件_Excel_Ms Access_Vba - Fatal编程技术网

Excel 变量的更改会触发一个事件

Excel 变量的更改会触发一个事件,excel,ms-access,vba,Excel,Ms Access,Vba,是否可能通过变量变化触发事件?比如说 这将触发事件 Dim t As Integer Dim Fire As Boolean Private Sub Test t = 0 Fire = True IIf Fire, t=1, t=2 End sub 在事件处理程序中 Select Case t Case 0 'Do something Case 1 'Do something Case 2 'Do so

是否可能通过变量变化触发事件?比如说

这将触发事件

Dim t As Integer
Dim Fire As Boolean

Private Sub Test
t = 0
Fire = True
IIf Fire, t=1, t=2
End sub
在事件处理程序中

Select Case t
    Case 0
       'Do something
    Case 1
       'Do something            
    Case 2
       'Do something
    Case 3
       'Do something
    ...   

Google提供了事件处理程序,并使用了类模块,但我无法理解它。

是的,这是可能的。但是,您需要一种面向对象的方法。 您首先需要定义一个类,该类将引发您希望钩住的事件。其次,您需要一个实际处理事件的类,因为您不能在常规模块中使用事件处理程序。 第三,在常规模块中,您可以只使用这些类

下面是一个简单的例子: 创建一个名为“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
接下来,在一个常规模块中,实例化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您是对的。修改代码以检查值是否不相等。我的朋友,我真诚地感谢您的详细回答,感谢您花时间向我展示这一点。我需要一点时间才能一步一步地了解正在发生的事情。据我所知,你的回答完美无瑕。非常欢迎。了解VBA for Excel中的类和对象的一个很好的资源是Chip Pearson的简介,在这里:他还写了一篇关于事件的很好的介绍:而且,使用F8执行过程会非常清晰。非常好。在第一个代码块中,您与
p_int
p_t
有点混淆。
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