【问题标题】:How can I tell if something is an event based on its signature?如何根据签名判断某事是否为事件?
【发布时间】:2022-09-23 23:30:21
【问题描述】:

我最近假设因为函数的名称除了它的定义之外没有出现在代码库中的任何地方,它一定是死代码。后来我发现它实际上是一个事件,因此没有死。它的名字和签名是Private Sub lstFooWeekly_Change()。现在我知道了the Change() event,很明显这段代码没有死。将来,我希望能够提前发现事件。

我的问题是:给定看起来像函数的东西的签名,我怎么知道它是否是一个事件?

注意:我是一个完全的 VBA 新手。我尝试在文档中搜索我的问题的任何答案,但我发现的只是特定事件的文档。似乎一般模式是“如果它是Private Sub 并且名称中有_,那么它就是一个事件”,但如果没有官方来源,我不能相信这一点。此外,对于我的“如果”猜测,我更喜欢“当且仅当”解决方案。如果我正在寻找的东西在任何地方都有记录,我会很感激一个链接。

  • 事件的名称中确实有一个_,但并非所有具有_ 的子例程都是事件处理程序(例如,使用snake_case 编写的用户,如Sub Foo_Bar_Baz,这是一个很好的理由不是使用snake_case)。
  • 为了安全起见,请仅信任文档和适用的 VBA 对象浏览器。
  • @KostasK。对象浏览器可以在这里提供帮助吗?我对此比较无知。
  • 是的,它可以。它列出了(几乎)所有对象的属性、方法和事件。没有太多的信息,但你可以看到发生了什么。
  • @KostasK。我刚刚看了看。我没有看到任何清楚地告诉我所讨论的事件是事件的东西。

标签: excel vba events


【解决方案1】:

也许这个“虚拟”示例有助于澄清。让我们创建两个类

clsRaise

Public Event Dummy()

Public Sub raiseDummy()
    RaiseEvent Dummy
End Sub

clsSink

Public WithEvents my As clsRaise

Private Sub Class_Initialize()
    Set my = New clsRaise
End Sub

Private Sub Class_Terminate()
    my.raiseDummy
End Sub

Sub my_dummy()
    MsgBox "Oh no Risen from the code"
End Sub

只需按 F8 而不是 F5 单步执行代码并观看

Sub TestDummy()
    Dim mD As clsSink
    Set mD = New clsSink
End Sub

还可以查看 VBA 项目的对象浏览器,您会看到在 clsRaise 中有事件 Dummy,在类 clsSink 中有子 my_dummy,它实现了该事件。这个子的命名规则是<variable name>_<eventname>。由于您还可以使用下划线命名任何过程,因此您不能仅通过名称来判断过程是否实现了事件。

进一步reading。希望这是有道理的

【讨论】:

    猜你喜欢
    • 2019-07-11
    • 2014-05-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-10-02
    相关资源
    最近更新 更多