vba - 类定义如何在 VBA 中工作

标签 vba class

当我正在尝试学习 VBA 时,类(class)让我感到非常痛苦!!!

这是我的一本 VBA 书籍(VBA 和 Macros Microsoft Excel 2010 - 第 497 页的 Bill Jelen)中的一些内容,这绝对是奇怪和奇特的:

  • 我们在 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
    
  • 不是它呈现所有代码块。这里真正尴尬的是,作为 clsEmployee 的 Dim Employee 是 子程序之外!为什么? (所以这可以看作是次要问题)
    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 个不同的属性?我的意思是他们的机制有什么不同?是什么让属性(property) EmpName不同于 EmpID ??? 据我所知,它们只是在类模块中声明的变量。我们如何通过在类模块中声明变量来创建自定义对象属性???如果你愿意,我们不应该以某种方式输入机制、分界线和底盘,所以当我使用/设置 EmpID 时它将查看员工 ID 而不是他的姓名。当我调用 EmpRate 时,实际上是什么让我确信它不会去 EmpWeeklyHrs它是相同的数据类型,并且在类模块的“蓝图”中没有其他类型的代码可以阻止事情变得不可靠。肯定有一些硬编码的东西使 ValueName属性不同我们如何只能在自定义对象中声明变量?对我来说完全是无稽之谈

    感谢您观看我的长长长长的问题

    最佳答案

    根据我对您所问问题的理解,这是我的回答:

    第一个问题:

    Dim Employee as clsEmployee 'why is this outside of the code block?



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

    第二个问题:

    What is actually assuring me that when i call the EmpRate it won't go for the EmpWeeklyHrs it's the same data type and there is no other type of code in their "blueprint" the class module to stop things from getting unreliable.



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

    编辑用一个非常非常简化的插图来解释(这当然是现在发生的事情,但它是为了说明这个想法):
    enter image description here
    现在,当你编码
    Doc = Employee.EmpName 
    

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

    关于vba - 类定义如何在 VBA 中工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21503604/

    相关文章:

    c++ - C++ 中的函数 const 局部对象会怎样?

    html - 从使用 Java 脚本进行查询的站点中提取数据

    vba - 插入行而不选择任何内容?

    Excel VBA循环遍历空单元格并检索行值

    Excel TEXT(dd.mm.yyyy) 函数和不同的客户端语言

    php - 访问兄弟类方法

    excel - Range.ClearContents 清除系统剪贴板 - 解决方法? (VBA/Excel)

    cocoa : Send class data to the user interface (Databinding?)

    c++ - (内存地址)处的未处理异常 (msvcr110.dll)

    带 1 个参数的 C++ 2D 数组索引(为什么这行得通?)