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