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

use*_*776 5 excel vba excel-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
Run Code Online (Sandbox Code Playgroud)

Dmi*_*liv 8

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
Run Code Online (Sandbox Code Playgroud)

这个怎么运作:

令单元格A1包含作为文本存储的数字"123" .在这种情况下,Range("A1").Value + "0"将连接两个字符串,并返回"1230",但如果A1包含数123 存储为数字, "0"将被强制转换为0Range("A1").Value + "0"将返回123号

结果:

在此输入图像描述


chr*_*sen 5

你寻求的考验是

ISNUMERIC(...)
Run Code Online (Sandbox Code Playgroud)

从Excel帮助:

返回一个布尔值,指示是否可以将表达式计算为数字.

  • @chrisneilsen:正确,但对于单元格格式为数字且包含数字的情况,ISNUMERIC(...)` 会给出“误报”。就像我提到的,我对这个问题的理解是“检测数字是否以文本形式存储在单元格中” (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
Run Code Online (Sandbox Code Playgroud)

一个.


Sid*_*out 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
Run Code Online (Sandbox Code Playgroud)

这将处理这样的场景

在此输入图像描述

请注意,在第一个单元格中,数字格式为General,并且数字存储为文本,使用'

编辑

为了进一步证明这一点。我们将上面的 sub 转换为 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
Run Code Online (Sandbox Code Playgroud)

现在在工作表中使用它

在此输入图像描述