除了单元格中的所有数字,

时间:2017-03-22 19:03:00

标签: regex excel excel-formula udf

我有一张excel表,我使用follwoing命令从包含表单文本的单元格中获取数字:

=MID(D2;SEARCH("number";D2)+6;13)

搜索字符串" number"然后获得接下来的13个字符。但有时候结果得到的数字超过数字,因为单元格中的这些文本没有模式,如下例所示:

62999999990
21999999990
 11999999990 
6299999993) (
17999999999) 
 21914714753)
58741236714 P
 18888888820 

我如何避免采取任何数字除了数字或如何删除除了数字之外的所有内容?

3 个答案:

答案 0 :(得分:1)

您可以使用此用户定义函数(UDF)来获取特定单元格内的数字。

<强>代码:

Function only_numbers(strSearch As String) As String

    Dim i As Integer, tempVal As String

    For i = 1 To Len(strSearch)
        If IsNumeric(Mid(strSearch, i, 1)) Then
            tempVal = tempVal + Mid(strSearch, i, 1)
        End If
    Next

    only_numbers = tempVal

End Function

要使用它,您必须:

  1. 按ALT + F11
  2. 插入新模块
  3. 在模块窗口中粘贴代码
  4. 现在,您可以在电子表格中使用公式=only_numbers(A1),方法是将A1更改为您的数据位置。
  5. 示例图片:

    • 在模块窗口插入代码:

    enter image description here

    • 执行功能

    enter image description here

    Ps。:如果要将位数分隔为13,可以更改最后一行代码:

        only_numbers = tempVal
    

        only_numbers = Left(tempVal, 13)
    

    或者,您可以查看this topic以了解如何使用公式实现此目的。

答案 1 :(得分:1)

如果您要转到用户定义函数(又名UDF),则执行所有操作;不要依赖初步工作表公式将剥离的数字和可能的后缀文本传递给UDF。

在标准代码模块中,

Function udfJustNumber(str As String, _
                       Optional delim As String = "number", _
                       Optional startat As Long = 1, _
                       Optional digits As Long = 13, _
                       Optional bCaseSensitive As Boolean = False, _
                       Optional bNumericReturn As Boolean = True)
    Dim c As Long

    udfJustNumber = vbNullString
    str = Trim(Mid(str, InStr(startat, str, delim, IIf(bCaseSensitive, vbBinaryCompare, vbTextCompare)) + Len(delim), digits))

    For c = 1 To Len(str)
        Select Case Asc(Mid(str, c, 1))
            Case 32
                'do nothing- skip over
            Case 48 To 57
                If bNumericReturn Then
                    udfJustNumber = Val(udfJustNumber & Mid(str, c, 1))
                Else
                    udfJustNumber = udfJustNumber & Mid(str, c, 1)
                End If
            Case Else
                Exit For
        End Select
    Next c

End Function

我已经使用你的叙述添加了几个可选参数。如果情况发生变化,您可以更改这些。最值得注意的是,是否使用 bNumericReturn 选项返回真实数字或类似文本的数字。请注意,返回的值是右对齐的,因为真实数字应该在以下提供的图像中。

enter image description here

通过向第六个参数提供FALSE,返回的内容是类似文本的文本,现在在工作表单元格中左对齐。

enter image description here

答案 2 :(得分:0)

如果您不想要VBA并且只想使用Excel公式,请尝试以下方法:

=SUMPRODUCT(MID(0&MID(D2,SEARCH("number",D2)+6,13),LARGE(INDEX(ISNUMBER(--MID(MID(D2,SEARCH("number",D2)+6,13),ROW($1:$13),1))* ROW($1:$13),0),ROW($1:$13))+1,1)*10^ROW($1:$13)/10)