【问题标题】:Extract numeric portion from an alphanumeric string in Excel 2010从 Excel 2010 中的字母数字字符串中提取数字部分
【发布时间】:2019-09-06 02:15:16
【问题描述】:

我想从 Excel 中的字母数字字符串中提取所有数字。我有一个包含字母数字字符串列表的 excel 表,如下所示,我想从字母数字字符串中提取所有数字并将其存储在一个新单元格中

我已经尝试过在网上找到的以下公式,但它输出'6',但它不正确,所以有人可以帮我吗?

SUM(MID(0&A2,LARGE(ISNUMBER(-- 
MID(A2,ROW(INDIRECT("1:"&LEN(A2))),1))*ROW(INDIRECT("1:"&LEN(A2))),
ROW(INDIRECT("1:"&LEN(A2))))+1,1)*10^ROW(INDIRECT("1:"&LEN(A2)))/10)

我希望这个字符串的输出:

eed1e11bd1a66cb47ad8b215c882194cdf964332484d20c56aea69e6e5196f67

成为:

1111664782158821949643324842056696519667

请注意,我希望仅通过 Excel 执行此操作。最好是一些函数而不是宏。

【问题讨论】:

  • 我将通过用户定义的函数进行正则表达式函数。看到这个帖子:stackoverflow.com/questions/22542834/…
  • @FrankBall 正则表达式只能与 VBA 一起使用吗?
  • @FrankBall 我只是在看最后一行说宁愿不使用宏。

标签: excel excel-formula numeric alphanumeric


【解决方案1】:

A1中的数据,在B1中输入数组公式:

=MID(SUMPRODUCT(--MID("01"&A1,SMALL((ROW($1:$300)-1)*ISNUMBER(-MID("01"&A1,ROW($1:$300),1)),ROW($1:$300))+1,1),10^(300-ROW($1:$300))),2,300)

甚至这个数组公式(在 Excel 365 中可用)

=TEXTJOIN("",TRUE,IF(ISNUMBER(--MID(A1,ROW(INDIRECT("1:"&LEN(A1))),1)),MID(A1,ROW(INDIRECT("1:"&LEN(A1))),1),""))

数组公式必须使用 Ctrl + Shift + Enter 而不仅仅是 Enter 键。如果正确执行此操作,公式将在公式栏中显示并带有花括号。

【讨论】:

  • 不错,只是TEXTJOIN()函数在Excel 2010中将不可用,Excel对数字的科学记数法也会有问题。
  • 仅供参考 TEXTJOIN 在 Excel 2013 中不可用。
【解决方案2】:

去基础和老学校和长篇大论:

=SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(LOWER(A2),"a",""),"b",""),"c",""),"d",""),"e",""),"f",""),"g",""),"h",""),"i",""),"j",""),"k",""),"l",""),"m",""),"n",""),"o",""),"p",""),"q",""),"r",""),"s",""),"t",""),"u",""),"v",""),"w",""),"x",""),"y",""),"z","")

基本上它会遍历并查找字母表中的每个字符并将其替换为 "" 它将保留为字符串以显示前导零。如果您希望将其作为数字,则不会显示前导零,您需要通过不会更改其值的数学运算发送字符串,例如:

--
+0
-0
*1
/1

LOWER 函数将字符全部转换为小写。它节省了两次替代。小写一次,大写一次。

CAVEAT:如果有特殊字符,例如 "!@#$%^&*()_+-=[]{}|:";'?, ./",当前公式将保持不变. 需要删除每个特殊字符的 SUBSTITUTE。对于“éìô”等字符也是如此

【讨论】:

  • 看看 Excel 如何处理(看起来像的文本)数字我认为如果 OP 想要避免 VBA,您的解决方案是我能看到的唯一选择。最后一位假定为数字,但超过 15 位时会被 Excel 弄乱。
  • OP注意事项:如果这些总是十六进制,就像给出的例子一样,那么你只需要替换“a”,“b”,“c”,“d”,“e "、"f",而不是字母表的其余部分
  • 您能否提及其他字符,例如:-,.,/,&,(,)
【解决方案3】:

看起来您只需要删除字母 a 到 f。如果是这种情况,这可能比处理所有可能字母的解决方案更快:

=SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(A1,"a",""),"b",""),"c",""),"d",""),"e",""),"f","")

【讨论】:

    【解决方案4】:

    这是一个使用数组公式的方法:

    =CONCAT(IFERROR(MID(A2,ROW(OFFSET($A$1,0,0,LEN(A2),1)),1)/1,""))
    

    从字面上将文本拆分为单个字符的数组,然后检查每个字符是否为数字(即是否可以除以 1)。

    如果不是,则该字符带有一个空字符串 (""),然后它会在最后将所有内容重新组合在一起。放入时记得使用Ctrl+Shift+Enter

    CONCAT,如TEXTJOIN 在 Excel 2010 或更早版本中不可用。)

    【讨论】:

      【解决方案5】:

      这是一个使用 REGEX 处理此问题的 UDF(通常是处理复杂字符串操作的最快方法)。它删除所有不是数字的内容并将其作为字符串返回。

      Function NumbersOnly(rng As Range)
       Dim nReturn As Variant
       With CreateObject("VBScript.RegExp")
              .Pattern = "[^0-9]"
              .MultiLine = True
              .Global = True
              nReturn = .Replace(rng.Value2, vbNullString)
          End With
          NumbersOnly = nReturn
      End Function
      

      如果您想要一个数字,只需将函数包装在“VALUE”函数中即可。

      =VALUE(NumbersOnly(A1))
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2017-07-30
        • 2016-04-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-01-20
        • 1970-01-01
        相关资源
        最近更新 更多