VBA-类的“子对象”

时间:2018-08-27 14:30:38

标签: vba excel-vba class

我想建立技能结构和那些技能领域。例如:数学区域中的技能乘法

我的区域具有某些属性(名称或权重),我的技能也具有属性(名称,权重,等级等)。

我想使用以下语法:

Areas(1).Skills(2).Name = "solving equations"

有可能吗?感谢to your help,现在我可以在代码中使用Areas(1).Name了,现在我正在寻求下一步的帮助。

我想如果我有Areas(1).Skill.Name语法,我可以通过添加技能索引来解决,所以问题就出在如何创建类的“子对象” (使用{ {1}}仍将“区域”作为对象)?

1 个答案:

答案 0 :(得分:0)

为此,您首先需要将类模块插入VBA项目。

在VBE中,右键单击您的VBA项目:插入>类模块

添加两个类模块:

  1. 首先,您将调用Skill-在属性中,将名称更改为Skill。双击它,然后在此处输入此代码:

    Public Name As String
    Public Weight As Double
    Public Rank As Long
    'any other fields you want
    
  2. 第二类模块-再次在属性中将名称更改为Area。 根据您的描述,我假设您想在那里收集技能。为此,您需要单击功能区中的工具,转到参考并添加 Microsoft.Scripting.Runtime 。然后粘贴该类的代码:

    Public Name As String
    Public Weight As Double
    Private pSkill As Collection
    
    Property Get Skills() As Collection
        Set Skill = pSkill
    End Property
    
    Property Let Skills(arg As Collection)
        Set pSkill = arg
    End Property
    

请注意,我们没有在pSkill中指定元素的类型,因此在处理它时需要小心。

完成所有这些操作后,您可以根据需要使用它,如以下代码所示:

Sub s()
    Dim s1 As Skills, s2 As Skills
    Set s1 = New Skill
    Set s2 = New Skill
    s1.Name = "solving equations"
    s1.Weight = 2.03
    s1.Rank = 1
    s2.Name = "counting to ten"
    s2.Weight = 1.01
    s2.Rank = 2

    Dim a(1) As Area, someSkills As Collection
    Set someSkills = New Collection

    someSkills.Add s1
    someSkills.Add s2

    Set a(0) = New Area
    a(0).Skill = someSkills

    MsgBox a(0).Skills(1).Name

End Sub