You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Excel 2016提取单元格内1-3个数字的基础公式解决方案求助

Excel 2016提取单元格内1-3个数字的基础公式解决方案求助

嗨,我来帮你搞定这个Excel数字提取的问题!考虑到你用的是Excel 2016,没有LET()FILTER()这些新函数,我整理了几个纯基础公式的方案,既能准确提取1-3个1-99的数字,还能在缺失数字的位置自动填充-,分两种场景给你:


场景1:所有提取数字放在同一个单元格(空格分隔,缺失补-

在B2单元格输入下面的公式,输入完成后按Ctrl+Shift+Enter(这是数组公式,必须用这个组合键确认),然后下拉填充即可:

=TRIM(
    SUBSTITUTE(
        SUBSTITUTE(
            SUBSTITUTE(
                TEXTJOIN(" ",TRUE,
                    IFERROR(VALUE(MID(SUBSTITUTE(A2&" "," : ","|"),FIND("|",SUBSTITUTE(A2&" "," : ","|"))+1,ROW($1:$100))),""),
                    IFERROR(VALUE(MID(SUBSTITUTE(A2&" "," : ","|"),FIND("|",SUBSTITUTE(A2&" "," : ","|"))+ROW($1:$100),1)),""),
                    IFERROR(VALUE(MID(SUBSTITUTE(A2&" "," : ","|"),FIND("|",SUBSTITUTE(A2&" "," : ","|"))+ROW($1:$100),2)),"")
                )," "," - "),
            " -  - "," - "),
        " -  - "," - "
    )
)

公式逻辑

  1. 先把单元格里的:替换成|,方便精准定位冒号后的内容
  2. 遍历冒号后的每一个字符位置,尝试提取1位或2位的有效数字(自动过滤非数字内容)
  3. TEXTJOIN把提取到的数字拼接起来,再通过SUBSTITUTE把缺失的数字位置替换成-
  4. 最后用TRIM清理多余的空格

场景2:数字分别提取到3个独立单元格(缺失补-

如果你想把第一个数字放B2、第二个放C2、第三个放D2,用下面三个公式即可(直接回车,不需要数组输入):

提取第一个数字(B2):

=IFERROR(
    VALUE(
        MID(
            A2,
            MIN(FIND({0,1,2,3,4,5,6,7,8,9},A2&"0123456789",FIND(":",A2)+1)),
            IF(ISNUMBER(VALUE(MID(A2,MIN(FIND({0,1,2,3,4,5,6,7,8,9},A2&"0123456789",FIND(":",A2)+1))+1,1))),2,1)
        )
    ),
    "-"
)

提取第二个数字(C2):

=IFERROR(
    VALUE(
        MID(
            A2,
            MIN(FIND({0,1,2,3,4,5,6,7,8,9},A2&"0123456789",
                MIN(FIND({0,1,2,3,4,5,6,7,8,9},A2&"0123456789",FIND(":",A2)+1))+
                IF(ISNUMBER(VALUE(MID(A2,MIN(FIND({0,1,2,3,4,5,6,7,8,9},A2&"0123456789",FIND(":",A2)+1))+1,1))),2,1)
            )),
            IF(ISNUMBER(VALUE(MID(A2,MIN(FIND({0,1,2,3,4,5,6,7,8,9},A2&"0123456789",
                MIN(FIND({0,1,2,3,4,5,6,7,8,9},A2&"0123456789",FIND(":",A2)+1))+
                IF(ISNUMBER(VALUE(MID(A2,MIN(FIND({0,1,2,3,4,5,6,7,8,9},A2&"0123456789",FIND(":",A2)+1))+1,1))),2,1)
            ))+1,1)),2,1)
        )
    ),
    "-"
)

提取第三个数字(D2):

=IFERROR(
    VALUE(
        MID(
            A2,
            MIN(FIND({0,1,2,3,4,5,6,7,8,9},A2&"0123456789",
                MIN(FIND({0,1,2,3,4,5,6,7,8,9},A2&"0123456789",
                    MIN(FIND({0,1,2,3,4,5,6,7,8,9},A2&"0123456789",FIND(":",A2)+1))+
                    IF(ISNUMBER(VALUE(MID(A2,MIN(FIND({0,1,2,3,4,5,6,7,8,9},A2&"0123456789",FIND(":",A2)+1))+1,1))),2,1)
                ))+
                IF(ISNUMBER(VALUE(MID(A2,MIN(FIND({0,1,2,3,4,5,6,7,8,9},A2&"0123456789",
                    MIN(FIND({0,1,2,3,4,5,6,7,8,9},A2&"0123456789",FIND(":",A2)+1))+
                    IF(ISNUMBER(VALUE(MID(A2,MIN(FIND({0,1,2,3,4,5,6,7,8,9},A2&"0123456789",FIND(":",A2)+1))+1,1))),2,1)
                ))+1,1)),2,1)
            )),
            IF(ISNUMBER(VALUE(MID(A2,MIN(FIND({0,1,2,3,4,5,6,7,8,9},A2&"0123456789",
                MIN(FIND({0,1,2,3,4,5,6,7,8,9},A2&"0123456789",
                    MIN(FIND({0,1,2,3,4,5,6,7,8,9},A2&"0123456789",FIND(":",A2)+1))+
                    IF(ISNUMBER(VALUE(MID(A2,MIN(FIND({0,1,2,3,4,5,6,7,8,9},A2&"0123456789",FIND(":",A2)+1))+1,1))),2,1)
                ))+
                IF(ISNUMBER(VALUE(MID(A2,MIN(FIND({0,1,2,3,4,5,6,7,8,9},A2&"0123456789",
                    MIN(FIND({0,1,2,3,4,5,6,7,8,9},A2&"0123456789",FIND(":",A2)+1))+
                    IF(ISNUMBER(VALUE(MID(A2,MIN(FIND({0,1,2,3,4,5,6,7,8,9},A2&"0123456789",FIND(":",A2)+1))+1,1))),2,1)
                ))+1,1)),2,1)
            ))+1,1)),2,1)
        )
    ),
    "-"
)

公式逻辑
先找到冒号后第一个数字的起始位置,判断是1位还是2位数字,接着基于这个位置找下一个数字的起始位置,以此类推,找不到对应数字就返回-


另外看了你自己写的公式,确实只适配了恰好2个数字的场景,还加了90的阈值限制。如果需要保留这个阈值判断,只需要在上面公式的VALUE()外面套一层IF就行,比如IF(VALUE(...)>90,"No. 1",VALUE(...)),按需调整即可。

如果有什么细节需要修改或者有疑问,随时说哦!

备注:内容来源于stack exchange,提问作者user22200587

火山引擎 最新活动