【发布时间】:2014-02-25 12:53:08
【问题描述】:
当我尝试学习 VBA 时,课程让我感到非常痛苦!!!
这是我的一本 VBA 书籍(VBA 和宏 Microsoft Excel 2010 - Bill Jelen,第 497 页),这绝对是奇特的:
我们在 VBE 中打开一个类模块
-
我们正在类模块
clsEmployee中编写自定义对象的4个属性和1个方法:'Properites Public EmpName As String Public EmpID As String Public EmpRate As Double Public EmpWeeklyHrs As Double 'Methods Public Function EmpWeeklyPay() As Double EmpWeeklyPay = EmpRate * EmpWeeklyHrs End Function 书中写道自定义对象现已完成
-
现在这本书去打开一个简单的模块(不是类模块)来引用另一个模块的自定义对象,所以它是这样的:
Dim Employee as clsEmployee Set Employee = New clsEmployee -
不是它呈现所有代码块。这里真正尴尬的是 Dim Employee as clsEmployee 是 在子程序之外!为什么?(所以这可以看作是次要问题)
Option Explicit Dim Employee as clsEmployee 'why is this outside of the code block? Sub EmpPay() Set Employee = New clsEmployee With Employee .EmpName = "Tracy Syrstad" .EmpID = "1651" .EmpRage = 25 .EmpWeeklyHrs = 40 MsgBox .EmpName & " earns $" & .EmpWeeklyPay & " per week." End With End Sub 这本书优雅地说:
该过程将对象Employee 声明为clsEmployee 的新实例。然后,它为对象的四个属性赋值,并生成一个显示员工姓名和周薪的消息框。对象的方法EmpWeeklyPay 是
用于生成显示的工资。
我被困在这里的人
据我所知,当我们在一个对象之后放置一个属性(一个原始的 VBA 制作,而不是来自类模块的自定义一个)Application.Name
...VBA 返回一个表示对象名称的字符串值。好的,所以 VBA 不知何故知道如何做到这一点。但我无法理解如何在书籍范式中创建自定义属性只是通过输入没有硬编码的内容
Public EmpName As String
Public EmpID As String
Public EmpRate As Double
Public EmpWeeklyHrs As Double
...正如 Name 属性与 Value 属性不同,是什么创建了 4 个不同的属性?我的意思是他们的机制有什么不同?是什么让属性EmpName 与EmpID 不同??? 据我所知,它们只是在类模块中声明的变量。我们如何仅通过在类模块中声明变量来创建自定义对象属性???如果你愿意,我们不应该以某种方式输入机械师、分界线和底盘,所以当我使用/设置EmpID 时,它会查看员工 ID 而不是他的名字。实际上向我保证的是,当我调用 EmpRate 时,它不会使用 EmpWeeklyHrs 它是相同的数据类型,并且在类模块的“蓝图”中没有其他类型的代码来阻止事情变得不可靠.肯定有一些硬编码的东西使Value 和Name 属性不同,我们怎么能只在自定义对象中声明变量?这对我来说毫无意义
感谢您观看我的长长长长的问题
【问题讨论】:
-
也许要意识到的一件事是像
Application这样的内置类(在功能意义上)与您的自定义类做同样的事情。您不会期望Application.Name与Application.Intersect混淆,对吧?当然不是,原因是这些属性在Application类中有不同的声明,就像你的EmpID和EmpRate一样。 -
命名法:在第一个代码块中,您所称的属性实际上是变量,而您所称的方法是属性。
-
Dim Employee As clsEmployee声明了对象变量 Employee,它将具有在类 clsEmployee 中定义的属性和行为。与Dim sLabel As String相同的方式使用内置类 String 定义的属性和行为声明变量 sLabel。变量 Employee 直到Set Employee = New clsEmployee才被实例化(创建)。