【问题标题】:Excel - How do programmatically convert 'number stored as Text' to Number?Excel - 如何以编程方式将“存储为文本的数字”转换为数字?
【发布时间】:2016-06-17 23:48:43
【问题描述】:

出于查找原因,我正在寻找一个简单的 Excel VBA 或公式,它可以将 Excel 中的整行从“存储为文本的数字”转换为实际数字。

谁能指出我正确的方向?

【问题讨论】:

  • 对于就地转换vba是唯一的出路。使用公式,您需要将公式放在另一个单元格中。 =Value(A1)
  • 作为一般规则,在 VLOOKUP 上使用 INDEX(MATCH()),因为它的行为更加可预测。

标签: excel excel-formula vba


【解决方案1】:

更好的方法

您应该使用INDEX(MATCH) 而不是VLOOKUP,因为VLOOKUP 的行为方式无法预测,会导致错误,例如您可能遇到的错误。

INDEX ( <return array> , MATCH ( <lookup value> , <lookup array> , 0) )

使用0 作为MATCH 的最后一个参数意味着匹配必须是精确的
Here 是关于INDEX(MATCH)-ing 的一些更深入的信息

进一步

添加零 +0 将值转换为数字。
这可以(危险地)使用IFERROR() 扩展以将非数字文本变为零:

=A2+0
=IFERROR(A2+0,0)

反之,您可以连接一个空字符串&amp;"" 以强制该值是一个字符串。

注意事项

如果0 没有用作MATCH 的最后一个参数,它会发现各种意想不到的“匹配”……更糟糕的是,即使存在完全匹配,它也可能找到不同的值。

做一些额外的工作来确定MATCH 查找列中是否存在重复项通常是有意义的,否则将返回找到的第一个值(参见示例)。

MATCH 的帮助来自here,特别是第三个参数控制的匹配逻辑。

【讨论】:

  • 我以前使用过索引匹配逻辑,只是从未以这种方式使用过。我会在之前给它!谢谢!我一直在寻找一种将列转换到位的方法,但我想这也可以。
【解决方案2】:

如果您在 vlookup 或索引/匹配行之前添加它应该可以工作:

Sheets("Sheet1").UsedRange.Value = Sheets("Sheet1").UsedRange.Value

【讨论】:

    【解决方案3】:

    我确实找到了这个,但是有人也有公式吗?

    Sub macro() 
        Range("F:F").Select 'specify the range which suits your purpose
        With Selection 
            Selection.NumberFormat = "General" 
            .Value = .Value 
        End With 
    End Sub 
    

    http://www.ozgrid.com/forum/showthread.php?t=64027

    【讨论】:

    • 正如 Scott 所说,公式只能在其他单元格中执行此操作,因为它无法引用存储公式的单元格。关键字:循环引用。但是你可以在没有 VBA 的情况下做到这一点。选择 Column F,调用 Data - Text to columns,逐步完成向导,在第 3 步中为整个列选择数据格式 General。
    【解决方案4】:

    试试这个:

    Sub ConvertToNumber()
        Application.ScreenUpdating = False
        Dim cl As Range
        For Each cl In Selection.Cells
            cl.Value = CInt(cl.Value)
        Next cl
        Application.ScreenUpdating = True
    End Sub
    

    要使用它,只需用鼠标选择相关的单元格块,然后运行宏(Alt+F8 会弹出对话框)。它将遍历所选范围内的每个单元格并将其保存的任何值转换为数字。

    【讨论】:

      【解决方案5】:

      我编写了一个不关心数据格式的自定义 vlookup 函数。将其放入 VBA 中的模块并使用 = VLOOK 而不是 = VLOOKUP

      Public Function VLook(sValue As String, rDest As Range, iColNo As Integer)
      
      ' custom vlookup that's insensitive to data formats
      
      Dim iLastRow As Long
      Dim wsDest As Worksheet
      
      Set wsDest = Sheets(rDest.Parent.Name)
      
      iLastRow = wsDest.Range(wsDest.Cells(100000, rDest.Column).Address).End(xlUp).Row
      
      If iLastRow < rDest.Row + rDest.Rows.Count Then
          For X = rDest.Column To rDest.Column + rDest.Columns.Count
              If wsDest.Cells(100000, X).End(xlUp).Row > iLastRow Then iLastRow = wsDest.Cells(100000, X).End(xlUp).Row
          Next X
      End If
      
      sValue = UCase(Application.Clean(Trim(sValue)))
      
      For X = rDest.Row To iLastRow
      
          If UCase(Application.Clean(Trim(wsDest.Cells(X, rDest.Column)))) = sValue Then
              VLookDM = wsDest.Cells(X, rDest.Column + iColNo - 1)
              Exit For
          End If
      
      Next X
      
      End Function
      

      【讨论】:

        【解决方案6】:

        我能想到的最简单的方法是使用内置函数 =VALUE(TEXT_TO_CONVERT_TO_STRING)。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-08-21
          • 2011-01-30
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多