从一列提取5位数字到另一列

时间:2015-03-09 22:19:12

标签: vba excel-vba excel-formula excel-2010 excel-udf

我需要帮助在Excel 2010中仅从一列到另一列提取5位数字。这些数字可以位于字符串的任何位置(字符串的开头,中间的任何位置或结尾)。它们可以在括号或引号内,如:

  

(15478)或" 15478"或者' 15478'或[15478]

我需要忽略任何小于5位的数字,并包含以1或更多前导零开头的数字(如00052,00278等),并确保将前导零复制到下一列。有人可以帮我创建公式或UDF吗?

3 个答案:

答案 0 :(得分:2)

这是一个基于公式的替代方案,它将提取单元格A1中找到的前5位数字。在大多数情况下,我倾向于选择比VBA更合理的公式解决方案,因为公式更便于携带。此公式是数组公式,因此必须使用Ctrl + Shift + Enter输入。我们的想法是将字符串拆分为每个可能的5个字符块并测试每个字符串并返回第一个匹配。

  

= MID(A1,MIN(IF(NOT(ISERROR((" 1"&安培; MID(A1,ROW(INDIRECT(" R1C [1]:R"&安培; (LEN(A1)-4)及;" C [1]",FALSE)),5)及;" 0.1")* 1))* ISERROR(MID( A1,ROW(INDIRECT(" R1C [1]:R"及(LEN(A1)-4)及;" C [1]",FALSE))+ 5, 1)* 1)* ISERROR(MID(A1,ROW(INDIRECT(" R1C [1]:R"及(LEN(A1)-4)及;" C [1]& #34;,FALSE)) - 1,1)* 1),ROW(INDIRECT(" R1C [1]:R"及(LEN(A1)-4)及;" C ^ [1]",FALSE)),9999999999)),5)

让我们打破这个局面。首先,我们有一个表达式,我用了两次来返回一个数字数组,从1到4比初始文本的长度少。因此,如果您有一个长度为10的字符串,则以下内容将返回{1,2,3,4,5,6}。此后,下面的公式将被称为 rowlist 。我使用R1C1表示法来避免潜在的循环引用。

ROW(INDIRECT("R1C[1]:R"&(LEN(A1)-4)&"C[1]",FALSE))

接下来,我们将使用该数组将文本拆分为5个字母块的数组并测试每个块。正在进行的测试是预先设置" 1"并附加" .1"然后验证块是数字。前置和后置消除了空格或小数的可能性。然后我们可以检查之前的角色和之后的角色,以确保它们不是数字。此后,下面的公式将被称为 isnumarray

NOT(ISERROR(("1"&MID(A1,rowlist,5)&".1")*1))
*ISERROR(MID(A1,rowlist+5,1)*1)
*ISERROR(MID(A1,rowlist-1,1)*1)

接下来,我们需要通过从 rowlist 公式的副本返回当前索引并为非匹配返回一个大数字来查找字符串中的第一个有效5位数字。然后我们可以使用MIN函数来获取第一个匹配项。以下将称为 minindex

MIN(IF(isnumarray,rowlist,9999999999))

最后,我们需要获取从MIN函数返回的索引处开始的数字字符串。

MID(A1,minindex,5)

答案 1 :(得分:2)

以下UDF将返回字符串中的前五位数字,包括任何前导零。如果您需要检测是否有超过五位数的数字,则修改是微不足道的。如果没有五位数字,它将返回#VALUE!错误。

Option Explicit
Function FiveDigit(S As String, Optional index As Long = 0) As String
    Dim RE As Object
Set RE = CreateObject("vbscript.regexp")
With RE
    .Pattern = "(?:\b|\D)(\d{5})(?:\b|\D)"
    .Global = True
        FiveDigit = .Execute(S)(index).submatches(0)
End With
End Function

正如您从Mark和我之间的讨论中看到的那样,您的一些规范尚不清楚。但是如果你想排除十进制数,当小数部分有五位数时,我上面代码中的正则表达式应该改变:

.Pattern = "(?:\d+\.\d+)|(?:\b|\D)(\d{5})(?:\b|\D)"

答案 2 :(得分:0)

我刚刚为你写了这个UDF,基本但是会这样做......

它会在字符串中找到前5个连续的数字,非常粗略的错误检查所以它只是说如果有什么不对的错误

Public Function GET5DIGITS(value As String) As String
    Dim sResult As String
    Dim iLen As Integer
    sResult = ""
    iLen = 0

    For i = 1 To Len(value)       
        If IsNumeric(Mid(value, i, 1)) Then
            sResult = sResult & Mid(value, i, 1)
            iLen = iLen + 1
        Else
            sResult = ""
            iLen = 0
        End If
        If iLen = 5 Then Exit For
    Next

    If iLen = 5 Then
        GET5DIGITS = Format(sResult, "00000")
    Else
        GET5DIGITS = "Error"
    End If
End Function