VB中判断空的几种方法(Null, Missing, Empty, Nothing, vbNullString)
<div id="navCategory"><h5 class="catalogue">目录</h5><ul class="first_class_ul"><li>1、Null</li><ul class="second_class_ul"><li>1.1 ISNull函数</li><li>1.2 使用Null的三种情况</li></ul><li>2、Missing</li><ul class="second_class_ul"><li>2.1 IsMissing函数</li></ul><li>3、Empty</li><ul class="second_class_ul"><li>3.1 ISEmpty函数</li></ul><li>4、Nothing</li><ul class="second_class_ul"><li>4.1 IsNothing 与 Is Nothing的区别</li></ul><li>5、vbNullString</li><ul class="second_class_ul"></ul><li>6、 零长度字符、空字符、vbNull、vbNullChar、vbNullString的区别</li><ul class="second_class_ul"></ul></ul></div><p>vb6中存在几个虚幻的值:Null、Missing、Empty、Nothing、vbNullString。除了最后一个之外,每一个值都不能直接用“a=值”来判断。下面分别解释一下这几个值的含义。</p><p class="maodian"></p><h2>1、Null</h2>
<p>Null(空值)指一个不合法的数据,判断一个变量是否为Null使用SQL中的isNull函数。</p>
<p class="maodian"></p><h3>1.1 ISNull函数</h3>
<p><strong>ISNULL函数</strong>:使用指定的替换值替换 NULL。</p>
<p><strong>语法:ISNULL ( check_expression , replacement_value )</strong></p>
<div class="jb51code"><pre class="brush:vb;">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
</pre></div>
<p><strong>check_expression</strong>:将被检查是否为 NULL的表达式。check_expression 可以是任何类型的。</p>
<p><strong>replacement_value</strong>:代替值,在 check_expression 为 NULL时将返回的表达式。</p>
<p><strong>注释:</strong></p>
<p>replacement_value 必须与 check_expresssion 具有相同的类型。</p>
<p>如果 check_expression 不为 NULL,那么返回该表达式的值;否则返回 replacement_value。</p>
<p class="maodian"></p><h3>1.2 使用Null的三种情况</h3>
<p><strong>(1)最简单的,函数直接返回Null给调用方。譬如</strong></p>
<div class="jb51code"><pre class="brush:vb;">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
</pre></div>
<p><strong>(2)数据库中,当一个字段设为“允许空值”时,VB读取到空值就会用Null表示,例如</strong></p>
<div class="jb51code"><pre class="brush:vb;">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
</pre></div>
<p><strong>(3)在调用库函数时,如果遇到传送变量类型与定义类型不一样时有时会出现Null值。</strong></p>
<p>Null值在计算时有点奇怪,譬如<code>Null-Null=Null,Null+10=10,Null+""=""</code>等</p>
<p class="maodian"></p><h2>2、Missing</h2>
<p>Missing指传递进入Variant变量的缺少,判断Missing使用isMissing函数。<br />Missing只会在Varient中出现,如果给入的数据类型是Byte,Integer,Long,Single,Double等缺少时为0;String缺少时为"";Object缺少时为Nothing。**</p>
<div class="jb51code"><pre class="brush:vb;">data value;
input var1 var2 @@;
if missing(var2) then delete; '如果var2的的对象丢失,就删除'
datalines;
127 988 195 .
122 .n '就这里吧n(nothing)删除了'
;
run;
proc print ;run;
</pre></div>
<p>if var2=. then delete这样的结果只会删除缺失的值,不能删除缺少的对象。</p>
<table><tbody><tr><th>Obs</th><th>var1</th><th>var2</th></tr><tr><td>1</td><td>127</td><td>988</td></tr><tr><td>2</td><td>122</td><td>n</td></tr><tr><td>用missing()函数的结果是:</td><td></td><td></td></tr><tr><td>Obs</td><td>var1</td><td>var2</td></tr><tr><td>-</td><td>-</td><td>-</td></tr><tr><td>1</td><td>127</td><td>988</td></tr></tbody></table>
<p class="maodian"></p><h3>2.1 IsMissing函数</h3>
<p><strong>IsMissing</strong>是一个VB函数,它返回一个布尔值,表示一个可选参数是否未被传递给一个函数。</p>
<p><strong>语法:IsMissing (ArgName) As Boolean</strong></p>
<p>ArgName参数:必需,一个Variant类型的可选参数名。</p>
<p><strong>备注</strong>:</p>
<ul><li>使用 IsMissing 函数可检测调用过程时是否提供了可选 Variant 参数。 如果未为指定参数传递任何值,则 IsMissing 将返回 True;否则将返回 False。</li><li>如果 IsMissing 针对某参数返回 True,则在其他代码中使用缺少参数可能导致用户定义的错误。</li><li>如果对 ParamArray (可变参数)参数使用 IsMissing,则将始终返回 False。</li><li>IsMissing 对简单数据类型(如 Integer 或 Double)无效,因为与 Variants 不同,它们没有针对“丢失”标志位的设置。</li></ul>
<p><strong>示例</strong>:</p>
<p>下例使用 IsMissing 函数检查是否已将可选参数传递到用户定义的过程。 请注意, Optional 参数现在可具有默认值和 Variant 之外的类型。</p>
<div class="jb51code"><pre class="brush:vb;">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
</pre></div>
<p class="maodian"></p><h2>3、Empty</h2>
<p>VB特有的一种数据类型叫Variant 可变类型,理论上可以接受任何其他数据类型,如果变量未定义,VB自动将其作为可变类型对待。它的默认值就是 Empty,值 Empty 是异于0、零长度字符串 (“”) 或 Null 值的特定值。判断Empty使用isEmpty函数,例如:</p>
<div class="jb51code"><pre class="brush:vb;">If IsEmpty (Z) Then Z = 0
</pre></div>
<p>当 Variant 变量包含 Empty 值时,可在表达式中使用它;将其作为 0 或零长度字符串来处理,这要根据表达式来定。</p>
<p>只要将任何值(包括 0、零长度字符串或 Null)赋予 Variant 变量,Empty 值就会消失。而将关键字 Empty 赋予 Variant 变量,就可将 Variant 变量恢复为 Empty。</p>
<p class="maodian"></p><h3>3.1 ISEmpty函数</h3>
<p><strong>IsEmpty</strong>返回一个指示是否已初始化变量的布尔值。</p>
<p><strong>语法:IsEmpty(expression)</strong></p>
<p>expression:必需的,参数是一个包含数值或字符串表达式的Variant 。 但是, 由于IsEmpty用于确定是否初始化了各个变量, 因此_表达式_参数通常是单个变量名称。</p>
<p><strong>备注</strong></p>
<p>IsEmpty 在变量未初始化或显式设置为 Empty 时返回 True;否则,返回 False。 如果 expression 包含多个变量,则始终返回 False。 IsEmpty 仅返回变量的有用信息。此示例使用 IsEmpty 函数确定是否已初始化变量。</p>
<div class="jb51code"><pre class="brush:vb;">Dim MyVar, MyCheck
MyCheck = IsEmpty(MyVar) ' 返回值为True'
MyVar = Null ' 给MyVar赋值为空值'
MyCheck = IsEmpty(MyVar) ' 初始变化量已发生变化,返回值为False'
MyVar = Empty ' 将关键字 Empty 赋予 MyVar 变量'
MyCheck = IsEmpty(MyVar) ' 返回值为True'
</pre></div>
<p class="maodian"></p><h2>4、Nothing</h2>
<p><strong>Nothing</strong>相当于Object变量中的空值,指向于空对象的引用,用于取消对象变量与实际对象的关联。 使用<strong>Set</strong> 语句可将Nothing分配给对象变量。 例如:</p>
<div class="jb51code"><pre class="brush:vb;">Set MyObject = Nothing
</pre></div>
<p>多个对象变量可引用相同的实际对象。 在将 Nothing 分配给一个对象变量后,该变量将不再引用实际对象。</p>
<p>未初始化的Object变量为Nothing;未传入函数的Object为Nothing。判断一个变量是否为Nothing使用 is Nothing表达式。</p>
<p>同时,Nothing还有另外一个用途,就是把所有指向某一个对象的Object变量赋值为Nothing可以<strong>销毁此对象节省内存空间</strong>。</p>
<p class="maodian"></p><h3>4.1 IsNothing 与 Is Nothing的区别</h3>
<p><strong>IsNothing</strong>语法:IsNothing(Object)<br /><strong>Is Nothing</strong>语法:Object Is Nothing</p>
<p><strong>A.</strong> IsNothing能给任何类型值的对象赋值nothing,但这可能出现Bug</p>
<p>IsNothing(Object)表示所有类型(括值类型)的对象都赋值为nothing,但是值类型不能为nothing,只能是0</p>
<div class="jb51code"><pre class="brush:vb;">Dim i As Integer
If IsNothing(i) Then '使用IsNothing,代码可以编译和运行 额。。。'
' Do something
End If
</pre></div>
<div class="jb51code"><pre class="brush:vb;">Dim i As Integer '使用Is Nothing,代码不能运行,编译器会提出错误'
If i Is Nothing Then 'Is不接受类型为Integer的操作,必须是引用类型或可空类型'
'Do something
End If
</pre></div>
<p><strong>B.</strong> 可读性来说Is Nothing更胜一筹</p>
<ul><li><strong>IsNothing</strong>的否定语句是:Not IsNothing(object)</li><li><strong>Is Nothing</strong>的否定语句是:Not object Is Nothing</li></ul>
<p><strong>C.</strong> IsNothing(Object)实际上就是是Microsoft.VisualBasic.dll的一部分。(这句话代表什么意思呢)</p>
<p class="maodian"></p><h2>5、vbNullString</h2>
<p>vbNullString是一个String类型的常量,表示一个empty字符串。它与空白字符串"“不同,表示什么也没有的字符串(nothing string)。</p>
<p>对于许多场合,它被当作一个empty字符串”"处理,真正使用它的目的是传递null参数给库函数,主要是用于调用外部的动态链接库程序时使用(也就是API函数)。</p>
<blockquote><p>字符串是由两部分组成:一个指针和一个Unicode字符数组<br />vbNullString就是一个只有第一部分而没有第二部分的字符串</p></blockquote>
<div class="jb51code"><pre class="brush:vb;">Dim temp As String
'这个时候temp还没有附值,只是定义了类型,就是说还没有真正占用内存,地址就是0'
'这时候temp就等于vbNullString'
temp=""
'把""赋值给temp,尽管等于空字符串,但是已经占用了内存,地址就发生了变化'
</pre></div>
<p class="maodian"></p><h2>6、 零长度字符、空字符、vbNull、vbNullChar、vbNullString的区别</h2>
<p>不过很奇怪的是<code>vbNullString=""</code>这个表达式为True.</p>
<p>零长度字符是指””,<br />空字符是指ASCII 中字符编码为0的字符,即Null字符。</p>
<p>在vba内部还定义了很多常量,其中有三个是含有Nul的的常量,它们分别是vbNull、vbNullChar、vbNullString。</p>
<p>通过在VBA编辑环境中按下F2快捷键分别搜索查询以上三个常量可以得知:</p>
<div class="jb51code"><pre class="brush:vb;">Const vbNull = 1
Const vbNullChar = “”
Const vbNullString = “”</pre></div>
<p>其中vbNull=1可以很好的理解,而vbNullChar 和vbNullString 常量定义都等于零长度字符,让人有点摸不着头脑。继续查找MSDN中的官方文档,可以得知:</p>
<p>vbNullChar=chr(0),指的是一个字符,这个字符的字符编码为0,即等于ASCII表中的第一个字符,Null字符。<br />vbNullString 指的是一个字符串,它不同于零长度字符串,主要是用于调用外部的动态链接库程序时使用(也就是API函数)。</p>
<p>那vbNullChar是否等于零长度字符呢?也即vbNullChar是否按照常量的定义等于””?可以使用如下代码测试:</p>
<div class="jb51code"><pre class="brush:vb;">Sub QQ1722187970()
Dim str1 As String
str1 = "" '零长度字符的Len返回0'
Debug.Print Len(str1) 'Len(vbNullChar)返回1'
Debug.Print Len(vbNullChar) '返回False'
Debug.Print str1 = vbNullChar
End Sub
</pre></div>
<p>也就是vbNullChar不等于零长度字符。</p>
<p>再根据什么是BSTR数据类型一文,我们知道在vba中字符串变量存储的是字符串的第一个字符的内存地址,而实际的字符串是以BSTR类型存储的,BSRT类型是个复合数据类型,它由4个字节(字符串的字节长度,不含字符串结束符)+实际字符串+字符串结束符组成。</p>
<p>根据代码测试可以得知:</p>
<p>字符串变量|字符串长度不包含字符串结束符,以字节为单位)|第1个字节|第2个字节|第3个字节|第4个字节<br />-|-|-|-|-|-|-|-<br />str1=””|0|Null字符(字符串结束符)|Null字符(字符串结束符)|未使用|未使用<br />str1=vbNullChar|2|Null字符|Null字符|Null字符(字符串结束符)|未使用<br />str1=Chr(0)|2|Null字符|Null字符|Null字符(字符串结束符)|未使用</p>
<p>而vbNullString则一般用在调用外部api函数时使用,如果直接赋值给字符串变量则会导致excel重启。</p>
<p>根据以上的知识,现总结如下:</p>
<p>空字符=vbNullChar=chr(0)</p>
<p>vbnull=1</p>
<p>零长度字符即不等于vbNullChar也不等于vbNullString。</p>
<p>到此这篇关于VB中判断空的几种方法(Null, Missing, Empty, Nothing, vbNullString)的文章就介绍到这了,更多相关VB 判断空内容请搜索琼殿技术社区以前的文章或继续浏览下面的相关文章希望大家以后多多支持琼殿技术社区!</p>
<div class="art_xg">
<b>您可能感兴趣的文章:</b><ul><li>vbs判断磁盘类型和检测硬盘剩余空间的实现代码</li><li>vbs中Empty和Null的区别</li></ul>
</div>
</div>
<!--endmain-->
頁:
[1]