如果我有G4ED7883666,我希望输出为7883666 我必须将它应用于一系列单元格,并且它们的长度不同,唯一常见的是我必须在字母表前面的数字之前删除任何内容?
答案 0 :(得分:3)
此公式查找字符串中的最后一个数字,即字符串中最后一个字母字符右侧的所有数字。
=RIGHT(A1,MATCH(99,IFERROR(1*MID(A1,LEN(A1)+1-ROW($1:$25),1),99),0)-1)
请注意,这是一个数组公式,必须使用 Control - Shift - Enter 键盘组合输入。
让我们假设目标字符串相当简单:“G4E78”
从公式的中间向外工作,首先要做的是创建一个包含元素1到25的数组。(虽然这似乎将公式限制为不超过25个字符的字符串,但它实际上放置了一个公式可以提取的数字大小限制为25位数。
ROW($1:$25) = {1;2;3;4;5;6;7; etc.}
从此数组中减去(1 +目标字符串的长度)的值会产生一个新数组,其元素从字符串的长度开始倒数。前五个元素将对应于字符串字符的位置 - 以相反的顺序!
LEN(A1)+1-ROW($1:$25) = {5;4;3;2;1;0;-1;-2;-3;-4; etc.}
MID函数然后创建一个新数组,该数组反转字符串字符的顺序。
例如,新数组的第一个元素是MID(A1,5,1)的结果,MID(A1,4,1)的第二个元素依此类推。价值!错误反映了MID不能将0或负值作为字符串的位置来评估的事实,例如MID(A1,0,1)= #VALUE!。
MID(A1,LEN(A1)+1-ROW($1:$25),1) = {"8";"7";"E";"4";"G";#VALUE!;#VALUE!; etc.}
将数组的元素乘以1可将该数组的字符元素转换为#VALUE!错误。
=1*MID(A1,LEN(A1)+1-ROW($1:$25),1) = {"8";"7";#VALUE!;"4";#VALUE!;#VALUE!;#VALUE!; etc.}
IFERROR函数将#VALUES变为99,这只是一个大于单个数字值的任意数字。
IFERROR(1*MID(A1,LEN(A1)+1-ROW($1:$25),1),99) = {8;7;99;4;99;99;99; etc.}
99上的匹配给出了从字符串右端开始计数的第一个非数字字符的位置。在这种情况下,“E”是反向字符串“87E4G”中位于第3位的第一个非数字。这相当于说我们在字符串末尾寻找的数字加上“E”,是3个字符。
MATCH(99,IFERROR(1*MID(A1,LEN(A1)+1-ROW($1:$25),1),99),0) = 3
所以,对于最后一步,我们取3 - 1(对于字符串右边的“E”字符。
RIGHT(A1,MATCH(99,IFERROR(1*MID(A1,LEN(A1)+1-ROW($1:$25),1),99),0)-1) = "78"
答案 1 :(得分:2)
还有一份提交供您考虑。此VBA函数将在第一个非数字字符
之前获得最右边的数字Public Function GetRightNumbers(str As String)
Dim i As Integer
For i = Len(str) To 0 Step -1
If Not IsNumeric(Mid(str, i, 1)) Then
Exit For
End If
Next i
GetRightNumbers = Mid(str, i + 1)
End Function
答案 2 :(得分:1)
您可以编写一些VBA来格式化数据(只需从最后开始并继续工作直到您点击非数字。)
或者您可以(如果您很高兴获得像Excelicious这样的插件),那么您可以使用正则表达式通过公式格式化文本。像[0-9]+$
这样的表达式将返回字符串IIRC末尾的所有数字。
答案 3 :(得分:1)
注意:这在James Snell的回答中使用了正则表达式模式,所以如果你觉得这很有用,请提供他的答案。
最好的办法是使用正则表达式。您需要设置对VBScript正则表达式的引用才能生效。 工具 - >引用...
现在您可以在VBA中使用正则表达式。
这将在每个单元格的末尾找到数字。我将结果放在原件旁边,以便您可以验证它是否按照您想要的方式工作。您可以修改它以在您感觉舒适时立即更换单元格。无论您正在评估的字符串的长度如何,代码都会起作用,如果找不到匹配项,则会跳过该单元格。
Sub GetTrailingNumbers()
Dim ws As Worksheet
Dim rng As Range
Dim cell As Range
Dim result As Object, results As Object
Dim regEx As New VBScript_RegExp_55.RegExp
Set ws = ThisWorkbook.Sheets("Sheet1")
' range is hard-coded here, but you can define
' it programatically based on the shape of your data
Set rng = ws.Range("A1:A3")
' pattern from James Snell's answer
regEx.Pattern = "[0-9]+$"
For Each cell In rng
If regEx.Test(cell.Value) Then
Set results = regEx.Execute(cell.Value)
For Each result In results
cell.Offset(, 1).Value = result.Value
Next result
End If
Next cell
End Sub
答案 4 :(得分:0)
从num:
右侧取前4位数字num1=Right(num,4)
从num:
的左边开始前5位数字num1=Left(num,5)
首先取左边的前十位数字,然后取右边的前四位数字:
num1=Right(Left(num, 10),4)
在你的情况下:
num=G4ED7883666
num1=Right(num,7)