Q:在使用Excel时经常听到单元格为空或空白,这样的说法有区别吗?
Q:在使用Excel时经常听到单元格为空或空白,这样的说法有区别吗?
A:在Excel中,单元格为空(empty)或空白(blank)似乎可以互用,但它们有不同的含义:
空单元格指没有包含任何内容的单元格,在其中没有常量、没有公式、没有前缀字符。
空白单元格指该单元格可以是空单元格、可以包括前缀字符或者空字符串(公式结果为空或者常量值)
在工作表中,检查单元格为空的最好方法是使用ISBLANK工作表函数,如下所示。
在中,第3行各列是第2行对应列中输入的结果,在单元格B3中直接输入字符串“ Excel”,在C3中输入公式=””,在D3中输入前缀字符撇号,E3中什么也没有输入。第4行使用ISBLANK函数判断第3行对应列中的单元格是否为空单元格。
在VBA中,当单元格为空时,Range.Value属性和Range.Value2属性返回Variant/Empty,因此VBA代码检查单元格是否为空最好的方法是使用IsEmpty函数。
对于所示的工作表,检查单元格是否为空的VBA代码:
SubCheckIsEmpty()
Debug.PrintIsEmpty(Sheet1.Range(“B3”).Value2) ‘结果为False
Debug.PrintIsEmpty(Sheet1.Range(“C3”).Value2) ‘结果为False
Debug.Print IsEmpty(Sheet1.Range(“D3”).Value2) ‘结果为False
Debug.PrintIsEmpty(Sheet1.Range(“E3”).Value2) ‘结果为True
End Sub
COUNTBLANK工作表函数与ISBLANK工作表函数对应的行为不一致。COUNTBLANK函数统计空单元格、具有空字符串的单元格和包含前缀字符的单元格,可以用于检查单元格是否为空白单元格(显示的是空),如所示。
在中,第4行使用公式=COUNTBLANK(单元格)=1判断指定单元格是否为空白单元格;在单元格B6中使用公式=COUNTBLANK(B3:E3)统计单元格区域B3:E3中空白单元格数。
在VBA中,可以使用Range.Value(或Range.Value2)属性与vbNullString常量相比较的结果来判断单元格是否为空白单元格:
SubCheckIsBlank()
Debug.PrintIsBlank(Sheet1.Range(“B3”)) ‘结果为False
Debug.PrintIsBlank(Sheet1.Range(“C3”)) ‘结果为True
Debug.PrintIsBlank(Sheet1.Range(“D3”)) ‘结果为True
Debug.PrintIsBlank(Sheet1.Range(“E3”)) ‘结果为True
End Sub
FunctionIsBlank(ByRef rngCheck As Range) As Boolean
IsBlank = (CStr(rngCheck.Cells(1).Value2) =vbNullString)
End Function
还有一个更有效的方法是调用工作表函数COUNTBLANK函数:
Sub IfIsBlank()
Debug.PrintIfBlank(Sheet1.Range(“B3”)) ‘结果为False
Debug.PrintIfBlank(Sheet1.Range(“C3”)) ‘结果为True
Debug.PrintIfBlank(Sheet1.Range(“D3”)) ‘结果为True
Debug.PrintIfBlank(Sheet1.Range(“E3”)) ‘结果为True
End Sub
FunctionIfBlank(ByRef rngCheck As Range) As Boolean
IfBlank =(Application.WorksheetFunction.CountBlank(rngCheck.Cells(1)) = 1)
End Function
最后,再谈谈空字符串。空字符串是一个长度为的字符串,可以包含常量或者公式结果(为空)。例如,公式=””返回一个空字符串。如果你复制这个公式并粘贴为值时单元格中包含的空字符串为常量,有时从外部数据源导入数据时也会得到空字符串。
下面的HasNullString函数在单元格中包含空字符串时返回True。如果想要忽略公式结果(例如,仅检查常量),那么给参数blnConstantsOnly传递True。如果单元格中有前缀字符,那么该函数返回False。
Public FunctionHasNullString( _
ByRef rngToCheck As Range, _
Optional ByVal blnConstantsOnly AsBoolean = False) _
As Boolean
Dim rngFirstCell As Range
Dim strToCheck As String
Dim varToCheck As Variant
Set rngFirstCell = rngToCheck.Cells(1)
varToCheck = rngFirstCell.Value2
If Not IsEmpty(varToCheck) Then
If blnConstantsOnly Then
strToCheck = rngFirstCell.Formula
Else
strToCheck = CStr(varToCheck)
End If
If strToCheck = vbNullString Then
HasNullString =(LenB(rngFirstCell.PrefixCharacter) = )
End If
End If
End Function