首先,如果我使用不正确的术语,请原谅我对我的问题的解释,我没有经验和自学。
我正在学习使用类模块来设置"对象"更容易引用变量和运行常用功能。我遇到的问题是,我无法找到有关如何设置类模块的信息,该类模块可以充当集合以利用集合中固有的添加功能。
例如,我有一个名为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循环来回想一下我在clsTeacher中定义的各种变量
我的问题是我想添加多个教师而不必在我的代码顶部设置多个班级,因为教师的数量可能会有所不同。即以下工作有效但有局限性。
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循环来这样做。
答案 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的一些参考: