我是vba中的新手,但我已经在google上搜索但是没有找到任何好的答案...例如为什么我会使用类来保存某个名称而不是使用变量字符串?
答案 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类,因为如果问题很复杂,需要一个类: