您可以将VBA代码放在Function或Sub之外的裸模块中吗?

时间:2018-06-29 13:36:33

标签: excel vba excel-vba

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

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

1 个答案:

答案 0 :(得分:2)

您可以使用公开声明的字典来保存您的项目可用的类的实例。您可以在函数或子函数之外声明变量,并将其声明为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

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