使用VBA创建自定义事件

使用VBA创建自定义事件,vba,excel,Vba,Excel,我正在努力理解如何使用VBA中的类模块创建自定义事件 我已经把下面这个简单的例子放在一起了。在A1和B1中输入一个值,然后重新激活工作表以计算这两个值的总和,然后我希望会触发一个事件来警告计算,但什么也没有发生 如果有人能帮我解决这个问题,我将不胜感激 类别模块cCalc: Dim m_wks As Worksheet Public Event BeforeCalc() Property Set Worksheet(wks As Worksheet) Set m_wks = wks E

我正在努力理解如何使用VBA中的类模块创建自定义事件

我已经把下面这个简单的例子放在一起了。在A1和B1中输入一个值,然后重新激活工作表以计算这两个值的总和,然后我希望会触发一个事件来警告计算,但什么也没有发生

如果有人能帮我解决这个问题,我将不胜感激

类别模块cCalc:

Dim m_wks As Worksheet
Public Event BeforeCalc()

Property Set Worksheet(wks As Worksheet)
    Set m_wks = wks
End Property

Public Sub Calc()
Dim dVal1 As Double
Dim dVal2 As Double

    With m_wks
        dVal1 = .Range("A1").Value
        dVal2 = .Range("B1").Value

        RaiseEvent BeforeCalc
        .Range("C1").Value = dVal1 + dVal2
    End With


End Sub
在模块mGlobal中:

Public gCalc As cCalc
在代码隐藏表1中:

Private WithEvents calcEvent As cCalc

Private Sub calcEvent_BeforeCalc()
    MsgBox "About to Calc!", vbInformation
End Sub

Private Sub Worksheet_Activate()
    Set gCalc = New cCalc

    Set gCalc.Worksheet = ActiveSheet
    gCalc.Calc

End Sub

不能在模块中声明事件驱动类。您需要将gModule中的cCalc引用设置为等于您在Sheet1中用events声明的对象。将Sheet1中的代码更改为我在下面写的代码,它将起作用:

Private WithEvents calcEvent As cCalc

Private Sub calcEvent_BeforeCalc()
    MsgBox "About to Calc!", vbInformation
End Sub

Private Sub Worksheet_Activate()
    Set calcEvent = New cCalc          'Instantiate the WithEvents object above
    Set mGlobal.gCalc = calcEvent      'Set the object declared in gModule

    Set mGlobal.gCalc.Worksheet = ActiveSheet
    mGlobal.gCalc.Calc
End Sub
请注意,这是使用您放入gModule中的变量。。。实际调用的事件仍然是calcEvent\u BeforeCalc(),这很好,因为您可以在gModule中定义n个对象,这些对象在触发事件时都会触发相同的事件代码

为了简化代码,您可以编写:

Private Sub Worksheet_Activate()
    Set calcEvent = New cCalc
    Set calcEvent.Worksheet = ActiveSheet
    calcEvent.Calc
End Sub

没有测试过您的代码,我以前也没有这样做过,但是在某个时候您不需要
设置gCalc=New cCalc