我正在思考以下几点:
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
答案 0 :(得分:7)
<强> UPD:强>
所有解决方案都很好,但在下一种情况下无效:
也可以使用Number format
(或任何其他格式)的单元格,但将数字存储为文本(您可以在我的测试wotkbook中看到它)。想象一下当您使用Text
格式在单元格中编号,然后将Text
格式更改为Nubmer format
(在单元格属性中或使用功能区中的“格式”组合框)时的情况。您的值仍将存储为文本(尽管excel表示它存储在Number Format
中),直到您按 F2 和 ENTER (您可以检查它)在我的测试工作簿中)。 您可以简单地重现此行为:将单元格格式更改为Text
,然后输入值(即123),然后将单元格格式更改为Number Format
(完全按此顺序) )。现在您的值存储为文本但有Number Format
。
因此,检查Range.NumberFormat
是错误的方式。
有一种非常简单而优雅的方法可以检测存储为文本或数字的数字:
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
包含以文字存储的数字“123”。在这种情况下,Range("A1").Value + "0"
会连接两个字符串并返回“1230”,但如果A1
包含数字123 存储为数字,则"0"
将被投放到{{ 1}}和0
将返回数字123
<强>结果:强>
答案 1 :(得分:5)
您寻求的测试是
ISNUMERIC(...)
来自Excel帮助:
返回一个布尔值,指示是否可以将表达式计算为数字。
答案 2 :(得分:5)
实际上有一种更方便的方法来检测单元格是否包含存储为文本的数字:
If Range("A1").Errors.Item(xlNumberAsText).Value = True Then
MsgBox "Number Stored As Text"
Else
MsgBox "Number Not Stored As Text"
End If
一个。
答案 3 :(得分:4)
我可以使用VBA来检测数字是否作为文本存储在单元格中吗?
让我也玩吧。)
要进行精确测试以检查数字是否作为文本存储在单元格中,请使用此
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
,并使用'
将数字存储为文本
编辑:
进一步证明这一点。我们将上面的子转换为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
现在在工作表中使用它
答案 4 :(得分:1)
我很抱歉迟到的答案(我是SO的新人),但我认为仍然缺少正确的答案。所以我担心你也错了,simoco。
例如,每当我引用数据透视表中的数字并将其存储为文本(源可能是另一个表或数据库)时,您的函数就不起作用。
我的解决方案似乎适用于所有情况。 Excel已经具有此功能,可以用作公式:=ISTEXT(reference)
。
由于OP想要使用VBA,解决方案是:
Application.WorksheetFunction.IsText (reference)
,返回True
或False
。