【发布时间】:2014-09-24 18:44:20
【问题描述】:
首先要做的事情。很有可能我想做的事情真的应该用 VB 而不是 VBA 来完成。但只要可能,我宁愿使用 VBA。
我有一个基本上由数百个标签组成的大图表的用户表单。我想将这些标签分成几组。然后将这些组分成子系统。这个想法是我有某种形式的层次结构可以使用。标签组需要根据我在组合框中选择的内容更改颜色,如果我点击其中一个标签,我想调出一个用户表单,使用点击事件显示子系统的详细信息。
我很确定我需要使用多个类来做我想做的事,但对使用类模块还是很陌生。虽然我明白了这个概念。
基本上,我想要一些功能,即子系统 -> 标签组(或部分) -> 颜色,带有整个子系统的单击事件和用于更改标签组颜色的组合框事件。 我在网上看到一个关于分组标签或文本框的线程,但它只能触发一个组的偶数,一旦触发事件,就不能更改整个组的属性。我也想在类中设置它,以便我可以导出系统以用于其他未来的用户表单。
我能够创建标签组并按照我的意愿一起更改它们:
CPart(课程模块 1): *这是为了处理标签的事件触发,包括一些颜色代码,我用来测试组一起改变的功能和改变颜色的功能。 Public WithEvents 触发 As MSForms.Label
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(类模块 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
我真的不喜欢它的工作方式,部分原因是我不断地迷失在它的逻辑中,部分原因是这意味着为了使用它,无论如何我必须在用户表单模块中制作标签集合只是为了运行它。这是非常低效的代码,但我将其放上来,以便您了解我要完成的工作。
我更愿意做的是使用一个类变量来保存我的自定义标签集合(“LabelGroup”)。可能需要另一个类变量来保存标签本身(我认为)。然后我所要做的就是为 LabelGroup 类编写方法,例如 changecolor,它可以处理。但我可以处理这部分,现在我真正需要帮助的是以一种简洁的方式设置类框架,以便我最终运行的模块可以说如下:
LabelGroup1.Add Label1
LabelGroup2.Add Label2
或
Private Sub button_click()
LabelGroup1.ChangeColor(RGB(...))
End Sub
【问题讨论】:
-
我使用类的一大原因是设置背景类模块,这样更多的初学者可以通过普通模块并更改添加到哪些组的标签。此外,一旦设置了类,我就可以对使用相同类的其他项目重复此过程。
标签: vba class module labels userform