从可变长度string中删除可变数量的前导字符

如果我有G4ED7883666,我希望输出是7883666,我必须将这个应用于一系列单元格,它们的长度不一样,唯一的共同之处就是我必须删除前面的数字字母?

此公式查找string中的最后一个数字,即string中最后一个字母字符右侧的所有数字。

  =RIGHT(A1,MATCH(99,IFERROR(1*MID(A1,LEN(A1)+1-ROW($1:$25),1),99),0)-1) 

请注意,这是一个数组公式,并且必须使用ControlShiftEnter键盘组合input

公式如何工作

假设目标string非常简单: “G4E78”

从公式中间向外进行操作,首先要做的是创build一个元素为1到25的数组(尽pipe这看起来似乎将公式限制为不超过25个字符的string,但实际上它将限制为25数字的大小可能是由公式提取的数字。

 ROW($1:$25) = {1;2;3;4;5;6;7; etc.} 

从这个数组中减去(1 +目标string的长度)的值会产生一个新的数组,其中的元素从string的长度开始倒数。 前五个元素将对应string的字符位置 – 以相反的顺序!

 LEN(A1)+1-ROW($1:$25) = {5;4;3;2;1;0;-1;-2;-3;-4; etc.} 

MID函数然后创build一个新的数组,它颠倒了string的字符顺序。

例如,新数组的第一个元素是MID(A1,5,1)的结果,MID(A1,4,1)的第二个元素等等。 价值! 错误反映了MID不能评估0或负值作为string的位置,例如,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上匹配给出了从string的右端开始计数的第一个非数字字符的位置。 在这种情况下,“E”是反向string“87E4G”中位置3处的第一个非数字。这相当于说我们正在查找的string末尾加上“E”是3个字符长。

 MATCH(99,IFERROR(1*MID(A1,LEN(A1)+1-ROW($1:$25),1),99),0) = 3 

所以,最后一步,我们从string右边取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这样的插件),那么你可以使用正则expression式通过公式来设置文本的格式。 像[0-9]+$这样的expression式会返回stringIIRC末尾的所有数字。

注意:这在詹姆斯·斯内尔的答案中使用了正则expression式模式,所以如果你觉得这个有用的话,请提高他的答案。

你最好的select是使用正则expression式。 您需要设置对VBScript正则expression式的引用才能正常工作。 工具 – >参考… 在这里输入图像说明

现在你可以在你的VBA中使用正则expression式。

这将在每个单元的末尾find数字。 我将结果放在原来的旁边,以便您可以validation它是否按照您想要的方式工作。 您可以对其进行修改,以便在您感觉舒适时立即更换电池。 无论您正在评估的string的长度如何,代码都能正常工作,如果找不到匹配项,将跳过该单元格。

 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)