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

时间:2015-03-21 19:35:44

标签: vba excel-vba excel

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

1 个答案:

答案 0 :(得分:2)

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

假设我使用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

我有一个简单的变量用于员工的四个属性。在这里,我使用了简单的作业,但在实际程序中,我会从用户输入姓名,出生日期和经理ID,并拥有生成员工ID的代码。

如果我想生成新员工的报告,我可能需要经理的姓名。当然,我想检查管理员ID是否存在。我可能有这样的代码:

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"是我的约定,不是必需的。)我现在可以声明sEmp的实例Dim声明:

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类,因为如果问题很复杂,需要一个类:

  1. 我可能想要一个合适的数据库
  2. 对于VBA来说问题太复杂了。