【问题标题】:Can you put VBA code in a bare module, outside of Function or Sub?您可以将 VBA 代码放在 Function 或 Sub 之外的裸模块中吗?
【发布时间】:2018-12-08 17:27:14
【问题描述】:

我试图在用户窗体运行时保持类的集合类持久化,以便他们创建的窗体对象仍然可以具有事件处理程序。 但是,如果我在子程序或函数中为它们创建任何类,它们各自的类和事件处理程序将在创建它的任何子例程结束时被清除。

我应该指定用户输入决定有多少类,所以我不能将事件处理程序硬编码到用户表单模块中。

【问题讨论】:

  • 您可以在函数或子函数之外声明变量。包括您的类的一个实例,然后它们将可用于整个项目。 see here for how that works
  • 听起来你只需要我的公共/模块级变量。
  • 总的来说,听起来你应该研究一下面向对象编程中的scope是如何工作的。我并不是说以一种居高临下的方式,这只是在使用 OOP 语言进行任何适当编码之前您应该理解的概念
  • 至于“用户输入决定有多少类”,您可以在模块/项目级别声明一个字典,然后根据需要向其中添加/删除现有类的实例。
  • @Robofan 我很乐意向您展示其他方式,但您没有给我们任何代码来咀嚼......

标签: vba excel


【解决方案1】:

您可以使用公开声明的字典来保存可用于您的项目的类的实例。您在函数或子函数之外声明变量并将它们声明为 Public 以供其他模块及其子函数/函数使用它们。当应用程序打开时,它们会在调用之间驻留在内存中。

考虑一个名为c_gumball的类:

Public color As String
Public diameterInches As Double
Public Function getSize(unit As String) As Double
    Select Case unit
        Case "mm"
            getSize = diameterInches * 25.4
        Case "cm"
            getSize = diameterInches * 2.54
        Case "yd"
            getSize = diameterInches / 36
    End Select
End Function

然后是一个名为m_gbmachine的新模块:

Public gumballMachine As Dictionary

Public Sub createGumbalMachine()
    gumballMachine = New Dictionary
End Sub

Public Sub addGumball(color As String, sizeInInches As Double, nameKey As String)
    Dim gb As c_gumball
    Set gb = New c_gumball
    gb.color = "green"
    gb.diameterInches = 1.2
    gumballMachine.Add Key = nameKey, gb
End Sub

Public Sub removeGumball(nameKey As String)
    gumballMachine.Remove (nameKey)
End Sub

现在任何模块都可以使用 m_gbmachine.gumballMachine 字典并查看其中的内容。他们可以使用它的功能添加口香糖。

也许在您的用户表单中,您在字典中创建了一个名为“gumball2”的口香糖,然后想要在 gumballMachine 字典中获取“gumball2”的颜色属性,您可以这样做:

Public Sub button_Click()
    'add gumball 2 to the machine
    m_gbmachine.addGumball "green", 1.2, "gumball2"
End Sub

Public Sub someFormRoutine()
   'msgbox the color of gumball 2
   MsgBox m_gbmachine.gumballMachine("gumball2").color
End Sub

您可以更深入地将此模块更改为它自己的类,并拥有许多口香糖机实例。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-02-08
    • 2011-03-16
    • 2021-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-16
    • 1970-01-01
    相关资源
    最近更新 更多