在复杂的代码开发过程中,程序逻辑结构可能存在多个分支,使用变量时,可能需要判断变量是否为空,例如对于Range变量,可以使用如下代码。
Sub RangeDemo()
Dim rngAll As Range
Dim rng1 As Range
Set rng1 = [a1:b3]
If rngAll Is Nothing Then
Set rngAll = rng1
Else
Set rngAll = Union(rngAll, rng1)
End If
End Sub
【代码解析】
第5行代码使用Is Nothing
判断Range对象变量rngAll是否为空。
如果为空,那么第6行代码使用Set
关键字为对象变量赋值。
如果不为空,那么第7行代码使用Union
函数合并单元格区域。
rngAll为空时,使用Union
函数合并单元格区域,将产生错误号5的运行时错误。
但是Is Nothing
仅适用于对象变量,无法判断普通变量和数组变量,有的同学知道VBA中有IsEmpty
函数,从名字看似乎就是为此而生的,咱们测试一下。
Sub demo1()
Dim a() As Integer
Dim b() As Variant
Dim d As Integer
Dim e As Variant
If IsEmpty(a) Then Debug.Print "整数数组a为空"
If IsEmpty(b) Then Debug.Print "变体数组b为空"
If IsEmpty(c) Then Debug.Print "未声明变量c为空"
If IsEmpty(d) Then Debug.Print "整数变量d为空"
If IsEmpty(e) Then Debug.Print "变体变量e为空"
c = 1
e = 2
If IsEmpty(c) Then Debug.Print "未声明变量为空" Else Debug.Print "c不为空"
If IsEmpty(e) Then Debug.Print "变体变量为空" Else Debug.Print "e不为空"
End Sub
【代码解析】
代码非常简单,用于测试不同变量的结果,输出结果如下。
IsEmpty
函数仅适用于变体变量(未声明的变量,默认为变体变量),对于变体数组也不适用。第11至12行代码赋值后,第13至14行代码可以检测到变量不为空。
那么到底如何判断数组是否为空呢?其实也不复杂,
Sub demo2()
Dim a() As Integer
On Error Resume Next
LB = LBound(a)
If Err.Number = 9 Then
Debug.Print "数组为空"
Else
Debug.Print "数组不为空"
End If
On Error GoTo 0
End Sub
【代码解析】
第3行代码忽略运行时错误继续代码执行。
第4行代码使用LBound
函数读取变量的下标下界。
如果数组为空,那么将产生错误号为9的运行时错误,第5行代码捕获错误,输出提示信息。
第10行代码恢复系统错误处理机制。
如果使用如下代码声明数组,数组中每个元素的值都为零,因此数组不为空。
Sub demo3()
Dim a(1 To 2) As Integer
On Error Resume Next
LB = LBound(a)
If Err.Number = 9 Then
Debug.Print "数组为空"
Else
Debug.Print "数组不为空"
End If
On Error GoTo 0
End Sub