当前位置:

首页 > 编程开发 > 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 = 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 只会删除缺失的数值,并不会删除缺失的对象。

    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” 的常量,常用的有三个: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=""0Null字符(结束符)Null字符(结束符)未使用未使用
    str1=vbNullChar2Null字符Null字符Null字符(结束符)未使用
    str1=Chr(0)2Null字符Null字符Null字符(结束符)未使用

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

    总结一下:

    • 空字符 = vbNullChar = Chr(0)
    • vbNull = 1
    • 零长度字符既不等于 vbNullChar,也不等于 vbNullString。
    本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系bd@zhengruan.com
    作者最新文章
    编程开发
    相关文章 更多
    Windows 10 x64 安装 Visual Basic 6.0 SP6注意事项
    Windows 10 x64 安装 Visual Basic 6.0 SP6注意事项

    在Windows 10 x64上安装Visual Basic 6.0 SP6,绝对是个让人头疼的活儿。折腾了两天才搞定,把遇到的坑和解决方法整理出来,希望能帮到正在挣扎的朋友。 先说几个前置条件:Windows 7 x64和Windows 8 x64理论上都能装,不过下面这些经验主要基于Win10

    VB中使用WMI获取系统硬件和软件有关信息
    VB中使用WMI获取系统硬件和软件有关信息

    WMI是Windows管理接口,支持本地及远程获取软硬件信息。VB中需引用MicrosoftWMIScriptingV1.1库,通过Win32_类如SoundDevice、VideoController等查询声卡、显卡、内存及操作系统详情。该技术广泛用于系统监控与配置。

    在VB中遍历文件并用正则表达式完成复制及vb实现重命名、拷贝文件夹的方法
    在VB中遍历文件并用正则表达式完成复制及vb实现重命名、拷贝文件夹的方法

    在VB开发中,利用FSO对象和正则表达式可实现文件按规则复制,如将文件名含“1项目”或“一项目”的文件复制到目标目录;同时也可实现文件夹重命名与拷贝,代码结构清晰,可直接套用或微调。

    VB FileSystemObject对象实例详解
    VB FileSystemObject对象实例详解

    FileSystemObject是ASP开发中操作服务器文件系统的核心对象,提供Drives属性及二十多种方法,可创建、读取、修改、删除文件和文件夹,并支持驱动器、路径处理及文件对象属性与方法的调用,功能全面且易于使用。

    VB关机恶搞小程序
    VB关机恶搞小程序

    基于VB的恶搞关机小程序利用系统命令或API触发强制关机,并通过注册表或启动文件夹实现自启动。交互版添加对话框要求输入“我是猪”取消关机,同时拦截关闭事件进行自我保护。核心涉及关机触发与自启动机制。

    VB实现的《QQ美女找茬游戏》实例
    VB实现的《QQ美女找茬游戏》实例

    一个基于VB的自动找茬程序,通过API截取屏幕两幅图片,逐像素对比其RGB分量,差值超过30时标记为差异点,并在窗体上绘制结果。程序将窗口设为总在最前,点击触发分析,实现快速自动找茬。

    VB实现按行读取文本文件的方法
    VB实现按行读取文本文件的方法

    VB中使用LineInput语句与FreeFile函数逐行读取文本文件,避免一次性加载大文件造成内存溢出。每行读取后可进行拼接、解析等处理,操作完毕必须关闭文件以释放系统资源。

    VB键盘鼠标无动作调用程序的尝试
    VB键盘鼠标无动作调用程序的尝试

    实现键盘鼠标无动作时调用程序,曾尝试HOOK钩子与Windows屏保检测均失败。最终用GetLastInputInfo函数获取系统空闲时间,成功触发操作,例如空闲15分钟弹出关机提示。

    VB实现禁用任务管理器的方法
    VB实现禁用任务管理器的方法

    在WindowsXP系统中,通过二进制流占用任务管理器可执行文件即可禁用任务管理器,使其无法被用户启动;而在Vista及Windows7系统中,则需要改用任务终止命令强制结束进程,并将该命令置于定时器事件中循环执行,从而持续阻止任务管理器重新启动,最终实现对任务管理器的长期禁用。这一方法通过占用文件。

    VB简单实现防止文件被改写
    VB简单实现防止文件被改写

    在VB程序中,防止配置文件被改写的有效方法是在程序运行期间先打开文件并保持占用状态,使系统提示文件被占用而无法手动修改。同时,程序启动时检查文件是否存在,若不存在则自动创建并写入默认值。

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

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

    Windows
    Windows

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

    PDF教程
    PDF教程

    正软商城PDF教程频道提供PDF编辑、转换、合并、拆分、压缩及格式处理方法,同时介绍常用PDF软件和工具的使用技巧。

    Mac软件 更多
    讯飞智作 网页版
    讯飞智作 网页版
    Windows/ macOS/ Linux

    讯飞智作是一款基于语音合成技术、虚拟人驱动技术与数字人形象声音构建能力的 AI 数字人音视频创作平台。

    火山引擎 网页版
    火山引擎 网页版
    Windows/ macOS/ Linux

    火山引擎是字节跳动旗下企业级云与AI服务平台。聚焦大模型核心能力,依托字节自研豆包多模态大模型,凭借火山方舟一站式平台,提供模型精调、推理部署、智能应用搭建等全链路服务,结合高性能AI算力,助力各行业快速落地大模型数字化与智能化应用。

    Aperty macOS版
    Aperty macOS版
    macOS

    Aperty 是 Skylum 推出的 AI 人像修图软件,支持自然肤质修饰、瑕疵处理、面部与身体调整、预设及批量同步。

    WINDOWS 更多
    讯飞智作 网页版
    讯飞智作 网页版
    Windows/ macOS/ Linux

    讯飞智作是一款基于语音合成技术、虚拟人驱动技术与数字人形象声音构建能力的 AI 数字人音视频创作平台。

    火山引擎 网页版
    火山引擎 网页版
    Windows/ macOS/ Linux

    火山引擎是字节跳动旗下企业级云与AI服务平台。聚焦大模型核心能力,依托字节自研豆包多模态大模型,凭借火山方舟一站式平台,提供模型精调、推理部署、智能应用搭建等全链路服务,结合高性能AI算力,助力各行业快速落地大模型数字化与智能化应用。

    PixTV 网页版
    PixTV 网页版
    Windows

    PixTV 是一款在浏览器中使用的 AI 视觉内容创作平台,提供图片、视频、音频、文字生成、AI 分镜、局部重绘、提示词反推和无限画布等工具,适合短剧、漫剧、广告及社交媒体内容制作。