VB中判斷空的幾種方法(Null, Missing, Empty, Nothing, vbNullString)
vb6中存在幾個(gè)虛幻的值:Null、Missing、Empty、Nothing、vbNullString。除了最后一個(gè)之外,每一個(gè)值都不能直接用“a=值”來(lái)判斷。下面分別解釋一下這幾個(gè)值的含義。
1、Null
Null(空值)指一個(gè)不合法的數(shù)據(jù),判斷一個(gè)變量是否為Null使用SQL中的isNull函數(shù)。
1.1 ISNull函數(shù)
ISNULL函數(shù):使用指定的替換值替換 NULL。
語(yǔ)法:ISNULL ( check_expression , replacement_value )
isnull(a,0) '如果a字段有空值返回0 沒(méi)有空值就返回a的本身 isnull(a,1)=2 '字段a有空值返回1,判斷isnull(a,1)是否等于2 '從TbStudent里查找stuAdress為空值的學(xué)生姓名和學(xué)號(hào),并把空值替換成未知' 'stuAdress是int類型的,未知是varchar類型的,不允許添到同一列上' select stuName,stuNumber,ISNULL(stuAdress,'未知') from TbStudent
check_expression:將被檢查是否為 NULL的表達(dá)式。check_expression 可以是任何類型的。
replacement_value:代替值,在 check_expression 為 NULL時(shí)將返回的表達(dá)式。
注釋:
replacement_value 必須與 check_expresssion 具有相同的類型。
如果 check_expression 不為 NULL,那么返回該表達(dá)式的值;否則返回 replacement_value。
1.2 使用Null的三種情況
(1)最簡(jiǎn)單的,函數(shù)直接返回Null給調(diào)用方。譬如
Function DivideEx(ByVal A as Double, ByVal B as Double) as Double If B=0 Then '當(dāng)B=0時(shí)返回Null,表示為不合法數(shù)據(jù)' DivideEx=Null Else DivideEx=A/B End if End Function
(2)數(shù)據(jù)庫(kù)中,當(dāng)一個(gè)字段設(shè)為“允許空值”時(shí),VB讀取到空值就會(huì)用Null表示,例如
Function GetCity(rst as ADODB.Recordset) as String
If isNull(rst.Field("City")) Then '當(dāng)City字段為空時(shí)返回Province字段,否則返回City字段'
GetCity=rst.Field("Province")
Else
GetCity=rst.Field("City")
End if
End Function
(3)在調(diào)用庫(kù)函數(shù)時(shí),如果遇到傳送變量類型與定義類型不一樣時(shí)有時(shí)會(huì)出現(xiàn)Null值。
Null值在計(jì)算時(shí)有點(diǎn)奇怪,譬如Null-Null=Null,Null+10=10,Null+""=""等
2、Missing
Missing指?jìng)鬟f進(jìn)入Variant變量的缺少,判斷Missing使用isMissing函數(shù)。
Missing只會(huì)在Varient中出現(xiàn),如果給入的數(shù)據(jù)類型是Byte,Integer,Long,Single,Double等缺少時(shí)為0;String缺少時(shí)為"";Object缺少時(shí)為Nothing。**
data value; input var1 var2 @@; if missing(var2) then delete; '如果var2的的對(duì)象丟失,就刪除' datalines; 127 988 195 . 122 .n '就這里吧n(nothing)刪除了' ; run; proc print ;run;
if var2=. then delete這樣的結(jié)果只會(huì)刪除缺失的值,不能刪除缺少的對(duì)象。
| Obs | var1 | var2 |
|---|---|---|
| 1 | 127 | 988 |
| 2 | 122 | n |
| 用missing()函數(shù)的結(jié)果是: | ||
| Obs | var1 | var2 |
| - | - | - |
| 1 | 127 | 988 |
2.1 IsMissing函數(shù)
IsMissing是一個(gè)VB函數(shù),它返回一個(gè)布爾值,表示一個(gè)可選參數(shù)是否未被傳遞給一個(gè)函數(shù)。
語(yǔ)法:IsMissing (ArgName) As Boolean
ArgName參數(shù):必需,一個(gè)Variant類型的可選參數(shù)名。
備注:
- 使用 IsMissing 函數(shù)可檢測(cè)調(diào)用過(guò)程時(shí)是否提供了可選 Variant 參數(shù)。 如果未為指定參數(shù)傳遞任何值,則 IsMissing 將返回 True;否則將返回 False。
- 如果 IsMissing 針對(duì)某參數(shù)返回 True,則在其他代碼中使用缺少參數(shù)可能導(dǎo)致用戶定義的錯(cuò)誤。
- 如果對(duì) ParamArray (可變參數(shù))參數(shù)使用 IsMissing,則將始終返回 False。
- IsMissing 對(duì)簡(jiǎn)單數(shù)據(jù)類型(如 Integer 或 Double)無(wú)效,因?yàn)榕c Variants 不同,它們沒(méi)有針對(duì)“丟失”標(biāo)志位的設(shè)置。
示例:
下例使用 IsMissing 函數(shù)檢查是否已將可選參數(shù)傳遞到用戶定義的過(guò)程。 請(qǐng)注意, Optional 參數(shù)現(xiàn)在可具有默認(rèn)值和 Variant 之外的類型。
Dim ReturnValue '下面的語(yǔ)句調(diào)用用戶定義的函數(shù)過(guò)程'
ReturnValue = ReturnTwice() ' Return是Null'
ReturnValue = ReturnTwice(2) ' Returns是4'
Function ReturnTwice(Optional A) '函數(shù)過(guò)程定義'
If IsMissing(A) Then '如果缺少參數(shù)A,則返回Null'
ReturnTwice = Null
Else '如果存在參數(shù)A,則返回值的兩倍'
ReturnTwice = A * 2
End If
End Function
3、Empty
VB特有的一種數(shù)據(jù)類型叫Variant 可變類型,理論上可以接受任何其他數(shù)據(jù)類型,如果變量未定義,VB自動(dòng)將其作為可變類型對(duì)待。它的默認(rèn)值就是 Empty,值 Empty 是異于0、零長(zhǎng)度字符串 (“”) 或 Null 值的特定值。判斷Empty使用isEmpty函數(shù),例如:
If IsEmpty (Z) Then Z = 0
當(dāng) Variant 變量包含 Empty 值時(shí),可在表達(dá)式中使用它;將其作為 0 或零長(zhǎng)度字符串來(lái)處理,這要根據(jù)表達(dá)式來(lái)定。
只要將任何值(包括 0、零長(zhǎng)度字符串或 Null)賦予 Variant 變量,Empty 值就會(huì)消失。而將關(guān)鍵字 Empty 賦予 Variant 變量,就可將 Variant 變量恢復(fù)為 Empty。
3.1 ISEmpty函數(shù)
IsEmpty返回一個(gè)指示是否已初始化變量的布爾值。
語(yǔ)法:IsEmpty(expression)
expression:必需的,參數(shù)是一個(gè)包含數(shù)值或字符串表達(dá)式的Variant 。 但是, 由于IsEmpty用于確定是否初始化了各個(gè)變量, 因此_表達(dá)式_參數(shù)通常是單個(gè)變量名稱。
備注
IsEmpty 在變量未初始化或顯式設(shè)置為 Empty 時(shí)返回 True;否則,返回 False。 如果 expression 包含多個(gè)變量,則始終返回 False。 IsEmpty 僅返回變量的有用信息。此示例使用 IsEmpty 函數(shù)確定是否已初始化變量。
Dim MyVar, MyCheck MyCheck = IsEmpty(MyVar) ' 返回值為True' MyVar = Null ' 給MyVar賦值為空值' MyCheck = IsEmpty(MyVar) ' 初始變化量已發(fā)生變化,返回值為False' MyVar = Empty ' 將關(guān)鍵字 Empty 賦予 MyVar 變量' MyCheck = IsEmpty(MyVar) ' 返回值為True'
4、Nothing
Nothing相當(dāng)于Object變量中的空值,指向于空對(duì)象的引用,用于取消對(duì)象變量與實(shí)際對(duì)象的關(guān)聯(lián)。 使用Set 語(yǔ)句可將Nothing分配給對(duì)象變量。 例如:
Set MyObject = Nothing
多個(gè)對(duì)象變量可引用相同的實(shí)際對(duì)象。 在將 Nothing 分配給一個(gè)對(duì)象變量后,該變量將不再引用實(shí)際對(duì)象。
未初始化的Object變量為Nothing;未傳入函數(shù)的Object為Nothing。判斷一個(gè)變量是否為Nothing使用 is Nothing表達(dá)式。
同時(shí),Nothing還有另外一個(gè)用途,就是把所有指向某一個(gè)對(duì)象的Object變量賦值為Nothing可以銷毀此對(duì)象節(jié)省內(nèi)存空間。
4.1 IsNothing 與 Is Nothing的區(qū)別
IsNothing語(yǔ)法:IsNothing(Object)
Is Nothing語(yǔ)法:Object Is Nothing
A. IsNothing能給任何類型值的對(duì)象賦值nothing,但這可能出現(xiàn)Bug
IsNothing(Object)表示所有類型(括值類型)的對(duì)象都賦值為nothing,但是值類型不能為nothing,只能是0
Dim i As Integer If IsNothing(i) Then '使用IsNothing,代碼可以編譯和運(yùn)行 額。。。' ' Do something End If
Dim i As Integer '使用Is Nothing,代碼不能運(yùn)行,編譯器會(huì)提出錯(cuò)誤'
If i Is Nothing Then 'Is不接受類型為Integer的操作,必須是引用類型或可空類型'
' Do something
End If
B. 可讀性來(lái)說(shuō)Is Nothing更勝一籌
- IsNothing的否定語(yǔ)句是:Not IsNothing(object)
- Is Nothing的否定語(yǔ)句是:Not object Is Nothing
C. IsNothing(Object)實(shí)際上就是是Microsoft.VisualBasic.dll的一部分。(這句話代表什么意思呢)
5、vbNullString
vbNullString是一個(gè)String類型的常量,表示一個(gè)empty字符串。它與空白字符串"“不同,表示什么也沒(méi)有的字符串(nothing string)。
對(duì)于許多場(chǎng)合,它被當(dāng)作一個(gè)empty字符串”"處理,真正使用它的目的是傳遞null參數(shù)給庫(kù)函數(shù),主要是用于調(diào)用外部的動(dòng)態(tài)鏈接庫(kù)程序時(shí)使用(也就是API函數(shù))。
字符串是由兩部分組成:一個(gè)指針和一個(gè)Unicode字符數(shù)組
vbNullString就是一個(gè)只有第一部分而沒(méi)有第二部分的字符串
Dim temp As String '這個(gè)時(shí)候temp還沒(méi)有附值,只是定義了類型,就是說(shuō)還沒(méi)有真正占用內(nèi)存,地址就是0' '這時(shí)候temp就等于vbNullString' temp="" '把""賦值給temp,盡管等于空字符串,但是已經(jīng)占用了內(nèi)存,地址就發(fā)生了變化'
6、 零長(zhǎng)度字符、空字符、vbNull、vbNullChar、vbNullString的區(qū)別
不過(guò)很奇怪的是vbNullString=""這個(gè)表達(dá)式為True.
零長(zhǎng)度字符是指””,
空字符是指ASCII 中字符編碼為0的字符,即Null字符。
在vba內(nèi)部還定義了很多常量,其中有三個(gè)是含有Nul的的常量,它們分別是vbNull、vbNullChar、vbNullString。
通過(guò)在VBA編輯環(huán)境中按下F2快捷鍵分別搜索查詢以上三個(gè)常量可以得知:
Const vbNull = 1 Const vbNullChar = “” Const vbNullString = “”
其中vbNull=1可以很好的理解,而vbNullChar 和vbNullString 常量定義都等于零長(zhǎng)度字符,讓人有點(diǎn)摸不著頭腦。繼續(xù)查找MSDN中的官方文檔,可以得知:
vbNullChar=chr(0),指的是一個(gè)字符,這個(gè)字符的字符編碼為0,即等于ASCII表中的第一個(gè)字符,Null字符。
vbNullString 指的是一個(gè)字符串,它不同于零長(zhǎng)度字符串,主要是用于調(diào)用外部的動(dòng)態(tài)鏈接庫(kù)程序時(shí)使用(也就是API函數(shù))。
那vbNullChar是否等于零長(zhǎng)度字符呢?也即vbNullChar是否按照常量的定義等于””?可以使用如下代碼測(cè)試:
Sub QQ1722187970()
Dim str1 As String
str1 = "" '零長(zhǎng)度字符的Len返回0'
Debug.Print Len(str1) 'Len(vbNullChar)返回1'
Debug.Print Len(vbNullChar) '返回False'
Debug.Print str1 = vbNullChar
End Sub
也就是vbNullChar不等于零長(zhǎng)度字符。
再根據(jù)什么是BSTR數(shù)據(jù)類型一文,我們知道在vba中字符串變量存儲(chǔ)的是字符串的第一個(gè)字符的內(nèi)存地址,而實(shí)際的字符串是以BSTR類型存儲(chǔ)的,BSRT類型是個(gè)復(fù)合數(shù)據(jù)類型,它由4個(gè)字節(jié)(字符串的字節(jié)長(zhǎng)度,不含字符串結(jié)束符)+實(shí)際字符串+字符串結(jié)束符組成。
根據(jù)代碼測(cè)試可以得知:
字符串變量|字符串長(zhǎng)度不包含字符串結(jié)束符,以字節(jié)為單位)|第1個(gè)字節(jié)|第2個(gè)字節(jié)|第3個(gè)字節(jié)|第4個(gè)字節(jié)
-|-|-|-|-|-|-|-
str1=””|0|Null字符(字符串結(jié)束符)|Null字符(字符串結(jié)束符)|未使用|未使用
str1=vbNullChar|2|Null字符|Null字符|Null字符(字符串結(jié)束符)|未使用
str1=Chr(0)|2|Null字符|Null字符|Null字符(字符串結(jié)束符)|未使用
而vbNullString則一般用在調(diào)用外部api函數(shù)時(shí)使用,如果直接賦值給字符串變量則會(huì)導(dǎo)致excel重啟。
根據(jù)以上的知識(shí),現(xiàn)總結(jié)如下:
空字符=vbNullChar=chr(0)
vbnull=1
零長(zhǎng)度字符即不等于vbNullChar也不等于vbNullString。
到此這篇關(guān)于VB中判斷空的幾種方法(Null, Missing, Empty, Nothing, vbNullString)的文章就介紹到這了,更多相關(guān)VB 判斷空內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
淺談如何使用vb.net從數(shù)據(jù)庫(kù)中提取數(shù)據(jù)
這篇文章主要介紹了淺談如何使用vb.net從數(shù)據(jù)庫(kù)中提取數(shù)據(jù),使用VB提取數(shù)據(jù),是先查找,做成數(shù)組,再顯示到數(shù)據(jù)里,如果感興趣可以了解一下2020-07-07

