从单元格中删除除数字以外的所有内容

Posted

技术标签:

【中文标题】从单元格中删除除数字以外的所有内容【英文标题】:Remove everything but numbers from a cell 【发布时间】:2017-03-22 19:03:00 【问题描述】:

我有一个 excel 表,我在其中使用以下命令从包含表单文本的单元格中获取数字:

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

它搜索字符串“number”并获取其后面的下 13 个字符。但有时由于单元格中的这些文本没有模式,结果会超过数字,如下例所示:

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

我如何避免除数字之外的任何内容,或者如何从我得到的内容中删除除数字之外的所有内容?

【问题讨论】:

您可以使用 VBA 还是只使用公式?另外,预期的输出是什么? 什么都行。我知道我已经有 3 个可能的答案,我会在白天测试它们。 【参考方案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

要使用它,您必须:

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

示例图片:

在模块窗口插入代码:

执行函数

Ps.:如果想把位数定为13位,可以把最后一行代码改成:

    only_numbers = tempVal

    only_numbers = Left(tempVal, 13)

您也可以查看this topic 以了解如何使用公式来实现这一目标。

【讨论】:

【参考方案2】:

如果您要转到用户定义函数(又名 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 选项返回真实数字或看起来像数字的文本。请注意,返回的值是右对齐的,因为真正的数字应该在以下提供的图像中。

通过将FALSE 提供给第六个参数,返回的内容是看起来像数字的文本,现在在工作表单元格中左对齐。

【讨论】:

【参考方案3】:

如果您不想要 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)

【讨论】:

我试过这个,它从我的第一张表中选择了一堆行 对不起,我不明白你的评论。我看不到您的整个环境,我假设您可能希望将此公式放入您在评论中复制公式的同一单元格中。 也许您必须将 ',' 替换为 ';'。我在公式中使用了美国英语语言环境。 我确实将“,”替换为“:”。我认为问题可能出在 ROW 部分。他们具体是做什么的? 它的功能是从 1 到 13 迭代数字。这样可以单独检查字符串中的每个字符。

以上是关于从单元格中删除除数字以外的所有内容的主要内容,如果未能解决你的问题,请参考以下文章

从excel vba的列中的所有单元格中删除不需要的字符

Word宏用于仅从某些表格单元格中删除颜色

如何从uitableview单元格中删除单元格

多选模式下的 UITableView 删除选定单元格中所有子视图的背景颜色

怎样提取excel单元格中的部分数字

如何从 tableview 的单元格中删除 imageView,并重置单元格的高度