VB中判断空的几种方法(Null, Missing, Empty, Nothing, vbNullString)
VB6 里有几个特别容易让人迷糊的“特殊值”——Null、Missing、Empty、Nothing、vbNullString。除了最后一个,其他几个都不能直接用 a = 值 这种方式来判断。下面咱们逐个拆解,理清楚它们到底是怎么回事。 1、Null Null 代表“空值”,本质上是一个不合法的数据
VB6 里有几个特别容易让人迷糊的“特殊值”——Null、Missing、Empty、Nothing、vbNullString。除了最后一个,其他几个都不能直接用 a = 值 这种方式来判断。下面咱们逐个拆解,理清楚它们到底是怎么回事。

1、Null
Null 代表“空值”,本质上是一个不合法的数据。判断一个变量是不是 Null,得用 SQL 里的 IsNull 函数。
1.1 IsNull 函数
IsNull 函数:用指定的替换值替换 NULL。
语法:IsNull( check_expression , replacement_value )
isnull(a,0) '如果a字段有空值返回0 没有空值就返回a的本身 isnull(a,1)=2 '字段a有空值返回1,判断isnull(a,1)是否等于2 '从TbStudent里查找stuAdress为空值的学生姓名和学号,并把空值替换成未知' 'stuAdress是int类型的,未知是varchar类型的,不允许添到同一列上' select stuName,stuNumber,ISNULL(stuAdress,'未知') from TbStudent
check_expression:要被检查是否为 NULL 的表达式,可以是任意类型。
replacement_value:当 check_expression 为 NULL 时,返回的替换表达式。
注意:replacement_value 必须和 check_expression 类型相同。
简单说:如果 check_expression 不是 NULL,原样返回;否则返回 replacement_value。
1.2 使用 Null 的三种常见场景
(1) 函数直接返回 Null 给调用方。
Function DivideEx(ByVal A as Double, ByVal B as Double) as Double If B=0 Then '当B=0时返回Null,表示为不合法数据' DivideEx=Null Else DivideEx=A/B End if End Function
(2) 数据库中某字段允许空值,VB 读取到空值时会表示为 Null。
Function GetCity(rst as ADODB.Recordset) as String
If isNull(rst.Field("City")) Then '当City字段为空时返回Province字段,否则返回City字段'
GetCity=rst.Field("Province")
Else
GetCity=rst.Field("City")
End if
End Function
(3) 调用库函数时,如果传入的变量类型和定义类型不一致,有时也会返回 Null。
Null 在计算时有些反直觉:Null - Null = Null,Null + 10 = 10,Null + "" = ""。
2、Missing
Missing 表示传递给 Variant 变量的参数“缺失了”。判断是否 Missing 用 IsMissing 函数。
Missing 只会在 Variant 类型的参数中间出现。如果参数类型是 Byte、Integer、Long、Single、Double 等,缺少时默认是 0;String 缺少时是 "";Object 缺少时是 Nothing。
data value; input var1 var2 @@; if missing(var2) then delete; '如果var2的对象丢失,就删除' datalines; 127 988 195 . 122 .n '这里n(nothing)被删除了' ; run; proc print ;run;
如果用 if var2=. then delete 只会删除缺失的数值,并不会删除缺失的对象。
| Obs | var1 | var2 |
|---|---|---|
| 1 | 127 | 988 |
| 2 | 122 | n |
| 用missing()函数的结果是: | ||
| Obs | var1 | var2 |
| - | - | - |
| 1 | 127 | 988 |
2.1 IsMissing 函数
IsMissing 是 VB 内置函数,返回布尔值,表示一个可选参数是否没有被传递给函数。
语法:IsMissing(ArgName) As Boolean
ArgName:必需的 Variant 类型的可选参数名。
要点:
- 可以用 IsMissing 检测调用过程时是否提供了可选 Variant 参数。如果没有传值,返回 True;否则返回 False。
- 如果 IsMissing 返回 True,后续代码中使用该丢失参数容易引发用户自定义错误。
- 对 ParamArray(可变参数)使用 IsMissing 始终返回 False。
- IsMissing 对简单数据类型(如 Integer 或 Double)无效,因为它们不像 Variant 那样有“丢失”标志位。
示例:
Dim ReturnValue '下面的语句调用用户定义的函数过程'
ReturnValue = ReturnTwice() ' Return是Null'
ReturnValue = ReturnTwice(2) ' Returns是4'
Function ReturnTwice(Optional A) '函数过程定义'
If IsMissing(A) Then '如果缺少参数A,则返回Null'
ReturnTwice = Null
Else '如果存在参数A,则返回值的两倍'
ReturnTwice = A * 2
End If
End Function
3、Empty
VB 有一种特殊的数据类型叫 Variant(可变类型),理论上可以容纳任何类型。如果变量未被初始化,VB 会自动把它当作 Variant,默认值就是 Empty。Empty 既不同于 0,也不同于空字符串 ("") 或 Null。判断 Empty 使用 IsEmpty 函数,例如:
If IsEmpty (Z) Then Z = 0
当 Variant 变量值为 Empty 时,可以在表达式中使用它——根据上下文,它会被当作 0 或零长度字符串来处理。
一旦给 Variant 赋了任何值(包括 0、空字符串或 Null),Empty 就会消失。想把变量恢复成 Empty,只需给它赋关键字 Empty 即可。
3.1 IsEmpty 函数
IsEmpty 返回一个布尔值,表示变量是否已被初始化。
语法:IsEmpty(expression)
expression:必需的 Variant 参数,通常是一个变量名。
说明:如果变量未初始化或显式设置为 Empty,返回 True;否则返回 False。如果 expression 包含多个变量,始终返回 False。
Dim MyVar, MyCheck MyCheck = IsEmpty(MyVar) ' 返回值为True' MyVar = Null ' 给MyVar赋值为空值' MyCheck = IsEmpty(MyVar) ' 初始变化量已发生变化,返回值为False' MyVar = Empty ' 将关键字 Empty 赋予 MyVar 变量' MyCheck = IsEmpty(MyVar) ' 返回值为True'
4、Nothing
Nothing 可以理解为 Object 变量中的“空值”,指向空对象的引用,用来解除对象变量与实际对象的关联。用 Set 语句可以将 Nothing 赋给对象变量:
Set MyObject = Nothing
多个对象变量可以引用同一个实际对象。当给其中一个赋了 Nothing,这个变量就不再有引用。
未初始化的 Object 变量就是 Nothing;没有传参的 Object 也是 Nothing。判断一个对象变量是否为 Nothing 用 Is Nothing 表达式。
Nothing 还有一个重要用途:当所有指向某个对象的 Object 变量都被赋为 Nothing 后,该对象会被销毁,释放内存。
4.1 IsNothing 与 Is Nothing 的区别
IsNothing 语法:IsNothing(Object)
Is Nothing 语法:Object Is Nothing
A. IsNothing 能对任何类型的值赋 Nothing,但可能会引入 Bug。
因为 IsNothing(Object) 会把所有类型(包括值类型)对象都当作可以赋 Nothing,但值类型其实不能是 Nothing,只能是 0。
Dim i As Integer If IsNothing(i) Then '使用IsNothing,代码可以编译和运行 额。。。' ' Do something End If
Dim i As Integer '使用Is Nothing,代码不能运行,编译器会提出错误'
If i Is Nothing Then 'Is不接受类型为Integer的操作,必须是引用类型或可空类型'
' Do something
End If
B. 从可读性来看,Is Nothing 更胜一筹。
- IsNothing 的否定写法:
Not IsNothing(object) - Is Nothing 的否定写法:
Not object Is Nothing
C. 实际上 IsNothing(Object) 是 Microsoft.VisualBasic.dll 的一部分。这点了解就好。
5、vbNullString
vbNullString 是一个 String 类型的常量,代表一个“空字符串”的极端情况——它什么也没有(nothing string),和真正的空字符串 "" 不同。大多数场合下它被当作空字符串处理,但它真正的用途是向库函数传递 null 参数,尤其是调用外部 API 时。
字符串由两部分组成:一个指针 + 一个 Unicode 字符数组。
vbNullString 只有指针部分,没有字符数组部分。
Dim temp As String '这个时候temp还没有赋值,只是定义了类型,还没有占用内存,地址为0' '这时候temp就等于vbNullString' temp="" '把""赋值给temp,尽管是空字符串,但已经占用了内存,地址就变了'
6、零长度字符、空字符、vbNull、vbNullChar、vbNullString 的区别
有点意外的是:vbNullString = "" 这个表达式的结果居然是 True。
零长度字符指 "",空字符指 ASCII 中编码为 0 的字符(Null 字符)。
VBA 内部定义了不少带有 “Nul” 的常量,常用的有三个:vbNull、vbNullChar、vbNullString。
在 VBA 编辑环境按下 F2,搜索这三个常量可以看到:
Const vbNull = 1 Const vbNullChar = “” Const vbNullString = “”
vbNull = 1 很好理解;而 vbNullChar 和 vbNullString 都等于零长度字符 "",这容易让人困惑。继续查 MSDN 官方文档会发现:
vbNullChar = Chr(0),它是一个字符,字符编码为 0,即 ASCII 表第一个字符——Null 字符。vbNullString是一个字符串,和零长度字符串不同,主要用于调用外部 API 时传递 null 参数。
那么 vbNullChar 是否等于零长度字符呢?用代码测试一下:
Sub Test()
Dim str1 As String
str1 = "" '零长度字符的Len返回0'
Debug.Print Len(str1) '输出0'
Debug.Print Len(vbNullChar) '输出1'
Debug.Print str1 = vbNullChar '输出False'
End Sub
显然 vbNullChar 不等于零长度字符。
再结合 BSTR 数据类型的知识——在 VBA 中,字符串变量存储的是字符串第一个字符的内存地址,实际字符串以 BSTR 类型存储。BSTR 由“4字节长度(不含结束符)+ 实际字符串 + 结束符”组成。
测试结果总结如下:
| 字符串变量 | 字符串长度(字节,不含结束符) | 第1个字节 | 第2个字节 | 第3个字节 | 第4个字节 |
|---|---|---|---|---|---|
| str1="" | 0 | Null字符(结束符) | Null字符(结束符) | 未使用 | 未使用 |
| str1=vbNullChar | 2 | Null字符 | Null字符 | Null字符(结束符) | 未使用 |
| str1=Chr(0) | 2 | Null字符 | Null字符 | Null字符(结束符) | 未使用 |
而 vbNullString 一般只在调用外部 API 时使用,如果直接把它赋值给字符串变量,可能导致 Excel 重启。
总结一下:
- 空字符 = vbNullChar = Chr(0)
- vbNull = 1
- 零长度字符既不等于 vbNullChar,也不等于 vbNullString。
Windows 10 是一款微软推出的经典操作系统,拥有硬件兼容性与多任务处理能力。它更偏向把系统状态查看和常用调节动作放在一起,适合需要持续观察和微调设备状态的场景。
极度公式是一款跨平台专业LaTeX公式识别编辑软件,支持OCR公式识别和多平台编辑。和使用说明,避免使用,享受完整功能与稳定支持。做扫描整理、文字提取和表格转换时,它能把识别后的处理步骤接得更顺,资料录入这类场景会省下不少时间。
















