【问题标题】:I have 55,000 rows of data containing text and numbers and I'm looking to extract only the numbers where possible我有 55,000 行包含文本和数字的数据,我希望尽可能只提取数字
【发布时间】:2020-12-29 21:26:12
【问题描述】:

我在 excel 中有几千个数据点。

我只想从字符串中提取数字。

字符串的一个例子可能是:

我想尽可能找到第一个 $ 符号并将其右侧的连续数字返回并删除其他所有内容。

我已经尝试在 VBA 中查找和替换,这导致 370,400 成为数字,或 2,700 美元(我使用了一个很大的查找和替换选项变量),但是我想这可以通过一个更擅长数据的人的公式来完成然后是我。

有什么建议吗?

【问题讨论】:

  • 这个问题与您在 1/2 小时前发布的问题有何不同?这个没有显示你尝试了什么,也没有显示你想要的结果。
  • 我被要求将问题溢出到基于公式的问题或 VBA 中。因此,这仅在 excel 公式部分中,不包括上一篇文章中的代码。
  • 我建议您使用正则表达式(在此论坛中搜索 VBA 和正则表达式以获取示例)或 Power Query 开发 VBA 解决方案。
  • 我最终使用 UDF 和单元格中以下表达式的公式完成了它"=VALUE(StripChar(IFERROR(LEFT(RIGHT(B2,LEN(B2)-FIND("$", B2)),4),B2)))"
  • 根据您的需要,您可能可以设计一个处理整个字符串的正则表达式。可能更简单。但只要您的解决方案适合您...顺便说一句,您应该能够将您的答案标记为“已接受”,如果不是今天,那么在 24-48 小时后。

标签: excel excel-formula


【解决方案1】:

查看后,我最终不得不编写一个用户定义的函数,并将其包含在一个表达式中,如下所示:

=VALUE(StripChar(IFERROR(LEFT(RIGHT(B2,LEN(B2)-FIND("$",B2)),4),B2)))

stripchar UDF 如下:

Function StripChar(Txt As String) As String 
    With CreateObject("VBScript.RegExp") 
         .Global = True 
         .Pattern = "\D"
         StripChar = .Replace(Txt, "") 
    End With 
End Function

【讨论】:

    【解决方案2】:

    这是一种提取值的不同方法,而不是替换:

    Function extrRent(S As String)
        With CreateObject("VBScript.Regexp")
            .Global = False 'to extract only the first dollar value
            .Pattern = "\$\s*(\d+(?:\.\d+)?)"
            If .test(S) Then _
                extrRent = CDbl(.Execute(S)(0).submatches(0))
        End With
    End Function
    

    如果您想返回的不仅仅是美元金额的第一个实例,您可以修改为返回相关值的数组。

    【讨论】:

      【解决方案3】:

      如果您愿意使用 UDF,请考虑:

      Option Explicit
      
      Public Function NumberGrabber(s As String) As Variant
          Dim arr, L As Long, i As Long, ch As String
          NumberGrabber = ""
          
          If InStr(s, "$") = 0 Then Exit Function
          
          arr = Split(s, "$")
          L = Len(arr(1))
          For i = 1 To L
              ch = Mid(arr(1), i, 1)
              If ch Like "[0-9]" Then
                    NumberGrabber = NumberGrabber & ch
              End If
          Next i
      End Function
      

      编辑#1:

      要捕获小数点和小数点后的数字:

      Public Function NumberGrabber(s As String) As Variant
      
      '    version 3
      
          Dim arr, L As Long, i As Long, ch As String
          NumberGrabber = ""
          
          If InStr(s, "$") = 0 Then Exit Function
          
          arr = Split(s, "$")
          L = Len(arr(1))
          For i = 1 To L
              ch = Mid(arr(1), i, 1)
              If ch Like "[0-9]" Or ch = "." Then
                    NumberGrabber = NumberGrabber & ch
              Else
                  Exit Function
              End If
          Next i
      End Function
      

      【讨论】:

      • 您可能想在您的字符类中添加一个点(十进制)。
      猜你喜欢
      • 2013-10-18
      • 1970-01-01
      • 1970-01-01
      • 2011-11-26
      • 2023-03-03
      • 1970-01-01
      • 2017-09-19
      • 1970-01-01
      • 2020-07-02
      相关资源
      最近更新 更多