在vba中使用分组创建用户表单对象层次结构



重要的事情先说。有一个很好的机会,我想做的事情应该用VB而不是VBA来完成。但只要有可能,我宁愿使用VBA。

我有一个用户表单,本质上是一个由数百个标签组成的大图表。我想把这些标签分成几组。然后把这些组分成子系统。我的想法是,我要处理某种形式的等级制度。标签组需要根据我在组合框中所选择的内容更改颜色,如果我单击其中一个标签,我希望显示一个用户表单,该表单使用单击事件显示子系统的详细信息。

我很确定我需要使用多个类来做我想做的事情,但我对使用类模块相当陌生。不过我懂你的意思。

基本上我想要一些功能,去子系统->标签组(或部分)->颜色与整个子系统的单击事件和组合框事件更改标签组颜色。我在网上看到了一个关于分组标签或文本框的帖子,但它只能触发一个组的even,而不能在事件触发后改变整个组的属性。我也想在类中设置这个,这样我就可以导出系统用于其他未来的用户表单。

我可以创建标签组并按我想要的方式一起更改它们:

CPart (Class Module 1):*这是为了处理标签的事件触发,包括一些颜色代码,我用来测试组一起改变的功能和改变颜色的功能。公共WithEvents触发器作为msform。标签

Dim pLabels As Collection
Property Set triggers(c As Collection)
    Set pLabels = c
End Property
Private Sub trigger_Click()
    For Each obj In pLabels
        obj.BackColor = RGB(255, 0, 0)
    Next obj
End Sub

CTrigger (Class Module 2):*这是一个标签的集合,通过用户表单中的集合变量传递,然后将每个标签作为触发器存储在一个单独的类变量中,以及该组中的整个标签集合。这样,当任何触发器触发事件时,所有的标签都会改变。

Dim CTrigger() As New CPart
Dim pLabels As Collection
Dim i As Integer
Property Set Labels(c As Collection)
    Set pLabels = c
    For i = 1 To pLabels.Count
        ReDim Preserve CTrigger(1 To i)
        Set CTrigger(i).trigger = pLabels.Item(i)
        Set CTrigger(i).triggers = pLabels
    Next i
End Property
Property Get Labels() As Collection
    Labels = pLabels
End Property

我真的不喜欢它的工作方式,部分原因是我在它的逻辑中不断失去自己,部分原因是它意味着为了使用它,我必须在userform模块中收集标签,无论如何只是为了运行它。这是一个非常低效的代码,但我把它放在上面,这样你就能知道我想要完成什么。

我更愿意做的是用一个类变量来保存我的自定义标签集合("LabelGroup")。可能需要另一个类变量来保存标签本身(我认为)。然后我要做的就是遍历并为LabelGroup类编写功能,比如changecolor,它能处理那个。但我可以处理这部分,现在我真正需要帮助的是用一种整洁的方式设置类框架,这样我最终运行的模块就可以像这样说:

LabelGroup1.Add Label1
LabelGroup2.Add Label2

Private Sub button_click()
    LabelGroup1.ChangeColor(RGB(...))
End Sub

这两篇文章一直在帮助我:http://www.databaseadvisors.com/newsletters/newsletter200503/0503usingcustomcollections/using%20custom%20collections%20in%20microsoft%20access.asp

http://j-walk.com/ss/excel/tips/tip44.htm

我只是在看一些类似的东西,但不是很详细。我试图通过使其看起来更现代来改善复杂用户表单的外观,并试图为放置在图形按钮上方的标签伪造鼠标高亮或至少是活动/非活动阴影。

无论如何,您是否考虑过更改标签对象的名称,以便它们以某种组或子系统ID作为前缀/后缀?

这样,当你把它们传递给子元素来改变它们的颜色时,你可以检查前缀或后缀

最新更新