vba - 使用 VBA 创建自定义事件

标签 vba excel

我正在努力理解如何使用 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

在Sheet1后面的代码中:

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 中声明的 WithEvents 对象。将 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_BeforeCalc(),这很好,因为这样您可以定义 n 个对象在 gModule 中,当事件被触发时,它们都会触发相同的事件代码。

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

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

关于vba - 使用 VBA 创建自定义事件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25465642/

相关文章:

excel - VBA Excel - 在特定文本下划线

excel - 如果没有找到与搜索值匹配的行

python - 使用python限制excel文件中的工作表数量

Excel VBA 句子大小写函数

phpexcel将图像导出到excel

worksheet-function - 来自不同工作簿的 VLOOKUP

vba - 在PowerPoint图表中更改数据标签格式

forms - 当表单中的任何文本框更改时运行函数? Access 权限

VBA在下一个空白行正确输入用户表单数据

excel - 如何在 VBA 中使用 OFFSET 工作表函数?