我可以使用VBA来检测数字是否作为文本存储在单元格中?

时间:2014-01-29 09:36:17

标签: excel excel-vba 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

5 个答案:

答案 0 :(得分:7)

<强> UPD:

所有解决方案都很好,但在下一种情况下无效:

也可以使用Number format(或任何其他格式)的单元格,但将数字存储为文本(您可以在我的测试wotkbook中看到它)。想象一下当您使用Text格式在单元格中编号,然后将Text格式更改为Nubmer format(在单元格属性中或使用功能区中的“格式”组合框)时的情况。您的值仍将存储为文本(尽管excel表示它存储在Number Format中),直到您按 F2 ENTER (您可以检查它)在我的测试工作簿中)。 您可以简单地重现此行为:将单元格格式更改为Text,然后输入值(即123),然后将单元格格式更改为Number Format(完全按此顺序) )。现在您的值存储为文本但有Number Format

因此,检查Range.NumberFormat是错误的方式。

这是Test workbook

有一种非常简单而优雅的方法可以检测存储为文本或数字的数字:

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

<强>结果:

enter image description here

答案 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

这将照顾这样的场景

enter image description here

请注意,在第一个单元格中,数字格式为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

现在在工作表中使用它

enter image description here

答案 4 :(得分:1)

我很抱歉迟到的答案(我是SO的新人),但我认为仍然缺少正确的答案。所以我担心你也错了,simoco。

例如,每当我引用数据透视表中的数字并将其存储为文本(源可能是另一个表或数据库)时,您的函数就不起作用。 我的解决方案似乎适用于所有情况。 Excel已经具有此功能,可以用作公式:=ISTEXT(reference)

由于OP想要使用VBA,解决方案是: Application.WorksheetFunction.IsText (reference) ,返回TrueFalse