如何让 Excel VBA 识别数字单元格?

Posted

技术标签:

【中文标题】如何让 Excel VBA 识别数字单元格?【英文标题】:How do you get Excel VBA to recognize numeric cells? 【发布时间】:2020-03-12 08:50:10 【问题描述】:

我有一个全部左对齐的数字表(即 Excel 将它们识别为文本)

我在所有单元格上运行 VBA 脚本:

cell.value = cell.Value * 1

这个右对齐所有这些,Excel 将它们识别为小数除了的数字(例如 3.14 不起作用,而 314 起作用)。我还运行了一个查找和替换脚本,其中搜索的是空格(“”)并将其替换为空白(“”),所以这应该至少去掉公共空间。

更多线索:如果我在 Excel 中执行 =Value(A1) 公式,Excel 甚至会将小数识别为数字。如果我运行 Workbookfunction.value(A1) Excel 将无法识别为数字。

所以问题似乎与 VBA (?) 和小数有关。有什么解决办法吗?

我现在在 cmets 之后运行了以下内容:

For Each cell In rng
Dim vNumber As Double
On Error Resume Next
'Remove space
cell.Replace What:=" ", Replacement:="", LookAt:=xlPart, _
   SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=False, _
  ReplaceFormat:=False

'Remove comma
cell.Replace What:=",", Replacement:="", LookAt:=xlPart, _
    SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=False, _
   ReplaceFormat:=False

'Check if empty, if it is: Do nothing
If IsEmpty(cell) = True Then

Else
vNumber = CDbl(cell.Value)
cell.Value = vNumber
End If

'Check if numeric
If IsNumeric(cell) = True Then
cell.Interior.Color = RGB(0, 254, 0)
cell.Interior.TintAndShade = 0.8

Else
cell.Interior.Color = RGB(100, 0, 0)
cell.Interior.TintAndShade = 0.8

End If
Next cell

结果是以下之前和之后(其中一个是 Double,另一个是 Variant。不知何故,它在不是小数的单元格上写...

【问题讨论】:

我只是试图编辑您的问题以过滤掉不相关的问题 - 但失败了。相关信息不存在。您的第一行似乎说您有文字。但我错过了单元格只包含数字的信息。您的问题是如何识别数值,这意味着有些不是数字。您帖子的所有其余部分(第一行除外)表明您让代码将正确的结果写入您不知道如何设置其格式的单元格。所以,3.14 显示为 3,你责怪代码而不是单元格格式。 我想知道的是,如果“之前”单元格是文本(左对齐)“1.5”,那么输出应该是什么。而不是你输入的“13.9”,你想输出什么?如果您的系统的小数点分隔符是一个点并且数据有一个逗号,那么删除逗号可能会很有用。你不说。删除空格应该没有用,您也不会显示原始数据有空格的位置。将 13.6 转换为 5 是代码错误的标志,而不是 VBA 错误的标志。请让我们更容易。告诉我们你想要什么。 "如果“之前”单元格是文本(左对齐)“1.5”,输出应该是什么。 “1.5”+ 已格式化,因此 Excel 将其重新识别为数字。一开始 Excel 不会将其识别为数字。而不是你输入的“13.9”,你想输出什么? “13.9”。和上面一样。 “将 13.6 转换为 5 是代码错误的标志,而不是 VBA 错误的标志。”是的,我同意。这就是我寻求帮助的原因:) 我修改后的代码假定目标单元格的单元格格式是“常规”。当您更改此格式时,显示也会更改。请阅读有关单元格格式的信息以获得更好的控制,但在您这样做之前请使用“常规”。右键单击一个单元格,选择“设置单元格格式”>“数字”并查看那里可用的格式。如果需要,请通过 Google 获取设置自定义单元格格式的说明。 我熟悉单元格格式。目标是尽可能地自动化这个数据验证阶段。手动点击下拉菜单不符合目标:) 【参考方案1】:

您需要将单元格的值转换为双精度值。例如:

Dim myDouble As Double
myDouble = CDbl(Range("A1").Value)
Debug.Print myDouble
myDouble = myDouble + 1
Debug.Print myDouble

第 3 到 5 行只是为了证明它被识别为小数。

【讨论】:

谢谢!得到一些奇怪的结果.... For Each cell In rng Dim vNumber As Double If IsEmpty(cell) = True Then Else vNumber = CDbl(cell.Value) cell.Value = vNumber End If 它贯穿所有内容,但整数覆盖它下面的所有小数。我会尝试发布屏幕截图。 如果您有一些额外的代码要显示,您可以编辑您的原始帖子以显示新代码。这样你就可以将它作为“代码”插入,这样更容易阅读:)【参考方案2】:

您是否尝试过转换?

Sub test()

    Dim rng As Range, cell As Range

    With ThisWorkbook.Worksheets("Sheet1")

        Set rng = .Range("A1:A5")

        For Each cell In rng
            .Range("B" & cell.Row).Value = CDbl(cell)
        Next cell

    End With

End Sub

结果:

【讨论】:

我想知道为什么你的工作正常,而我的最终替换了包含小数的数字......也许与我定义范围的方式有关?另外,有没有办法实现这一点,以便将数据写入同一个单元格中?【参考方案3】:

Val(Cells(1,1).Value 会将字符串转换为数字,如果它是数字,则转换为零。 "123abc" 将转换为数字 123。如果单元格的字符串中没有非数字字符,IsNumeric(Cells(1,1).Value) 将返回 True。

顺便说一句,VBA 的 Val() 函数将忽略空格。 Val(123 456") 将返回数字 123456。

以下代码将满足您更新后的要求。请尝试一下。

Sub ConvertTextToNumbers()

    Dim Rng As Range
    Dim Cell As Range
    Dim Arr As Variant
    Dim R As Long

    With Worksheets("Sheet1")           ' modify to suit
        Set Rng = .Range(.Cells(2, "B"), .Cells(.Rows.Count, "B").End(xlUp))
        Arr = Rng.Value

        For R = 1 To UBound(Arr)
            ' remove commas and spaces
            Arr(R, 1) = Val(Replace(Replace(Arr(R, 1), " ", ""), ",", ""))
        Next R

        Rng.Offset(0, 1).Value = Arr

        For Each Cell In Rng.Offset(0, 1)
            Cell.Interior.Color = IIf(Cell.Value, vbGreen, vbRed)
        Next Cell
    End With
End Sub

【讨论】:

谢谢,但这似乎不符合我的需要。我需要空白来保持空白。此外,如果有一些非数字的东西,我需要标记它,以便我可以在需要的地方检查和更正它。不能让 Excel 猜测它可能是什么。 请告诉我们您拥有什么样的数据以及您想要什么样的输出。您的问题隐藏在您的叙述中,我向您保证,您需要的解决方案包含在我上面的回答中。但是为了得到更精确的答案,您需要提出一个精确的问题。你有什么样的数据:文本、数字、数字文本?你需要什么样的输出?整数、双精度、文本、数字文本、日期? 我的数据应该只是数字,但可以包含任何内容。它也被格式化为文本。我想:1)清除空格和逗号 2)正确格式化,以便 Excel 可以检查其是否为数字 3)将数字数据标记为数字(绿色) 4)将非数字数据标记为非数字(红色) 太好了!很容易做到。我已经更新了我的答案。祝你有美好的一天! 看起来 Variatus 有你需要的东西。要保留空白,只需在修改 Arr(R,​​1) 之前添加一个 If。您可以输入If Len(Arr(R, 1)) > 0 Then。这将检查空白,因为长度为零。要将其保留在同一列中,只需从两行代码中删除 .Offset(0,1)

以上是关于如何让 Excel VBA 识别数字单元格?的主要内容,如果未能解决你的问题,请参考以下文章

在EXCEL中,如何使用VBA设置单元格内指定字符串格式

在EXCEL中,如何使用VBA设置单元格内指定字符串格式 三六零问答

excel vba 数组中第1位字符为0,赋给单元格时如何将0保留?

EXCEL如何实现 回车到达某个单元格自动跳转到指定单元格

excel用vba自动提取某个ini文件中的数字到制定单元格

如何让datagridview单元格只能输入数字 C#