从单元格中删除除数字以外的所有内容
Remove everything but numbers from a cell
我有一个 excel sheet,我在其中使用以下命令从包含表单文本的单元格中获取数字:
=MID(D2;SEARCH("number";D2)+6;13)
它搜索字符串 "number" 并获取紧随其后的 13 个字符。但有时由于单元格中的这些文本没有模式,结果会比数字多,如下例所示:
62999999990
21999999990
11999999990
6299999993) (
17999999999)
21914714753)
58741236714 P
18888888820
我如何避免拿走数字以外的任何东西,或者我如何从我得到的东西中删除除了数字以外的所有东西?
您可以使用此用户定义函数 (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
- 插入新模块
- 在模块 window
中粘贴代码
- 现在您可以在电子表格中使用公式
=only_numbers(A1)
,方法是将 A1
更改为您的数据位置。
示例图片:
- 正在模块 window 中插入代码:
- 正在执行函数
Ps.:如果要分隔位数为13,可以将最后一行代码改为:
only_numbers = tempVal
至
only_numbers = Left(tempVal, 13)
或者您可以查看 this topic 以了解如何使用公式实现此目的。
如果您不想 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))* ROW(:),0),ROW(:))+1,1)*10^ROW(:)/10)
如果您要转到用户定义函数(又名 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
我根据您的叙述添加了几个可选参数。如果您的情况发生变化,您可以更改这些。最值得注意的是 return 一个真实的数字还是带有 bNumericReturn 选项的看起来像数字的文本。请注意,returned 值是右对齐的,因为真实数字应该在以下提供的图像中。
通过向第六个参数提供 FALSE
,returned 内容是看起来像数字的文本,现在在工作表单元格中左对齐。
我有一个 excel sheet,我在其中使用以下命令从包含表单文本的单元格中获取数字:
=MID(D2;SEARCH("number";D2)+6;13)
它搜索字符串 "number" 并获取紧随其后的 13 个字符。但有时由于单元格中的这些文本没有模式,结果会比数字多,如下例所示:
62999999990
21999999990
11999999990
6299999993) (
17999999999)
21914714753)
58741236714 P
18888888820
我如何避免拿走数字以外的任何东西,或者我如何从我得到的东西中删除除了数字以外的所有东西?
您可以使用此用户定义函数 (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
- 插入新模块
- 在模块 window 中粘贴代码
- 现在您可以在电子表格中使用公式
=only_numbers(A1)
,方法是将A1
更改为您的数据位置。
示例图片:
- 正在模块 window 中插入代码:
- 正在执行函数
Ps.:如果要分隔位数为13,可以将最后一行代码改为:
only_numbers = tempVal
至
only_numbers = Left(tempVal, 13)
或者您可以查看 this topic 以了解如何使用公式实现此目的。
如果您不想 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))* ROW(:),0),ROW(:))+1,1)*10^ROW(:)/10)
如果您要转到用户定义函数(又名 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
我根据您的叙述添加了几个可选参数。如果您的情况发生变化,您可以更改这些。最值得注意的是 return 一个真实的数字还是带有 bNumericReturn 选项的看起来像数字的文本。请注意,returned 值是右对齐的,因为真实数字应该在以下提供的图像中。
通过向第六个参数提供 FALSE
,returned 内容是看起来像数字的文本,现在在工作表单元格中左对齐。