VBA Set 对象赋值

先回顾变量的赋值操作

变量名 = 值

但本章中出现大量的set赋值操作

Set 变量名 = 值

问题:什么时候使用set?

根据变量的数据类型来区分:

如果数据类型属于,变量此时也称之为对象,为对象赋值则需要通过set赋值;

如果数据类型不属于类,变量不是对象,则不需要通过set赋值。


IsObject方法用于判断变量的类型是否类。

Object类是所有类的父类。


示例

例1:不是类的数据类型。Integer、Double、String、Date等类型都不是类。

Sub sub1()
  Dim a1 As Integer
  Dim a2 As Double
  Dim a3 As String
  Dim a4 As Date
  Debug.Print IsObject(a1)    '打印 False
  Debug.Print IsObject(a2)    '打印 False
  Debug.Print IsObject(a3)    '打印 False
  Debug.Print IsObject(a4)    '打印 False

  a1 = 2023
  a2 = 20.23
  a3 = "小步教程"
  a4 = #6/16/2023#
End Sub

例2:创建属于类的数据类型。这里我们创建自己的类Student。

[工程资源管理器],右键菜单—[插入]—[类模块]。

img

属性窗口中修改名称为自定义名称:Student

img

Student中包含三个属性:ID、姓名、性别,display方法,显示信息。代码如下:

Public m_id As Integer   '学生ID
Public m_name As String   '学生姓名
Public m_gender As Boolean '学生性别

'显示学生信息
Public Sub display()
  Debug.Print "id:" & m_id & ",name:" & m_name & ":gender:" & m_gender
End Sub

有一类数据类型通过创建类模块来声明类。它的祖宗父类实际就是Object。


在其它码窗口中编写使用Student类。注:下面代码不能放在Student类中。

Sub sub2()
  '声明类的变量,即对象
  Dim a1 As Student
  '为对象赋值需要Set
  Set a1 = New Student

  '对象的属性不是类这个类型,所以不用set
  a1.m_id = 1001
  a1.m_name = "小步教程"
  a1.m_gender = True
  a1.display

  Dim a2 As Student
  '把A对象赋值给B对象,也需要使用Set
  Set a2 = a1
  a2.display
  
  Debug.Print IsObject(a1)    '打印True
  Debug.Print IsObject(a2)    '打印True
  '打印False,因为a1.m_id是Integer类型
  Debug.Print IsObject(a1.m_id)  

End Sub

其中两处使用了Set,都是为对象本身赋值;

而为对象的成员赋值,一般不用。


例3:判断四大Excel对象对应的类型是否属于类。

Sub sub3()

  Dim a1 As Application
  Dim a2 As Workbook
  Dim a3 As Worksheet
  Dim a4 As Range

  Debug.Print IsObject(a1)
  Debug.Print IsObject(a2)
  Debug.Print IsObject(a3)
  Debug.Print IsObject(a4)

End Sub

输出结果:全部返回True。


小结:通过IsObject判断返回为True的类型,需要使用Set;返回False则不需要。