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

时间:2013-06-12 12:19:31

标签: excel excel-vba vba

如果我有G4ED7883666,我希望输出为7883666 我必须将它应用于一系列单元格,并且它们的长度不同,唯一常见的是我必须在字母表前面的数字之前删除任何内容?

5 个答案:

答案 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正则表达式的引用才能生效。 工具 - >引用... enter image description here

现在您可以在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)