Vba 类属性和变量之间的区别?
我是vba的新手,但我已经在谷歌上搜索过了,但没有找到任何好的答案。。。例如,为什么我会使用类来保存某个对象的名称而不是使用变量字符串?要理解为什么可能使用类属性而不是变量,我们需要从简单开始 假设我使用Excel保存员工数据库。我可能有这样的代码: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
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不支持与其他OOP语言一样的类。通过VBA类,您可以通过添加自定义属性和方法(函数)等来“扩展”MS Office对象,例如应用程序对象。这正是我阅读的有关VBA类的文章。如果我可以创建一个变量,为什么我要创建一个name属性或salary属性呢?所以,基本上,这只是一个组织问题。。。那么内存和速度呢?你认为我可以使用类来优化它吗?我从未尝试过比较速度或内存使用情况。我看重的是让宏可靠工作的时间,而不是从运行时间中节省几秒钟或节省几个字节。如果任务太大,以至于速度和/或内存使用成为问题,我不会使用VBA。