类定义如何在VBA中工作

时间:2014-02-01 21:00:28

标签: vba class

当我正在努力学习VBA时,课程给我带来了一些沉重的痛苦!!!

以下是我的VBA书籍之一(VBA和Macros Microsoft Excel 2010 - Bill Jelen,第497页),这绝对是一种奇特和奇特:

  1. 我们在VBE中打开一个类模块

  2. 我们正在类模块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
    
  3. 本书写道,自定义对象现已完成

  4. 现在本书打开一个简单的模块(不是类模块)从另一个模块引用自定义对象,所以它会:

    Dim Employee as clsEmployee
    
    Set Employee = New clsEmployee
    
  5. 不是它呈现所有代码块。这里真的很尴尬的是, Dim Employee as clsEmployee 在sub procudure之外!为什么?(所以这可以被视为次要问题)

    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
    
  6. 这本书慷慨地说:

  7. 该过程将对象Employee声明为clsEmployee的新实例。然后,它将值分配给对象的四个属性,并生成一个显示员工姓名和每周工资的消息框。对象的方法EmpWeeklyPay是 用于生成显示的工资。

    我被困在这里的人

    据我所知,当我们放置(一个原始的VBA制造而不是来自类模块的自定义的)一个对象之后的属性,例如
        Application.Name
    ... VBA返回表示对象名称的String值。好的,所以VBA不知何故知道如何做到这一点。但我只是无法理解如何在书籍范例中创建自定义属性只是通过键入任何硬编码

    >
    Public EmpName As String
    Public EmpID As String
    Public EmpRate As Double
    Public EmpWeeklyHrs As Double
    

    ... 就像Name属性与Value属性不同,是什么创造了4种不同的属性?我的意思是他们的力学是如何不同的?是什么让属性EmpNameEmpID不同??? 我知道它们只是在类模块中声明的变量。我们如何通过在类模块中声明变量来创建自定义对象属性?如果你愿意,我们不应该以某种方式输入机制,分界,底盘,所以当我使用/设置EmpID时,它会查看员工ID而不是他的名字。什么实际上向我保证,当我调用EmpRate时,它不会用于EmpWeeklyHrs它是相同的数据类型,并且在他们的“蓝图”中没有其他类型的代码可以停止类模块变得不可靠的事情。肯定有一些硬编码会使ValueName属性不同,我们怎么才能在自定义对象中声明变量?这对我没有意义

    感谢您观看我漫长的问题

1 个答案:

答案 0 :(得分:4)

根据我对你的要求的理解,这是我的答案:

第一个问题:

  

Dim Employee as clsEmployee'为什么这不在代码块之外?

执行此操作时,您可以从代码的不同部分(子)引用Employee。它可以被以下代码访问。这是可选的。只有在需要时才能在子内部指定,才可以使用上面的行。这个概念通常在变量参考范围的概念下讨论。它对类对象并不特殊,但您使用的任何变量都遵循相同的规则。请看一下:Scope of variables in Visual Basic for Applications

第二个问题:

  

实际上是什么让我确信当我打电话给EmpRate时它不会去   对于EmpWeeklyHrs来说,它是相同的数据类型,没有其他数据类型   代码类型在他们的“蓝图”中阻止事物的类模块   变得不可靠。

编译器和解释器对变量名称非常具体。自从Assembler中使用寄存器以来,命名就是编码的基本方面。当您指定Employee.EmpRate时,将使用分配给Employee.EmpRate的地址中的数据,我认为它不可能将Employee.EmpRate与Employee.EmpWeeklyHrs混淆。这两个变量/属性具有不同的名称,因此将具有2个不同的存储位置。

编辑以解释非常非常简化的插图(现在这是发生了什么,但它是为了说明这个想法): enter image description here 现在,当你编码

Doc = Employee.EmpName 

VBA转到名为“Employee”的实例的存储位置,发现名为“Name”的属性存储的位置为8个字符,距离对象的值为1000的基址。然后它将指定字符串“Scott”在位置1008处找到变量Doc。