从可变长度string中删除可变数量的前导字符
如果我有G4ED7883666,我希望输出是7883666,我必须将这个应用于一系列单元格,它们的长度不一样,唯一的共同之处就是我必须删除前面的数字字母?
此公式查找string中的最后一个数字,即string中最后一个字母字符右侧的所有数字。
=RIGHT(A1,MATCH(99,IFERROR(1*MID(A1,LEN(A1)+1-ROW($1:$25),1),99),0)-1)
请注意,这是一个数组公式,并且必须使用Control – Shift – Enter键盘组合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)