【问题标题】:EXCEL VBA: extracting 8 digits sequence from a string in cellEXCEL VBA:从单元格中的字符串中提取8位数字序列
【发布时间】:2016-03-14 01:11:58
【问题描述】:

大家好,

我正在尝试找到一种从单元格中提取 8 位数字(唯一 ID)的智能解决方案。这里出现的问题可能是这样的:

112, 65478411, sale
746, id65478411, sale 12.50
999, 65478411
999, id65478411

这是大多数情况,可能都提到了,所以我基本上需要在单元格中找到8位数字并将它们提取到不同的单元格中。有没有人有任何想法?我虽然消除了第一个字符,然后检查单元格是否以 id 开头,进一步消除它,但我知道这不是聪明的方法..

感谢您的见解。

【问题讨论】:

  • instr for "," 然后从那里为 8 做一个left
  • 总是第四个数字,即前面总是有逗号的三位数字吗?
  • “取决于填写电子表格的人” - 不寒而栗。这意味着他们可以对单元做任何事情,并且不能应用任何逻辑或规则。限制他们可以输入的内容。让他们将 ID 输入到不同的单元格并使用数据验证。
  • 我怀疑你可以使用正则表达式和在这个高度赞成的答案中描述的一些说明使用匹配模式,例如`[0-9]{8,8}:stackoverflow.com/questions/22542834/…
  • @pnuts 就像一个魅力。我相信我会采用您的解决方案,因为我认为这很简单。如果有的话,我仍然会检查基于宏的解决方案。非常感谢。

标签: string vba excel extract


【解决方案1】:

这里有一个替代方案:

=RIGHT(TRIM(MID(SUBSTITUTE(A1,",",REPT(" ",LEN(A1))),LEN(A4),LEN(A1))),8)

用与字符串长度重复的空格替换所有逗号,

然后从原字符串的长度开始取中点为字符串的长度(即新字符串中的第二个单词)

去掉空格

取正确的 8 个字符来删除任何多余的字符(如 id)

【讨论】:

    【解决方案2】:

    试试这个公式:

    =--TEXT(LOOKUP(10^8,MID(SUBSTITUTE(A1," ","x"),ROW(INDIRECT("1:"&LEN(A1)-7)),8)+0),"00000000")
    

    这将返回字符串中的 8 位数字。

    然后只返回文本:

    =TEXT(LOOKUP(10^8,MID(SUBSTITUTE(A1," ","x"),ROW(INDIRECT("1:"&LEN(A1)-7)),8)+0),"00000000")
    

    【讨论】:

    • @pnuts 在我构建它时,我想确保捕获任何前导零,然后我想我需要将它改回一个数字。我一直在添加直到它起作用。然后太过分了。 :)
    【解决方案3】:

    你也可以写一个UDF来完成这个任务,下面的例子

    Public Function GetMy8Digits(cell As Range)
    Dim s As String
    Dim i As Integer
    Dim answer
    Dim counter As Integer
    
    'get cell value
    s = cell.Value
    
    'set the counter
    counter = 0
    'loop through the entire string
    For i = 1 To Len(s)
        'check to see if the character is a numeric one
        If IsNumeric(Mid(s, i, 1)) = True Then
            'add it to the answer
            answer = answer + Mid(s, i, 1)
            counter = counter + 1
            'check to see if we have reached 8 digits
            If counter = 8 Then
                GetMy8Digits = answer
                Exit Function
            End If
         Else
         'was not numeric so reset counter and answer
         counter = 0
         answer = ""
        End If
    Next i
    End Function
    

    【讨论】:

    • 我不确定一篇帖子的去向,但我已经使用了名为“extracteight”的那个功能......不过还是谢谢!
    • @user3812753 好的,很高兴您正在使用其他解决方案,但我想指出,如果我没记错的话,其他解决方案正在检查 IsNumeric 的 8 个字符块,因此 6547.8411 将返回 true .我这样做的原因是,如果它遇到一个时期,它就会失败。因此 6547.8411 不会作为您的 8 位数字返回。 - 我知道 6547.8411 是 9 位数字,但我想显示完整的数字,以减轻任何人回来说数字不正确......希望这是有道理的
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-04
    • 1970-01-01
    • 1970-01-01
    • 2019-01-15
    • 1970-01-01
    • 2018-06-04
    相关资源
    最近更新 更多