巴蜀兄弟连吧 关注:60贴子:246
  • 6回复贴,共1

单元格内数字从小到大排序

只看楼主收藏回复

A列单元格内,有0-9任意数字,长度不等。现需对A列单元格内数字进行整理,使其自动排为B列效果(如图)

则可以在B1输入以下数组公式(公式A),下拖填充:
=TEXT(SUM(SMALL(--MID(A1,ROW(INDIRECT("1:"&LEN(A1))),1),ROW(INDIRECT("1:"&LEN(A1))))*10^(LEN(A1)-ROW(INDIRECT("1:"&LEN(A1))))),REPT(0,LEN(A1)))
公式解析:
首先,我们假定A1为802(三位数),来理解公式
当A1为三位数时,公式(公式B)应为
=TEXT(SUM(SMALL(--MID(A1,ROW(1:3),1),ROW(1:3))*10^(3-ROW(1:3))),"000")
{--MID(A1,ROW(1:3),1)}-----从左起分别取A1第1、2、3位数字8、0、2
{SMALL(--MID(A1,ROW(1:3),1),ROW(1:3))}-----将取出来的3个数字按从小到大排序为0、2、8
{10^(3-ROW(1:3))}-----得到10^2、10^1、10^0,也就是100、10、1
{SMALL(--MID(A1,ROW(1:3),1),ROW(1:3))*10^(3-ROW(1:3))}-------{0,2,8}与{100,10,1}对应相乘,分别得到0、20、8(注意,数字0的后继处理)
{SUM(SMALL(--MID(A1,ROW(1:3),1),ROW(1:3))*10^(3-ROW(1:3)))}---把得到的0、20、8求和,得到28(这是一个初步的结果)
现在,我们用到Text函数来将结果处理成3位数(公式原型应为text(28,"000")就得到028)
公式B只能处理3位数,现在,我们着手将该公式改成能处理任何长度的数字
首先,要用到的,当然是len用来取得A1的字长
改动一:
公式中1:3这个区域引用,我们要结合len、字符串连接符生成可变字符串,再用到indirect函数将该字符串转化为区域引用,即
indirect("1:"&len(A1))
因此,公式中的三处1:3均更换为indirect("1:"&len(A1))
改动二:10^(3此处的字长3,用Len(A1)代替,即10^(len(A1)
至此,公式主体已完成
{SUM(SMALL(--MID(A1,ROW(INDIRECT("1:"&LEN(A1))),1),ROW(INDIRECT("1:"&LEN(A1))))*10^(LEN(A1)-ROW(INDIRECT("1:"&LEN(A1)))))}
——此主体可以排序无0数字
改动三:为处理有0数字字符排序,我们需要用Text函数进行动态格式处理——即是说,格式参数"000"或“0000”或“000000”等需要根据A1的长度自动生成。这里,我们用到了REPT函数:
REPT(0,len(A1))-----可以根据A1的长度写相应个数的0来作为Text函数的格式参数
经以上步骤,我们得到最终公式
=TEXT(SUM(SMALL(--MID(A1,ROW(INDIRECT("1:"&LEN(A1))),1),ROW(INDIRECT("1:"&LEN(A1))))*10^(LEN(A1)-ROW(INDIRECT("1:"&LEN(A1))))),REPT(0,LEN(A1)))
要点回顾:
1、先针对某一特殊样本进行公式设计,再在公式上进行必要改动
2、用indirect+len+字符串连接处理,生成根据字长发生相应变化的区域引用
3、巧用Text+rept函数,动态处理有字符0的情况
若要实现单元格内数字从大到小排序,因可以不考虑前置0的情况,故公式仅需sum这一主体部分(Text可略去)
公式如下
=SUM(SMALL(--MID(A1,ROW(INDIRECT("1:"&LEN(A1))),1),ROW(INDIRECT("1:"&LEN(A1))))*10^(ROW(INDIRECT("1:"&LEN(A1)))-1))
注:本贴公式均为数组公式,须Ctrl+Shift+回车结束输入


1楼2013-07-30 01:26回复
    顶帖


    IP属地:湖北2楼2013-07-31 16:48
    回复
      2025-12-28 23:02:02
      广告
      不感兴趣
      开通SVIP免广告
      我顶,我顶,我顶顶顶!!!


      IP属地:上海3楼2013-08-09 11:50
      回复
        减点字符呵呵
        =TEXT(SUM(LARGE(--(0&MID(A1,ROW($1:99),1)),ROW(INDIRECT("1:"&LEN(A1))))*10^(ROW(INDIRECT("1:"&LEN(A1)))-1)),REPT(0,LEN(A1)))

        好像还可以再减
        =TEXT(SUM(LARGE(--(0&MID(A1,ROW($1:99),1)),ROW($1:99))*10^(ROW($1:99)-1)),REPT(0,LEN(A1)))


        IP属地:重庆4楼2014-07-07 16:34
        收起回复
          2025了
          =CONCAT(SORT(--REGEXP(A1,"."),,,1))


          IP属地:湖南6楼2025-08-15 09:30
          回复