当前位置:

首页 > 编程开发 > VB中判断空的几种方法(Null, Missing, Empty, Nothing, vbNullString)

VB中判断空的几种方法(Null, Missing, Empty, Nothing, vbNullString)

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

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

VB中判断空的几种方法(Null, Missing, Empty, Nothing, vbNullString)

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 = NullNull + 10 = 10Null + "" = ""

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 只会删除缺失的数值,并不会删除缺失的对象。

Obsvar1var2
1127988
2122n
用missing()函数的结果是:
Obsvar1var2
---
1127988

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” 的常量,常用的有三个:vbNullvbNullCharvbNullString

在 VBA 编辑环境按下 F2,搜索这三个常量可以看到:

Const vbNull = 1
Const vbNullChar = “”
Const vbNullString = “”

vbNull = 1 很好理解;而 vbNullCharvbNullString 都等于零长度字符 "",这容易让人困惑。继续查 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=""0Null字符(结束符)Null字符(结束符)未使用未使用
str1=vbNullChar2Null字符Null字符Null字符(结束符)未使用
str1=Chr(0)2Null字符Null字符Null字符(结束符)未使用

vbNullString 一般只在调用外部 API 时使用,如果直接把它赋值给字符串变量,可能导致 Excel 重启。

总结一下:

  • 空字符 = vbNullChar = Chr(0)
  • vbNull = 1
  • 零长度字符既不等于 vbNullChar,也不等于 vbNullString。
本文内容来源于互联网,如有侵权请联系删除。
作者最新文章
编程开发
相关文章 更多
C++动态数组初始化怎么写?常用语句与代码示例
C++动态数组初始化怎么写?常用语句与代码示例

深入解析C++中动态数组的初始化机制,涵盖new操作符的不同用法、基本类型与类对象的初始化差异,以及为何在现代C++开发中应优先使用std::vector。

using namespace 使用中遇到的问题怎么解决
using namespace 使用中遇到的问题怎么解决

命名空间的基本概念与常见引入问题在C++等编程语言中,命名空间(namespace)是一种将代码标识符(如变量、函数、类名)封装在特定名称下的机制,其主要目的是避免命名冲突,尤其是在大型项目或使用多个第三方库时。使用“using namespace”指令可以将指定命名空间中的所有名称引入当前作用域,

c语言函数递归 实操经验总结:这些技巧很实用
c语言函数递归 实操经验总结:这些技巧很实用

理解递归的基本原理在C语言中,递归是一种函数调用自身的编程技术。要掌握它,首先需要理解其核心思想:将一个复杂的大问题,分解为一个或几个与原问题相似但规模更小的子问题,直到子问题足够简单,可以直接求解。这个过程通常包含两个关键部分:递归出口和递归体。递归出口定义了问题何时不再继续分解,即最简单、可直接

c语言函数递归 怎么选?常见方案对比分析
c语言函数递归 怎么选?常见方案对比分析

递归函数的基本概念与适用场景在C语言编程中,递归是一种函数调用自身的编程技巧。它并非适用于所有问题,但在处理某些具有自相似结构的问题时,能提供极其清晰和优雅的解决方案。递归的核心思想是将一个大规模问题分解为一个或多个同类型但规模更小的子问题,直到子问题简单到可以直接求解。典型的适用场景包括树形结构的

Objective-C 内存管理入门:从 alloc 到 dealloc 的生命周期详解
Objective-C 内存管理入门:从 alloc 到 dealloc 的生命周期详解

理解内存管理的基石在Objective-C的编程世界中,内存管理是开发者必须掌握的核心技能之一。它直接关系到应用的性能、稳定性与资源利用效率。与一些采用自动垃圾回收机制的语言不同,Objective-C在很长一段时间里,依赖一套基于引用计数的、需要开发者部分介入的管理规则。这套规则的核心思想是明确的

如何正确使用 dealloc 以避免 iOS 应用中的内存泄漏
如何正确使用 dealloc 以避免 iOS 应用中的内存泄漏

理解 dealloc 的角色与时机在 iOS 应用开发中,内存管理是保障应用性能与稳定性的基石。dealloc 方法是 Objective-C 中对象生命周期结束时的关键回调,它标志着对象即将被系统回收内存。正确理解其触发时机至关重要:当一个对象的引用计数降为零时,运行时系统会自动调用该对象的 de

深入理解 Objective-C 中的 dealloc 方法:内存管理核心机制
深入理解 Objective-C 中的 dealloc 方法:内存管理核心机制

内存管理的基石在Objective-C的世界里,内存管理是开发者必须掌握的核心技能之一。作为一门在手动引用计数(MRC)时代诞生的语言,Objective-C要求程序员对对象的生命周期有清晰的认识。dealloc方法正是这一生命周期中至关重要的终点站。它是一个实例方法,当对象的引用计数降为零时,系统

理解 native2ascii:Java 国际化开发中的字符编码工具
理解 native2ascii:Java 国际化开发中的字符编码工具

native2ascii 工具的基本定位在Ja va应用程序的国际化与本地化开发过程中,处理非拉丁字符集是一个常见且关键的环节。Ja va内部使用Unicode字符集来统一表示全球各种语言的文字,但其属性文件(.properties)在历史上要求使用ASCII编码,或者更准确地说,要求非ASCII字

如何使用 native2ascii 转换中文字符为 Unicode 转义序列
如何使用 native2ascii 转换中文字符为 Unicode 转义序列

理解 native2ascii 工具的基本用途在软件开发,特别是涉及国际化处理的场景中,开发者常常需要处理不同编码的文本资源。native2ascii 是 Ja va 开发工具包(JDK)中提供的一个命令行实用程序,其主要功能是将包含本地字符编码(非ASCII字符)的文件,转换为包含 Unicode

Java native2ascii 命令详解:解决属性文件乱码问题
Java native2ascii 命令详解:解决属性文件乱码问题

native2ascii 命令的由来与作用在Ja va开发中,处理国际化资源文件是一个常见需求。资源文件通常以.properties格式存储,用于支持多语言界面。然而,Ja va属性文件默认采用ISO-8859-1字符集编码,这导致了一个直接的问题:当文件中包含非拉丁字符(如中文、日文、韩文等)时,

查看更多
精品专题 更多
装机必备
装机必备

正软商城装机必备专区,精选办公、浏览器、安全防护、影音播放、压缩解压、设计创作和系统工具等电脑常用正版软件,帮助用户快速完成新电脑软件配置。

Windows
Windows

正软商城Windows软件专区,汇集适用于Windows电脑的办公、设计、安全防护、影音播放、开发工具和系统优化软件,提供软件介绍、系统要求、正版授权及购买下载服务。

macOS软件
macOS软件

正软商城macOS软件专区,精选适用于Mac电脑的办公、设计、影音、效率、开发和系统工具,提供软件功能介绍、macOS兼容版本、正版授权及购买下载服务。

Mac软件 更多
灵活计算器
灵活计算器
macOS/iOS/Android

灵活计算器是一款笔记式算数应用,支持实时计算、动态关联和云端同步功能。记录、整理和输出之间的过渡会更自然,适合长期写作、做笔记或持续沉淀个人内容。

赤友清理大师
赤友清理大师
macOS

赤友清理大师是一款为 Mac 设计的智能清理优化工具,可精准扫描垃圾、大文件、重复文件等,释放磁盘空间。做扫描整理、文字提取和表格转换时,它能把识别后的处理步骤接得更顺,资料录入这类场景会省下不少时间。

极度公式
极度公式
Windows/macOS/Linux

极度公式是一款跨平台专业LaTeX公式识别编辑软件,支持OCR公式识别和多平台编辑。和使用说明,避免使用,享受完整功能与稳定支持。做扫描整理、文字提取和表格转换时,它能把识别后的处理步骤接得更顺,资料录入这类场景会省下不少时间。

WINDOWS 更多
Windows 10
Windows 10
Windows

Windows 10 是一款微软推出的经典操作系统,拥有硬件兼容性与多任务处理能力。它更偏向把系统状态查看和常用调节动作放在一起,适合需要持续观察和微调设备状态的场景。

极度公式
极度公式
Windows/macOS/Linux

极度公式是一款跨平台专业LaTeX公式识别编辑软件,支持OCR公式识别和多平台编辑。和使用说明,避免使用,享受完整功能与稳定支持。做扫描整理、文字提取和表格转换时,它能把识别后的处理步骤接得更顺,资料录入这类场景会省下不少时间。

密码键盘
密码键盘
Windows/macOS/iOS/Android

密码键盘是一款兼具安全性与便捷性的高效密码管理器。日常使用里的持续防护和信息管理会更突出,适合把安全控制放进长期使用流程中的场景。