VB中判断空的⼏种⽅法,Null,Missing,Empty,Nothing,vbNull。。。
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类型的,不允许添到同⼀列上'
lect stuName,stuNumber,ISNULL(stuAdress,'未知') from TbStudent
check_expression:将被检查是否为 NULL的表达式。check_expression 可以是任何类型的。
replacement_value:代替值,在 check_expression 为 NULL时将返回的表达式。
注释:
replacement_value 必须与 check_expresssion 具有相同的类型。
如果 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
传播种子的方法
El
DivideEx=A/B
End if
End Function
(2)数据库中,当⼀个字段设为“允许空值”时,VB读取到空值就会⽤Null表⽰,例如
Function GetCity(rst as ADODB.Recordt) as String
If isNull(rst.Field("City")) Then '当City字段为空时返回Province字段,否则返回City字段'
GetCity=rst.Field("Province")
El
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只会在Varient中出现,如果给⼊的数据类型是Byte,Integer,Long,Single,Double等缺少时为0;String缺少时为"";Object缺少时为Nothing。**
data value;
input var1 var2 @@;
if missing(var2) then delete;'如果var2的的对象丢失,就删除'
datalines;
127988195.
122.n '就这⾥吧n(nothing)删除了'
;
run;
proc print ;run;
if var2=. then delete这样的结果只会删除缺失的值,不能删除缺少的对象。
Obs var1var2
1127988
2122n
⽤missing()函数的结果是:
天地坛Obs var1var2
射手和狮子配对1127988
2.1 IsMissing函数
IsMissing是⼀个VB函数,它返回⼀个布尔值,表⽰⼀个可选参数是否未被传递给⼀个函数。
语法:IsMissing (ArgName) As Boolean
ArgName参数:必需,⼀个Variant类型的可选参数名。
备注:
使⽤ IsMissing 函数可检测调⽤过程时是否提供了可选 Variant 参数。 如果未为指定参数传递任何值,则 IsMissing 将返回 True;否则将返回 Fal。
如果 IsMissing 针对某参数返回 True,则在其他代码中使⽤缺少参数可能导致⽤户定义的错误。
如果对 ParamArray (可变参数)参数使⽤ IsMissing,则将始终返回 Fal。
IsMissing 对简单数据类型(如 Integer 或 Double)⽆效,因为与 Variants 不同,它们没有针对“丢失”标志位的设置。
⽰例:
下例使⽤ IsMissing 函数检查是否已将可选参数传递到⽤户定义的过程。 请注意, Optional 参数现在可具有默认值和 Variant 之外的类型。
Dim ReturnValue '下⾯的语句调⽤⽤户定义的函数过程'
ReturnValue =ReturnTwice()' Return是Null'
ReturnValue =ReturnTwice(2)' Returns是4'
Function ReturnTwice(Optional A)'函数过程定义'
If IsMissing(A) Then '如果缺少参数A,则返回Null'
ReturnTwice = Null
El '如果存在参数A,则返回值的两倍'
ReturnTwice = A *2
End If
End Function
3、Empty
VB特有的⼀种数据类型叫Variant 可变类型,理论上可以接受任何其他数据类型,如果变量未定义,VB⾃动将其作为可变类型对待。它的默认值就是 Empty,值 Empty 是异于0、零长度字符串 ("") 或 Null 值的特定值。判断Empty使⽤isEmpty函数,例如:
If IsEmpty (Z) Then Z =0
当 Variant 变量包含 Empty 值时,可在表达式中使⽤它;将其作为 0 或零长度字符串来处理,这要根据表达式来定。
只要将任何值(包括 0、零长度字符串或 Null)赋予 Variant 变量,Empty 值就会消失。⽽将关键字 Empty 赋予 Variant 变量,就可将 Variant 变量恢复为 Empty。
3.1 ISEmpty函数
IsEmpty返回⼀个指⽰是否已初始化变量的布尔值。学术自由
语法:IsEmpty(expression)
expression:必需的,参数是⼀个包含数值或字符串表达式的Variant 。但是, 由于IsEmpty⽤于确定是否初始化了各个变量, 因此_表达式_参数通常是单个变量名称。雨中的浪漫
备注
IsEmpty 在变量未初始化或显式设置为 Empty 时返回 True;否则,返回 Fal。如果 expression 包含多个变量,则始终返回 Fal。IsEmpty 仅返回变量的有⽤信息。此⽰例使⽤ IsEmpty 函数确定是否已初始化变量。
Dim MyVar, MyCheck
MyCheck =IsEmpty(MyVar)' 返回值为True'
MyVar = Null ' 给MyVar赋值为空值'
MyCheck =IsEmpty(MyVar)' 初始变化量已发⽣变化,返回值为Fal'
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类型的常量,表⽰⼀个empty字符串。它与空⽩字符串"“不同,表⽰什么也没有的字符串(nothing string)。 对于许多场合,它被当作⼀个empty字符串”"处理,真正使⽤它的⽬的是传递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函数)。
那vbNullChar是否等于零长度字符呢?也即vbNullChar是否按照常量的定义等于””?可以使⽤如下代码测试:
Sub QQ1722187970()
Dim str1 As String
str1 =""'零长度字符的Len返回0'
Debug.Print Len(str1)'Len(vbNullChar)返回1'
Debug.Print Len(vbNullChar)'返回Fal'
Debug.Print str1 = vbNullChar
End Sub
也就是vbNullChar不等于零长度字符。
再根据什么是BSTR数据类型⼀⽂,我们知道在vba中字符串变量存储的是字符串的第⼀个字符的内存地址,⽽实际的字符串是以BSTR 类型存储的,BSRT类型是个复合数据类型,它由4个字节(字符串的字节长度,不含字符串结束符)+实际字符串+字符串结束符组成。
根据代码测试可以得知: