我可以使用VBA来检测数字是否作为文本存储在单元格中?
我正在考虑按照以下方式:
if Range("A1").NumberFormat = "@" AND test to show that the content of A1 can be a number Then Debug.Print("A1 is a number stored as text") end if
我可以使用VBA来检测数字是否作为文本存储在单元格中?
让我也玩:)
要做一个确切的testing来检查一个数字是否作为文本存储在一个单元格中,使用这个
Sub Sample() If (Range("A1").NumberFormat = "@" And IsNumeric(Range("A1"))) Or _ (Range("A1").PrefixCharacter = "'" And IsNumeric(Range("A1"))) Then Debug.Print ("A1 is a number stored as text") End If End Sub
这将照顾这样的情况
请注意,在第一个单元格中,数字格式为“ General
,并且数字以“文本'
编辑 :
为了进一步certificate这一点。 我们将把上面的子转换成UDF
Function IsNumberStoredAsText(Rng As Range) IsNumberStoredAsText = "Number is not stored as text" If (Rng.NumberFormat = "@" And IsNumeric(Rng)) Or _ (Rng.PrefixCharacter = "'" And IsNumeric(Rng)) Then IsNumberStoredAsText = "Number stored as text" End If End Function
现在在工作表中使用它
UPD:
所有的解决scheme都很好,但是在下一种情况下不能工作:
也可以使用Number format
(或任何其他格式),但数字存储为文本(您可以在我的testingwotkbook中看到它)的单元格。 试想一下,如果您使用Text
格式在单元格中编号,然后将Text
格式更改为Nubmer format
(在单元格属性中或使用function区中的“格式”combobox),就可以想象这种情况。 你的价值仍然会保存为文本(尽pipe事实上,Excel表示它存储在Number Format
),直到你按F2和ENTER (你可以检查我的testing工作簿)。 您可以简单地重现此行为:将单元格的格式更改为Text
,然后input值(即123),然后将单元格的Number Format
更改为Number Format
(完全按此顺序)。 现在你的值存储为文本,但有Number Format
。
所以,检查Range.NumberFormat
是一个错误的方法。
这里是testing工作簿
有一个非常简单和优雅的方式来检测,如果一个数字存储为文本或数字:
Function IsNumberStoredAsText(Rng As Range) If Not IsNumeric(Rng) Then IsNumberStoredAsText = "NOT number" Exit Function End If IsNumberStoredAsText = "Number NOT stored as text" If Rng.Value + "0" <> Rng.Value Then IsNumberStoredAsText = "Number stored as text" End If End Function
怎么运行的:
让单元格A1
包含以文本forms存储的数字“123”。 在这种情况下, Range("A1").Value + "0"
将连接两个string并返回“1230”,但是如果A1
包含数字123 存储为数字 , "0"
将被转换为0
和Range("A1").Value + "0"
将返回123
结果:
你所寻求的testing是
ISNUMERIC(...)
从Excel帮助:
返回一个布尔值,指示expression式是否可以被评估为一个数字。
实际上有一种更方便的方式来检测单元格是否包含以文本forms存储的数字:
If Range("A1").Errors.Item(xlNumberAsText).Value = True Then MsgBox "Number Stored As Text" Else MsgBox "Number Not Stored As Text" End If
一个。
对于迟到的答案(我是新来的),我感到抱歉,但我认为正确的答案仍然存在。 所以恐怕你也错了,simoco。
例如,每当我引用一个数据透视表中的一个数字,并将其存储为文本(数据源可能是另一个表或数据库)时,您的函数将不起作用。 我的解决scheme似乎适用于所有情况。 Excel已经有一个函数可以用来作为公式: =ISTEXT(reference)
。
由于OP要使用VBA,解决scheme是: Application.WorksheetFunction.IsText (reference)
,它返回True
或False
。