删除一切,但从单元格中的数字
我有一个Excel工作表,我使用follwoing命令从包含表单文本的单元格获取数字:
=MID(D2;SEARCH("number";D2)+6;13)
它searchstring“数字”,并获得后面的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
- 插入新的模块
- 在模块窗口中粘贴代码
- 现在,您可以在电子表格中使用公式
=only_numbers(A1)
,方法是将A1
更改为您的数据位置。
示例图片:
- 在模块窗口插入代码:
- 执行该function
Ps:如果你想把数字的位数分隔到13,你可以把最后一行代码改为:
only_numbers = tempVal
至
only_numbers = Left(tempVal, 13)
另外,你可以看看这个主题了解如何实现这个使用公式。
如果你要去用户定义函数(又名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选项返回一个真正的数字或文本看起来像一个数字。 请注意,返回的值是右alignment的,因为真实的数字应在以下提供的图像中。
通过向第六个参数提供FALSE
,返回的内容是文本看起来像一个数字,现在左alignment工作表单元格中。
如果你不想要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)