从单元格中仅保留数字

3
我有一个 Excel 表格,在其中使用以下命令从包含表单文本的单元格中获取数字:
=MID(D2;SEARCH("number";D2)+6;13)

它搜索字符串"number",并获取其后面的13个字符。但有时由于单元格内的文本没有模式,结果会比数字多。

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

如何避免输入除数字以外的任何字符?或者如何从所得到的内容中删除除数字以外的所有内容?


你能够使用VBA还是仅使用公式?另外,预期输出是什么? - dot.Py
随便什么都可以。我已经看到了三个可能的答案,我会在今天测试它们。 - Otorrinolaringologista -man
3个回答

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


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更改为您的数据位置。

示例图片:

  • 在模块窗口中插入代码:

enter image description here

执行该函数。

enter image description here

备注:如果你想将数字限制在13位,可以将代码的最后一行改为:

    only_numbers = tempVal

    only_numbers = Left(tempVal, 13)

或者,您可以查看此主题,了解如何使用公式实现此目标。


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)

我尝试了这个,它选择了我的第一个工作表中的一堆行。 - Otorrinolaringologista -man
抱歉,我不理解您的评论。我看不到您的整个环境,我假设您可能想将这个公式放入与您在评论中复制公式的单元格相同的单元格中。 - z32a7ul
也许你需要用“;”替换“,”。我在公式中使用了美式英语区域设置。 - z32a7ul
我已经将“,”替换为“:”。我认为问题可能出在ROW部分。它们确切地是做什么的? - Otorrinolaringologista -man
它的功能是迭代从1到13的数字。这样可以逐个检查字符串中的每个字符。 - z32a7ul

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接