我需要帮助在 Excel 2010 中仅从一列到另一列提取 5 位数字。这些数字可以位于字符串的任何位置(字符串的开头、中间的任何位置或末尾)。它们可以在括号或引号内,例如:
(15478) 或“15478”或“15478”或 [15478]
我需要忽略任何小于 5 位的数字,包括以 1 个或多个前导零开头的数字(如 00052、00278 等),并确保将前导零复制到下一列。有人可以帮助我创建公式或 UDF 吗?
我需要帮助在 Excel 2010 中仅从一列到另一列提取 5 位数字。这些数字可以位于字符串的任何位置(字符串的开头、中间的任何位置或末尾)。它们可以在括号或引号内,例如:
(15478) 或“15478”或“15478”或 [15478]
我需要忽略任何小于 5 位的数字,包括以 1 个或多个前导零开头的数字(如 00052、00278 等),并确保将前导零复制到下一列。有人可以帮助我创建公式或 UDF 吗?
这是一个基于公式的替代方案,它将提取单元格 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)&".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]",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)
以下 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)"
我刚刚为你写了这个 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