Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Excel 我是否可以使用VBA来检测某个数字是否以文本形式存储在单元格中?_Excel_Vba - Fatal编程技术网

Excel 我是否可以使用VBA来检测某个数字是否以文本形式存储在单元格中?

Excel 我是否可以使用VBA来检测某个数字是否以文本形式存储在单元格中?,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 UPD: Function IsNumberStoredAsText(Rng As Range) If Not IsNumeric(Rng) Then

我的想法大致如下:

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
UPD:

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
所有解决方案都是好的,但在接下来的情况下不起作用:

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
也可以将单元格设置为
数字格式
(或任何其他格式),但将数字存储为文本(您可以在我的测试wotkbook中看到)。想象一下这样的情况:单元格中的数字采用
Text
格式,然后将
Text
格式更改为
numer格式(在单元格属性中或使用功能区中的“格式”组合框)。在按F2键并输入之前(您可以在我的测试工作簿中检查),您的值仍将存储为文本(尽管excel表示它以
数字格式存储)。您可以简单地复制此行为:将单元格格式更改为
文本
,然后输入值(即123),然后将单元格格式更改为
数字格式
(完全按照此顺序)。现在,您的值存储为文本,但具有
数字格式

因此,检查
范围。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
函数是numberstoredastext(Rng作为范围)
如果不是数字(Rng),则
IsNumberStoredAsText=“非数字”
退出功能
如果结束
IsNumberStoredAsText=“数字未存储为文本”
如果Rng.值+0“Rng.值,则
IsNumberStoredAsText=“存储为文本的数字”
如果结束
端函数
工作原理:

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”
将被强制转换为
0
,而
Range(“A1”).Value+“0”
将返回数字123

结果:

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

您寻求的测试是

ISNUMERIC(...)
从Excel帮助:

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

我是否可以使用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
这将解决类似这样的情况

请注意,在第一个单元格中,numberformat是
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
现在在工作表中使用它


很抱歉,我的答案太晚了(我是这方面的新手),但我认为正确的答案仍然不见了。所以我恐怕你也错了,西莫科

例如,每当我在数据透视表中引用一个以文本形式存储的数字(源可能是另一个表或数据库)时,您的函数就不起作用。 我的解决方案似乎在所有情况下都有效。Excel已经有了一个函数,可以用作公式:
=ISTEXT(参考)

由于OP希望使用VBA,解决方案是:
Application.WorksheetFunction.IsText(reference)
,它返回
True
False
实际上有一种更方便的方法来检测单元格是否包含以文本形式存储的数字:

    If Range("A1").Errors.Item(xlNumberAsText).Value = True Then
       MsgBox "Number Stored As Text"
    Else
       MsgBox "Number Not Stored As Text"
    End If

A.

+1实际上回答了这个问题。克里斯,我可能错了,但实际的问题不是检查单元格是否有数值,而是检查数值是否存储为文本。@SiddharthRout我想他只是提供了OP代码中缺少的内容。实际上,这是唯一一个问题
测试表明A1的内容可以是一个数字
:)@SiddharthRout
isnumeric
测试它的参数是否可以是一个数字。这包括它是一个看起来像数字的字符串。@chrisneilsen:True但只是ISNUMERIC(…)`对于单元格格式为数字且包含数字的情况,将给出一个
假阳性。正如我提到的,我对这个问题的理解是检测一个数字是否以文本形式存储在一个单元格中
@SiddharthRout现在我看到了你的问题!op说,测试表明。。。我的回答是要指出测试的那一部分,而不是整个
if
(但你的A更完整)加上
前缀字符的一个。“还有很多东西要学。”悉达多,看我的。不幸的是,您的解决方案在一种情况下不起作用-当数字存储为
General
而没有
PrefixCharacter
。你也应该在你的自定义项中检查它。(如果将单元格复制为
文本
格式,然后将
文本
格式替换为
常规
),则可以将数字格式化为
常规
),实际上,如果将
文本
单元格复制为数字并粘贴,即使您将
text
格式更改为
numer格式
,数字仍将存储为文本,直到按F2键并输入(您可以在我的测试工作簿中进行检查)。所以,应该有更复杂的检查。也可以将单元格设置为
数字格式
,但将数字存储为text@simoco:说得好。一旦手动将单元格格式转换为数字甚至日期,则很难检查文本是否存储为数字。同样的方法也不适用于您的代码。在这种情况下,我想不出任何其他方法来检查数字是否存储为文本。@simoco:我已经想到了,但这是非常不可靠的,因为绿色三角形取决于错误检查选项。如果错误检查没有打开,那么您将不会看到绿色三角形:)我正在寻找这个-这可能是答案-我将测试它,但谢谢!你知道有没有一种方法可以使用
SpecialCells
基本上获得所有的t