如何使用类模块设置父变量和子变量?

时间:2018-01-24 04:51:07

标签: excel vba excel-vba

首先,如果我使用不正确的术语,请原谅我对我的问题的解释,我没有经验和自学。

我正在学习使用类模块来设置"对象"更容易引用变量和运行常用功能。我遇到的问题是,我无法找到有关如何设置类模块的信息,该类模块可以充当集合以利用集合中固有的添加功能。

例如,我有一个名为clsSchool的父类模块

在这个类模块中,我已经定义了一个对象,以便我可以设置一个" child" class,clsTeacher

在我的clsTeacher类模块中,我设置了一个字符串变量Name。这就是我的2类模块的外观。

clsSchool

Public Student As Object

clsTeacher

Public Name as String

在我的模块中我有

modSchool

Set mySchool = New clsSchool
Set mySchool.Teacher = New clsTeacher

mySchool.Teacher.Name = "Jim"

此时,我的代码正是我想要的,很容易使用变量mySchool.Teacher.Name来回忆" Jim",我也可以使用mySchool.Teacher的while循环来回想一下我在c​​lsTeacher中定义的各种变量

我的问题是我想添加多个教师而不必在我的代码顶部设置多个班级,因为教师的数量可能会有所不同。即以下工作有效但有局限性。

modSchool

Set mySchool = New clsSchool
Set mySchool.Teacher1 = New clsTeacher
Set mySchool.Teacher2 = New clsTeacher
Set mySchool.Teacher3 = New clsTeacher

mySchool.Teacher1.Name = "Jim"
mySchool.Teacher2.Name = "Jack"
mySchool.Teacher3.Name = "John"

我想要的是类似于集合的工作方式。即我想找到教师的总数(因人而异)并创建一个for循环,为每位独特的教师创建一个新的clsTeacher。我想要的是以下内容,但我被卡住了,我无法找到任何有助于解释如何设置以下内容的资源。

modSchool

Set mySchool.Teacher = New clsTeacher

n_teachers = 6

for i=1 to n_teachers
    mySchool.Teacher(i).Name = Range("A1").Offset(i,0)
Next i

通过这种方式,我可以轻松地回忆起老师1或老师2的名字,并使用while / for循环来这样做。

1 个答案:

答案 0 :(得分:1)

您可以创建一个隐藏clsTeachers个集合的类(clsTeacher)。下面是一些可以完成的事情的示例 - 有效地添加到Collection可以做什么。

Private pTeachers as New Collection ' Debate: New in the declaration, or New in Class_Initialise?

Property Get Count() as Long
  Count = pTeachers
End Property

Sub AddTeacher(NewTeacher as clsTeacher)  ' enforces type. 
    pTeachers.Add(NewTeacher)
End Sub

Function SortTeachers1() as clsTeachers
Dim tNewTColl as clsTeachers
    'some sort routine using the existing collection and adding in order to a new class
    Set SortTeachers =  tNewColl
End Function

Sub SortTeachers2()
Dim tNewColl as New Collection
        'some sort routine using the existing collection and the new one
    Set pTeachers = tNewColl
End Sub

Sub PrintTeachers()
Dim tTchr as clsTeacher
    For each tTchr in pTeachers
        'valid print command or add to string for later printing
    Next 'tTchr
End Sub

这些方法仅限于你的想象力。我发现的一个缺点是在'For Each'循环中使用它是不容易的。标准For I = 1 to MyTeachers.Count是一个有用的后备 - 只是不那么整洁。在课堂上你可以:

Property Get Teacher(Index as Long) as clsTeacher
    'error check here to ensure Index exists
    if tIndexValid then
        Teacher = pTeachers(Index)
    else
        Teacher = Nothing 'or however you want to handle this
    end if
End Property

我发现这种集合很有用,因为你可以在主代码视图中隐藏验证和定制输出。正如您可以通过签名看到的那样,您还可以强制执行类型(即您选择的集合中除了教师之外不能有任何其他内容)。

**使用自定义集合执行for-each的一些参考: