Excel中一种非常特殊的数字,这些数字看似数字,其实是文本格式(下文简称为文本数字),在单元格的左上角会有一个绿色小三角作为标志,如B1:B3单元格。
在编程时为什么需要区分普通数字和文本数字呢?先来看以下【立即窗口】种的测试代码。A1和B1单元格内容看似相同,但是测试代码的结果却完全不同。
单元格A1为普通数字,加号之后的"0"被转换为数字零,然后进行加法运算。单元格B1为文本数字,加号作为字符串连接运算符,合并两个字符串。 ?[A1]+"0"1 ?[B1]+"0"10VBA代码并无法识别单元格坐上角的绿色三角标志,或者说Range对象并没有一个属性值对应这个标志,但是可用通过自定义函数来区分这两种数字格式。
Function IsNumberStoredAsText(Rng As Range) As Variant If Not IsNumeric(Rng) Then IsNumberStoredAsText = vbNullChar Exit Function End If If Rng.Value +"0"= Rng.Value Then IsNumberStoredAsText = vbNo Else IsNumberStoredAsText = vbYes End If End Function【代码解析】
第2行代码判断单元格内容是否为数字,如果不是数字则第3行代码返回vbNullChar。
第6行代码利用+"0"运算来判别单元格中数字格式,如果运算结果与单元格的值相等,第7行代码返回vbNo,即单元格内容为普通数字,如果不等,第9行代码返回vbYes,即单元格内容为文本数字。
测试代码如下。
Sub DEMO() Dim c As Range, sMsg As String For Each c In Range("A1:B4").Cells Select Case IsNumberStoredAsText(c) Case Is = vbNullChar sMsg ="非数字"Case Is = vbYes sMsg ="文本数字"Case Is = vbNo sMsg ="普通数字"End Select Debug.Print"单元格["& c.Address &"]:"& sMsg Next End Sub【代码解析】
第3~13行代码循环遍历单元格。
第4~11行代根据自定义函数返回值提供不同的内容。
第12行代码在【立即窗口】中输入结果,如下所示。