Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/actionscript-3/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Vba 如何使用类模块设置父变量和子变量?_Vba_Excel - Fatal编程技术网

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

Vba 如何使用类模块设置父变量和子变量?,vba,excel,Vba,Excel,首先,请原谅我对问题的解释,如果我使用了错误的术语,我没有经验,也没有自学能力 我正在学习使用类模块来设置“对象”,以便更容易地引用变量和运行公共函数。我遇到的问题是,我找不到有关如何设置一个类模块的信息,该模块可以作为一个集合来使用集合中固有的add函数 例如,我有一个名为clsSchool的父类模块 在这个类模块中,我定义了一个对象,以便设置一个“子”类clsTeacher 在clsTeacher的类模块中,我设置了一个字符串变量名。这就是我的两个类模块的外观 学校 克莱斯蒂彻 在我的模块中

首先,请原谅我对问题的解释,如果我使用了错误的术语,我没有经验,也没有自学能力

我正在学习使用类模块来设置“对象”,以便更容易地引用变量和运行公共函数。我遇到的问题是,我找不到有关如何设置一个类模块的信息,该模块可以作为一个集合来使用集合中固有的add函数

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

在这个类模块中,我定义了一个对象,以便设置一个“子”类clsTeacher

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

学校

克莱斯蒂彻

在我的模块中,我有

莫德学校

此时,我的代码正是我想要的。使用变量mySchool.Teacher.Name调用“Jim”非常容易,我还可以使用mySchool.Teacher的while循环调用我在clsTeacher中定义的各种变量

我的问题是,我想添加多个教师,而不必在代码顶部设置多个类,因为教师的数量可能会有所不同。也就是说,以下方法确实有效,但有局限性

莫德学校

我想要的是类似于集合的工作方式。也就是说,我想找到教师总数(各不相同),并创建一个for循环,为每个独特的教师创建一个新的clsTeacher。我想要的是以下内容,但是我被卡住了,我找不到任何有助于解释如何设置以下内容的资源

莫德学校

这样,我就可以很容易地回忆起教师1或教师2的名字,并使用while/for循环来执行此操作。

您可以创建一个类(
clsTeachers
),它隐藏了
clsTeacher
的集合。下面是一些可以做的事情的示例—有效地增加了集合的功能

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”循环中使用它并不容易。MyTeachers.Count的I=1的标准
,是一个有用的后备方法,只是没有那么整洁。在课堂上,你可以有:

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”的一些参考:

  • 其中包括其他链接

看看这个:感谢您的快速响应,我会努力完成您向我展示的内容,并更好地理解它。但听起来这正是我想要的。谢谢结果我很困惑。您提供的主代码是否在类clsTeachers中?你能向我解释以下几行代码吗?我正在努力理解正在发生的事情。私人私人私人收藏家作为新收藏品的争论:是宣言中的新收藏品,还是课堂上的新收藏品?Sub AddTeacher(新教师作为clsTeacher)强制类型。Add(NewTeacher)End sub我想,如果我没有弄错的话,Addteacher sub应该需要像字符串一样的变量输入吗?即添加教师(新教师作为字符串)。这很有效,它需要我为每一个属性进行收集。是否可以将集合项设置为类?@Soggy Yes:main代码说明了
clsTeachers
中可以包含的内容
AddTeacher
在我的示例中,获取一个对象
clsTeacher
(您的代码)-换句话说,您创建一个教师,然后将其添加到集合中。有很多方法可以获得
clsTeachers
来添加
clsTeacher
给定的字符串输入,但我在这个简单的示例中忽略了这一点,主要是因为随着类变得越来越复杂,嵌套创建也变得越来越复杂。同样,我上面的代码是说明性的,您可以在类中创建所需的任何方法。
Set mySchool = New clsSchool
Set mySchool.Teacher = New clsTeacher

mySchool.Teacher.Name = "Jim"
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"
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
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
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