Vba 类属性和变量之间的区别?

Vba 类属性和变量之间的区别?,vba,excel,Vba,Excel,我是vba的新手,但我已经在谷歌上搜索过了,但没有找到任何好的答案。。。例如,为什么我会使用类来保存某个对象的名称而不是使用变量字符串?要理解为什么可能使用类属性而不是变量,我们需要从简单开始 假设我使用Excel保存员工数据库。我可能有这样的代码: Sub Demo1() Dim EmpName As String Dim EmpId As String Dim EmpDateOfBirth As Date Dim EmpMgrId As String EmpNam

我是vba的新手,但我已经在谷歌上搜索过了,但没有找到任何好的答案。。。例如,为什么我会使用类来保存某个对象的名称而不是使用变量字符串?

要理解为什么可能使用类属性而不是变量,我们需要从简单开始

假设我使用Excel保存员工数据库。我可能有这样的代码:

Sub Demo1()  

  Dim EmpName As String
  Dim EmpId As String
  Dim EmpDateOfBirth As Date
  Dim EmpMgrId As String

  EmpName = "Smith, John"
  EmpId = "S024"
  EmpDateOfBirth = DateSerial(1991, 5, 20)
  EmpMgrId = "B012"

End Sub
Sub Demo2()

  Const ColEmpId As Long = 1
  Const ColEmpName As Long = 2

  Dim EmpName As String
  Dim EmpId As String
  Dim EmpDateOfBirth As Date
  Dim EmpMgrId As String

  Dim MgrName As String
  Dim MgrId As String

  Dim RngCrnt As Range

  EmpName = "Smith, John"
  EmpId = "S024"
  EmpDateOfBirth = DateSerial(1991, 5, 20)
  EmpMgrId = "B012"

  Set RngCrnt = Columns(ColEmpId).Find(What:=EmpMgrId)
  If RngCrnt Is Nothing Then
    ' Manager Id not found
  Else
    Debug.Assert False
    MgrId = Cells(RngCrnt.Row, ColEmpId).Value
    MgrName = Cells(RngCrnt.Row, ColEmpName).Value
  End If

  ' Have information for report on new employee

End Sub
我有员工四个属性的简单变量。在这里,我使用了简单的分配,但在实际的程序中,我会从用户那里输入姓名、出生日期和经理Id,并使用代码生成员工Id

如果我想写一份新员工的报告,我可能需要经理的名字。当然,我想检查经理Id是否存在。我可能有这样的代码:

Sub Demo1()  

  Dim EmpName As String
  Dim EmpId As String
  Dim EmpDateOfBirth As Date
  Dim EmpMgrId As String

  EmpName = "Smith, John"
  EmpId = "S024"
  EmpDateOfBirth = DateSerial(1991, 5, 20)
  EmpMgrId = "B012"

End Sub
Sub Demo2()

  Const ColEmpId As Long = 1
  Const ColEmpName As Long = 2

  Dim EmpName As String
  Dim EmpId As String
  Dim EmpDateOfBirth As Date
  Dim EmpMgrId As String

  Dim MgrName As String
  Dim MgrId As String

  Dim RngCrnt As Range

  EmpName = "Smith, John"
  EmpId = "S024"
  EmpDateOfBirth = DateSerial(1991, 5, 20)
  EmpMgrId = "B012"

  Set RngCrnt = Columns(ColEmpId).Find(What:=EmpMgrId)
  If RngCrnt Is Nothing Then
    ' Manager Id not found
  Else
    Debug.Assert False
    MgrId = Cells(RngCrnt.Row, ColEmpId).Value
    MgrName = Cells(RngCrnt.Row, ColEmpName).Value
  End If

  ' Have information for report on new employee

End Sub
这有点混乱,我只处理两名员工。如果我想将整个员工数据库加载到内存中怎么办?我需要阵列:

  Dim EmpName() As String
  Dim EmpId() As String
  Dim EmpDateOfBirth() As Date
  Dim EmpMgrId() As String
  Dim InxEmpNew as Long
  Dim InxMgr as Long
使其更易于管理的第一步是使用大多数编程语言所称的结构,而VBA所称的是用户类型或简单类型

Type sEmp
  Name As String
  Id As String
  DoB As Date
  MgrId As String
End Type
这定义了一种新类型的变量调用
sEmp
。(注1:类型定义必须在任何子类和函数之前。注2:前导的“s”是我的惯例,不是必需的。)我现在可以用
Dim
语句声明
sEmp
的实例:

Sub Demo3()

  Const ColEmpId As Long = 1
  Const ColEmpName As Long = 2

  Dim NewEmp As sEmp
  Dim Mgr As sEmp
  Dim Emp() As sEmp      ' Not used but shows it is possble

  Dim RowCrnt As Long

  NewEmp.Name = "Smith, John"
  NewEmp.Id = "S024"
  NewEmp.DoB = DateSerial(1991, 5, 20)
  NewEmp.MgrId = "B012"

  RowCrnt = Columns(ColEmpId).Find(What:=NewEmp.MgrId).Row
  Mgr.Id = Cells(RowCrnt, ColEmpId).Value
  Mgr.Name = Cells(RowCrnt, ColEmpName).Value

  ' Have information for report on new employee

End Sub
在这个简单的示例中,用户类型的优势并不十分明显。但是,用户类型可以嵌套:

Type sName
  Given As String
  Family As String
End Type

Type sEmp
  Name As sName
  Id As String
  DoB As Date
  MgrId As String
End Type

Sub Demo4()

  Dim NewEmp As sEmp

  NewEmp.Name.Family = "Smith"
  NewEmp.Name.Given = "John"
  NewEmp.Id = "S024"
  NewEmp.DoB = DateSerial(1991, 5, 20)
  NewEmp.MgrId = "B012"

End Sub
这仍然相当简单,但我相信它暗示了什么是可能的。用户类型可以嵌套,也可以包含数组。您可以创建几乎任何复杂的结构,并以没有用户类型就不可能实现的方式对其进行管理

对于我所知道的所有其他语言,类是结构的一个进步。类提供了结构的所有功能以及将代码与类关联的能力。VBA的情况并非如此。VBA类允许您将代码与之关联,但会失去用户类型的许多功能

很多人不同意,但我不使用Excel VBA类,因为如果问题非常复杂,需要一个类:

  • 我可能需要一个合适的数据库
  • 这个问题对于VBA来说太复杂了

  • “为什么我会使用类来保存某个东西的名称而不是使用变量字符串”-没有意义。你不会只使用类来存储变量。类是在其他代码中使用的对象的代码模板。VBA不支持与其他OOP语言一样的类。通过VBA类,您可以通过添加自定义属性和方法(函数)等来“扩展”MS Office对象,例如应用程序对象。这正是我阅读的有关VBA类的文章。如果我可以创建一个变量,为什么我要创建一个name属性或salary属性呢?所以,基本上,这只是一个组织问题。。。那么内存和速度呢?你认为我可以使用类来优化它吗?我从未尝试过比较速度或内存使用情况。我看重的是让宏可靠工作的时间,而不是从运行时间中节省几秒钟或节省几个字节。如果任务太大,以至于速度和/或内存使用成为问题,我不会使用VBA。