【问题标题】:How do I use class modules to set up parent and child variables?如何使用类模块来设置父变量和子变量?
【发布时间】:2018-01-24 13:59:47
【问题描述】:

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

我正在学习使用类模块来设置“对象”以更轻松地引用变量并运行常用函数。我遇到的问题是我找不到有关如何设置类模块的信息,该模块可以充当集合以利用集合中固有的 add 函数。

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

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

在我的 clsTeacher 类模块中,我设置了一个字符串变量名称。这就是我的 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 中定义

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

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"

我想要的是类似于集合的工作方式。 IE。我想找到教师的总数(不同)并创建一个 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 循环来做到这一点。

【问题讨论】:

标签: vba excel


【解决方案1】:

您可以创建一个隐藏clsTeachers 集合的类 (clsTeachers)。下面是一些可以做的事情的示例 - 有效地添加到 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 的一些参考:

【讨论】:

  • 感谢您的快速回复,我会尽力完成您向我展示的内容并更好地理解它。但听起来这正是我所追求的。谢谢!
  • 原来我很困惑。您在 clsTeachers 类中提供的主要代码是什么?您能否向我解释以下代码行?我正在努力理解正在发生的事情。 Private pTeachers as New Collection' 辩论:声明中的新内容,还是 Class_Initialise 中的新内容? Sub AddTeacher(NewTeacher as clsTeacher) ' 强制类型。 pTeachers.Add(NewTeacher) 结束子
  • 我想,如果我没记错的话,Addteacher sub 应该需要像字符串一样的变量输入吗? IE。 AddTeacher(NewTeacher 作为字符串)。这很好用,它需要我为每个属性制作一个集合。是否可以将集合项设置为类?
  • @Soggy 是的:主要代码说明了clsTeachers 中的内容。 AddTeacher 在我的示例中采用 clsTeacher 对象(您的代码) - 换句话说,您创建了一个教师,然后将其添加到集合中。有一些方法可以让clsTeachers 在给定字符串输入的情况下添加clsTeacher,但我在这个简单的示例中省略了它,主要是因为随着类变得更加复杂,嵌套创建也变得更加复杂。同样,我上面的代码是说明性的,你可以在你的类中创建你需要的任何方法。
猜你喜欢
  • 1970-01-01
  • 2019-02-01
  • 1970-01-01
  • 1970-01-01
  • 2015-09-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多