0

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

4

5 回答 5

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"
于 2013-06-12T14:35:33.313 回答
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
于 2013-06-12T16:11:00.177 回答
1

您可以编写一些 VBA 来格式化数据(从最后开始并返回直到您遇到非数字。)

或者您可以(如果您很高兴获得Excelicious 之类的插件),那么您可以使用正则表达式通过公式来格式化文本。像这样的表达式[0-9]+$将返回字符串 IIRC 末尾的所有数字。

于 2013-06-12T13:24:15.060 回答
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
于 2013-06-12T14:06:26.023 回答
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)
于 2013-06-12T12:27:30.860 回答