如果我有 G4ED7883666 并且我希望输出为 7883666 并且我必须将其应用于一系列单元格并且它们的长度不同,唯一常见的是我必须删除之前的数字之前的任何内容字母?
5 回答
此公式查找字符串中的最后一个数字,即字符串中最后一个字母字符右侧的所有数字。
=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"
再提交一份供您考虑。此 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
您可以编写一些 VBA 来格式化数据(从最后开始并返回直到您遇到非数字。)
或者您可以(如果您很高兴获得Excelicious 之类的插件),那么您可以使用正则表达式通过公式来格式化文本。像这样的表达式[0-9]+$
将返回字符串 IIRC 末尾的所有数字。
注意:这使用了 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
取 num 右边的前 4 位数字:
num1=Right(num,4)
取 num 左边的前 5 位数字:
num1=Left(num,5)
首先取左边的前十位数字,然后取右边的前四位数字:
num1=Right(Left(num, 10),4)
在你的情况下:
num=G4ED7883666
num1=Right(num,7)