ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

搜索
EH技术汇-专业的职场技能充电站 妙哉!函数段子手趣味讲函数 Excel服务器-会Excel,做管理系统 效率神器,一键搞定繁琐工作
HR薪酬管理数字化实战 Excel 2021函数公式学习大典 Excel数据透视表实战秘技 打造核心竞争力的职场宝典
让更多数据处理,一键完成 数据工作者的案头书 免费直播课集锦 ExcelHome出品 - VBA代码宝免费下载
用ChatGPT与VBA一键搞定Excel WPS表格从入门到精通 Excel VBA经典代码实践指南
查看: 6762|回复: 24

[Excel 函数与公式] [第42期]按出现顺序求出现的数字[已结]

[复制链接]

TA的精华主题

TA的得分主题

发表于 2008-12-1 19:48 | 显示全部楼层 |阅读模式
再来一个附加题.

1.答题前先请仔细阅读本版正式竞赛区运行规则说明.
2.请勿在跟贴中直接发答案(跟帖中如附答案一律不得分).
3.答案附件请以标准文件名格式发送至我的邮箱:willin2000@yahoo.cn

[ 本帖最后由 willin2000 于 2008-12-31 08:17 编辑 ]

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?免费注册

x

评分

2

查看全部评分

TA的精华主题

TA的得分主题

发表于 2008-12-2 22:08 | 显示全部楼层
占位,已发邮件。
重新更改一下。邮件再发,以这个为准。 279个字符。
好险!

答案(279个字符):
=LEFT(TEXT(SUM(RIGHT(LARGE(LARGE(TEXT(FIND({0,1,2,3,4,5,6,7,8,9},A1:A18&5^19),"[>"&LEN(A1:A18)&"]!111111")*10+COLUMN(A:J)-1+ROW(1:18)*10^4+COLUMN(A:J)*10^8,ROW(1:10)*18)-(11-ROW(1:10))*10^8,ROW(1:10)))*10^(ROW(1:10)-1)),REPT(0,10)),COUNT(1/COUNTIF(A1:A18,"*"&(ROW(1:10)-1)&"*")))

解法中构成一个含数字所在位置和该数字信息数字串的方式是,列位置&行位置&数字位置&存在数字.

列位置的作用是在确定哪一行最早出现了数字时,不要取得其他数字所在的行中,比如在展开的同一行中(即一个单元格里的数字)可能会出现2,也可能出现7.

在构成串时为了标记没有找到的数字,使用了TEXT(,"[>"&LEN...),使得没找到的话使得"行位置"放大,从而再求最近发现行时不会被首先取到(因为首先取最小值),即使如果有个数字不出现,被取到了,在用最后一个LARGE取数时,会被第一个取到,由于最后是*10^(ROW(1:10)-1)),这样首先被取到的数在使用SUM(..**10^(ROW(1:10)-1)))后会排在最后一个,这样用LEFT按出现的数字个数取舍时会舍去.(这里留下了一个痛,就是虽然位置是排好了,结果是在尾部,致使后面不能用RIGHT(0&SUM,如果能放在头部就好了)

TEXT(,"[>"&LEN...)技巧的目的是为了在生成串是减少判断(结合5^19来排错),这样就能减少嵌套,是这个答案的关键.

其中LARGE(信息数字串,ROW(1:10)*18)来取各列中最小的数字串,是取最小值的一种用法,比SAMLL(信息数字串,ROW(1:10)*18-17)少3个字符,但在这里使用没有优势,因为还要用-(11-ROW(1:10))*10^8来去除列信息,该公式比起-ROW(1:10)*18多了5个字符 因此直接用SMALL更方便,将LARGE(信息数字串,ROW(1:10)*18)-(11-ROW(1:10))*10^8改成SMALL(信息数字串,ROW(1:10)*18-17)-ROW(1:10)*10^8后公式总长反而可以减2个字符.

TEXT(..,REPT(0,10))是为了防止0在第一个出现时会被丢失的问题.
COUNT(1/COUNTIF(A1:A18,"*"&(ROW(1:10)-1)&"*")) 用来计算出现的个数. 是比较简练的方法,但还不够简洁.

其中还可以优化的有:
将SUM(...*10^(ROW(1:10)-1)) 改成 SUM(...*10^ROW(2:11))%; 或SUM(..*1O^ROW(1:10))
COLUMN(A:J)-1写成COLUMN(J:S);
!111111前的!是不需要的,而且可以用1!e6代替.
ROW(1:18)*10^4 写成ROW(1:18)/1%%
TEXT(SUM..,REPT(0,10))补位应该用10^10+SUM()%. 或者SUM()**10^ROW(1:10)让其多以为时,采用10^11+SUM()
COUNT(1/COUNTIF(A1:A18,"*"&(ROW(1:10)-1)&"*")) 改成COUNT(MATCH("*"&ROW(1:10)-1&"*",A:A,))

本思路下,可写成(241):
=MID(10^11+SUM(RIGHT(LARGE(SMALL(TEXT(FIND(COLUMN(A:J)-1,A1:A18&5^19),"[>"&LEN(A1:A18)&"]1!e6")/1%+COLUMN(J:S)+ROW(1:18)/1%%+COLUMN(A:J)*10^9,ROW(1:10)*18-17)-ROW(1:10)*10^9,ROW(1:10)))*10^ROW(1:10)),2,COUNT(MATCH("*"&ROW(1:10)-1&"*",A:A,)))

涉险过关,答案正确,公式也适用于全空的情况, 长度小于280个字符,得3分. -willin2000

[ 本帖最后由 willin2000 于 2008-12-27 12:17 编辑 ]

评分

1

查看全部评分

TA的精华主题

TA的得分主题

发表于 2008-12-3 09:45 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助

邮件也发了。同289个字符的答案!
2008-12-8 23:14


答案(289个字符):
=RIGHT(0&SUM(RIGHT(SMALL(--RIGHT(SMALL(COLUMN(A:J)*10^12+(FIND(COLUMN(A:J)-1,A1:A18&5^19)>LEN(A1:A18))*(10^11-ROW(1:18)*10^4)+ROW(1:18)*10^4+FIND(COLUMN(A:J)-1,A1:A18&5^19)*10+COLUMN(A:J)-1,ROW(1:10)*18-17),11),ROW(1:10)))*10^(10-ROW(1:10))),SUM(--(COUNTIF(A1:A18,"*"&ROW(1:10)-1&"*")>0)))

解法中构建的信息数字串同2楼冻豆腐,即列位置&行位置&数字位置&存在数字. 区别是将LEN拿到外面来,通过并联判断法(FIND>LEN)*(10^11-ROW(1:18)*10^4)+ROW(1:18)*10^4,一加一减使得找不到的行数最大,优点是将来尾部不再有不存在数字的信息,以便将来使用RIGHT,可以减少嵌套,缺点是还要加一个FIND来表示数字位置信息.

可以优化的有:
--RIGHT(..,11) 改成MOD(..,10^11)
SMALL(...,ROW(1:10)*18-17) 改成 LARGE(...ROW(1:10)*18
SMALL(...,ROW(1:10)))*10^(10-ROW(1:10)) 改成LARGE(...ROW(1:10))*1O^ROW(2:11)
ROW(1:18)*10^4 写成 ROW(1:18)/1%%
FIND(COLUMN(A:J)-1,A1:A18&5^19)*10+COLUMN(A:J)-1 改成FIND(COLUMN(A:J)-1,A1:A18&5^19)/1%+COLUMN(J:S)
SUM(--(COUNTIF(A1:A18,"*"&ROW(1:10)-1&"*")>0))改成SUM(N(COUNTIF(A1:A18,"*"&ROW(1:10)-1&"*")>0))

最终可写成(276,这也就是在280下加1分的原因,找到比较合适的算法得2分,优化得1分)
=RIGHT(0&SUM(RIGHT(LARGE(MOD(LARGE(COLUMN(A:J)*10^12+(FIND(COLUMN(A:J)-1,A1:A18&5^19)>LEN(A1:A18))*(10^11-ROW(1:18)/1%%)+ROW(1:18)/1%%+FIND(COLUMN(A:J)-1,A1:A18&5^19)/1%+COLUMN(J:S),ROW(1:10)*18),10^11),ROW(1:10)))*10^ROW(2:11))%,SUM(N(COUNTIF(A1:A18,"*"&ROW(1:10)-1&"*")>0)))

破解嵌套使用并联取代串联方向正确,一些地方可以优化. 答案正确,小于320个字符, 评2分. -willin2000

[ 本帖最后由 willin2000 于 2008-12-27 17:21 编辑 ]

评分

1

查看全部评分

TA的精华主题

TA的得分主题

发表于 2008-12-3 17:12 | 显示全部楼层
243字符,EXCEL2003,适用A列全空
已发,占位

答案(243个字符):
=RIGHT(SUM(RIGHT(SMALL(-(ROW(1:18)&TEXT((COUNTIF(OFFSET(A1,,,ROW(1:18)),"*"&COLUMN(A:J)-1&"*")=1)*FIND(COLUMN(A:J)-1,A1:A18&5^19),"[>"&LEN(A1:A18)&"]!0;[>]000;!0")&COLUMN(J:S)),ROW(1:13)))*10^ROW(2:14))%,COUNT(MATCH("*"&ROW(1:10)-1&"*",A:A,)))

本解法构建的信息数字串信息很少, 不过实现手段有点奇特.信息串为:行位置&数字位置&存在数字.
解决的方法是让数字位置的取得是条件筛选的结果,不必要数字位置的去除.
去除条件1是用变高区域计数法COUNTIF(OFFSET)=1,来排除不数字的位置(0信息)(COUNTIF()=0),并且去除第二次出现的位置(>1),这样只留下第一次出现数字和紧随其后不含数字的行.
去除条件2是找到的位置大于字符串长度,
这2个条件判断通过TEXT(... >len)使用串联进行,排除不含数字的含,使得产生的数字串只有那些含有数字的位置才有数字串ROW(1:18)&数字位置&COLUMN(J:S),这样就可以根据行和数字位置决定的顺序来求出数字.为了解决0的问题,SMALL多取几个数,使得0包含在中间,这是因为SMALL(-..)相当于取最大,多余的3个数会在最大行和列中产生,不可能是3个第一列(0列)的数字,或者说避免前面都是0的情况(全0时SUM求和的结果会丢失0)
COUNT(MATCH("*"&ROW(1:10)-1&"*",A:A,))用来计数,完全正确.

解法方向为构建尽可能少信息的数字串,以避免多次提取造成的多层嵌套,方向正确,细节优化得很漂亮到位, 只是外围判断解法略显复杂. 答案正确,少于248个字符,得4分. -willin2000

[ 本帖最后由 willin2000 于 2008-12-27 12:20 编辑 ]

评分

1

查看全部评分

TA的精华主题

TA的得分主题

发表于 2008-12-4 11:29 | 显示全部楼层
我也只会合并起来做,原来293字,现在多了3个单元格,恐怕要超300字了.
适用于缺少某一个数字或某几个数字的情况,算不算,要不要发邮件.

请注意答题要求4. -willin2000

最终没有收到你发出邮件答案.  -willin2000

[ 本帖最后由 willin2000 于 2008-12-27 12:21 编辑 ]

TA的精华主题

TA的得分主题

发表于 2008-12-5 18:33 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
willin2000版主的题的确有意思,先点位。
真着急,251字符。
突破248大关了,哈哈!

答案(240个字符):
=RIGHT(0&SUM(RIGHT(LARGE(IF(ISERROR(FIND(COLUMN(A:J)-1,A1:A18)/(MATCH("*"&COLUMN(A:J)-1&"*",A1:A18,)=ROW(1:18))),,ROW(1:18)*10^6+10*FIND(COLUMN(A:J)-1,A1:A18)+COLUMN(A:J)-1),ROW(1:10)))*10^ROW(2:11))%,COUNT(MATCH("*"&ROW(1:10)-1&"*",A:A,)))

这个解法的思路(似曾相识....总结时再提)同样也是没有构建复杂的数字信息串,避免多次提取造成嵌套较多的情况,信息串为:行位置&数字位置&存在数字,不过这个思路的另外一个优点是其他不符合条件的都是0,这样给提取组合提供了更大的空间和灵活性,可以集中精力搞建设了,本解法最后选择了比较简洁的RIGHT.

去除不符合条件的信息串的条件是, 用ISERROR(FIND..))去除不含0-9的行,用MATCH屏蔽重复的行(即在出现过后再出现的行),由于第二个FIND中有NA,所以不便用*, 而用了IF. 其中用了一个技巧将两个条件合并,就是 MATCH=ROW 是要的数字,那1/MATCH=ROW就是不要的数字, FIND是要的数字,那ISERROR就是不要的, 所以可以合并两个错误(学过计算机的话,就知道这其实"与或"转换技巧).

其中的ISERROR可以用ISERR, 因为MATCH是NA的, FIND肯定是#VALUE!,而#VALUE!/#N/A的结果是#VALUE!,不是#N/A.
第一个MATCH("*"&COLUMN(A:J)-1&"*",A1:A18,),也可以用MATCH("*"&COLUMN(A:J)-1&"*",A:A,)

不改变思路的公式可以改为(233):
=RIGHT(0&SUM(RIGHT(LARGE(IF(ISERR(FIND(COLUMN(A:J)-1,A1:A18)/(MATCH("*"&COLUMN(A:J)-1&"*",A:A,)=ROW(1:18))),,ROW(1:18)*10^6+FIND(COLUMN(A:J)-1,A1:A18)/1%+COLUMN(J:S)),ROW(1:10)))*10^ROW(2:11))%,COUNT(MATCH("*"&ROW(1:10)-1&"*",A:A,)))

思路完全正确, 解法也很简洁. 答案正确,少于248, 得4分. -willin2000

[ 本帖最后由 willin2000 于 2008-12-27 12:22 编辑 ]

评分

1

查看全部评分

TA的精华主题

TA的得分主题

发表于 2008-12-6 21:46 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
很取巧的
243字符

因为以前邮箱发送会收不到,所以采取了短信发送

完全按要求的,297字符,实在没再向下减字符的思路了

270字符了

答案(270个字符):
=MID(SUM(RIGHT(LARGE(SMALL(IF(ISERR(FIND({0,1,2,3,4,5,6,7,8,9},A1:A18)),99^3,FIND(COLUMN(A:J)-1,A1:A18)*100+ROW(1:18)*10^4+COLUMN(A:J)-1)+COLUMN(A:J)*10^6,ROW(1:10)*18-17)-ROW(1:10)*10^6,ROW(1:10)))*10^ROW(1:10))+10^11,2,10-SUM(N(COUNTIF(A1:A18,"*"&ROW(1:10)-1&"*")=0)))

构建的信息数字串的方式是:列位置&行位置&数字位置&存在数字,在建立这个信息前先进行了预处理来避免更多的嵌套, ISERR(FIND(),99^3,) 这样找不到数的地方都被放了一个较大的行数(紧跟在列后),为SMALL取各列中的最小铺平道路.SMALL得到第一次结果后,为了去掉列信息,通常是使用MOD或RIGHT,但这样又会增加嵌套,所以不得已采用并联-ROW(1:10)*10^6的方式,再次利用99^3最大,LARGE()来按在行中的出现先后排序. 最后用RIHGT取数字,SUM合并,MID去掉多余的数字. 由于比2楼的信息串更复杂,所以没有使用TEXT(,REPT(0,10))部位,而使用+10^11,这样MID就能避免丢0.

其中:
10-SUM(N(COUNTIF(A1:A18,"*"&ROW(1:10)-1&"*")=0)) 不够优化. 参照上面的COUNTIF计数,应直接写为SUM(N(COUNTIF(A1:A18,"*"&ROW(1:10)-1&"*")>0))

原思路下,较短的公式为(258):
=MID(SUM(RIGHT(LARGE(SMALL(IF(ISERR(FIND({0,1,2,3,4,5,6,7,8,9},A1:A18)),99^3,FIND(COLUMN(A:J)-1,A1:A18)/1%+ROW(1:18)/1%%+COLUMN(A:J)-1)+COLUMN(A:J)*10^6,ROW(1:10)*18-17)-ROW(1:10)*10^6,ROW(1:10)))*10^ROW(1:10))+10^11,2,COUNT(MATCH("*"&ROW(1:10)-1&"*",A:A,)))

答案正确,少于280. 得3分. -willin2000

[ 本帖最后由 willin2000 于 2008-12-27 12:24 编辑 ]

评分

1

查看全部评分

TA的精华主题

TA的得分主题

发表于 2008-12-7 23:54 | 显示全部楼层
公式“高楼”搭了8层,单步执行可以实现了,但是不适应2003版本的了。
想了好久,继续努力中。。。。
汗,终于弄出个322字符的了,好艰难!
公式还是有问题,放弃罢

samsoncsr:
答案(322个字符):
=IF(CODE(INDEX(A:A,MATCH(1,N(A1:A18<>""),)))=48,0,)&SUM(RIGHT(LARGE((FREQUENCY(IF(MID(A1:A18,COLUMN(A:CV),1)="","",-MID(A1:A18,COLUMN(A:CV),1)),-LEFT(MID(A1:A18,COLUMN(A:CV),1)&0))>0)*(ROW(1:1801)*10+RIGHT(SMALL(COLUMN(A:CV)*10+ROW(1:19)*10^4+LEFT(MID(A1:A19,COLUMN(A:CV),1)&0),ROW(1:1801)))),ROW(1:50)))*10^(ROW(1:50)-1))

数字0处理错误,不得分. -willin2000

[ 本帖最后由 willin2000 于 2008-12-27 17:20 编辑 ]

TA的精华主题

TA的得分主题

发表于 2008-12-11 20:43 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
占位,已发邮件

答案(230个字符):
=IF(-LEFT(INDEX(A:A,MATCH("*",A:A,))),,0)&TEXT(SUM(RIGHT(LARGE(IF(ROW(1:18)=MATCH("*"&COLUMN(A:J)-1&"*",A1:A19&IF(ROW(1:19)=19,5^19),),ROW(1:18)*10^6+FIND(COLUMN(A:J)-1,A1:A18)/1%+COLUMN(A:J)-1,),ROW(1:10)))*10^ROW(2:11))%,"[>];")

公式取数思路与WDDN类似,也是构建信息行:位置&数字位置&存在数字,在排除不合要求的信息方面有相同之处,也有不同之处,相同的是都用了ROW(1:18)=MATCH("*"&COLUMN(A:J)-1&"*",..),不同之处在于这个解法将排除不含的行的条件直接放进了MATCH的参数之中,增加一行放5^19,使得MATCH的结果不会有错误值,并且让找到的行最大.优点是排除的条件花费少了13个字符,缺点是串联判断,多了一层嵌套.
后面的处理上采用了单独处理0的方式,可能是考虑嵌套的原因, 然而本解法下0值一起处理也是可以的.

IF(-LEFT(INDEX(A:A,MATCH("*",A:A,))),,0) 可以修改成IF(-LEFT(VLOOKUP("*",A:A,1,)),,0)

可以写成(221, 不适用全空):
=IF(-LEFT(VLOOKUP("*",A:A,1,)),,0)&TEXT(SUM(RIGHT(LARGE(IF(ROW(1:18)=MATCH("*"&COLUMN(A:J)-1&"*",A1:A19&IF(ROW(1:19)=19,5^19),),ROW(1:18)*10^6+FIND(COLUMN(A:J)-1,A1:A18)/1%+COLUMN(J:S),),ROW(1:10)))*10^ROW(2:11))%,"[>];")

0值一起处理(222个字符,适用全空)
=RIGHT(0&SUM(RIGHT(LARGE(IF(ROW(1:18)=MATCH("*"&COLUMN(A:J)-1&"*",A1:A19&IF(ROW(1:19)=19,5^19),),ROW(1:18)*10^6+FIND(COLUMN(A:J)-1,A1:A18)/1%+COLUMN(J:S),),ROW(1:10)))*10^ROW(2:11))%,COUNT(MATCH("*"&ROW(1:10)-1&"*",A:A,)))

思路方向正确, 答案正确,少于248个字符,得4分. -willin2000

评分

1

查看全部评分

TA的精华主题

TA的得分主题

发表于 2008-12-18 22:45 | 显示全部楼层
邮件已发

259 个字符, 初级水平,真的很困难,想了10几天,求助了10几天的贴,供侯版主和大家指教,谢谢!

答案(259个字符):
=SUBSTITUTE(SUM(RIGHT(0&MID(CONCATENATE(A1,A2,A3,A4,A5,A6,A7,A8,A9,A10,A11,A12,A13,A14,A15,A16,A17,A18),SMALL(FIND(ROW($1:$10)-1,CONCATENATE(A1,A2,A3,A4,A5,A6,A7,A8,A9,A10,A11,A12,A13,A14,A15,A16,A17,A18)&1023456789),ROW($1:$10)),1))*10^(1-ROW($1:$10))),".",)

不符合答题要求4, 不得分. -willin2000


看来看去,可以出现10000行的数据,但没有说不可以引用 A1:A18 呀,第4个要求我的也没有错呀,版主写的不够清楚,冤啊!

看来数组基础不够扎实,仍需努力呀!
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

手机版|关于我们|联系我们|ExcelHome

GMT+8, 2024-11-21 18:33 , Processed in 0.048764 second(s), 19 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

沪公网安备 31011702000001号 沪ICP备11019229号-2

本论坛言论纯属发表者个人意见,任何违反国家相关法律的言论,本站将协助国家相关部门追究发言者责任!     本站特聘法律顾问:李志群律师

快速回复 返回顶部 返回列表