来来,大神帮忙优化公式。
excel吧
全部回复
仅看楼主
level 7
魔界小童 楼主
今天看到百度知道上有一个朋友提出的问题,我就写了公式,不过太长了,不知道还能不能优化。
因为我用的office365最新版,这里面用的到函数是concat,用低版本的好像做不了。
=CONCAT(IF(ISNUMBER(FIND(ROW(INDIRECT(MIN(FILTERXML("<a><b>"&SUBSTITUTE(A5," ","</b><b>")&"</b></a>","//b"))&":"&MAX(FILTERXML("<a><b>"&SUBSTITUTE(A5," ","</b><b>")&"</b></a>","//b")))),CONCAT(FILTERXML("<a><b>"&SUBSTITUTE(A5," ","</b><b>")&"</b></a>","//b")))),ROW(INDIRECT(MIN(FILTERXML("<a><b>"&SUBSTITUTE(A5," ","</b><b>")&"</b></a>","//b"))&":"&MAX(FILTERXML("<a><b>"&SUBSTITUTE(A5," ","</b><b>")&"</b></a>","//b")))),"□"))
     “我走了。。”
     “我等你”
     “别傻了,等不来呢”
     “那便等不来!”
2017年08月09日 06点08分 1
level 9
与其给公式,不如给题目,大家集思广益。
2017年08月09日 07点08分 2
一群刁民还不快鼓掌
2017年08月09日 07点08分
@villain1004 .................
2017年08月09日 07点08分
题目已经给出来了啊,就是一个字符串,为“数字 数字 数字”格式的,两个数字中间有空格,求将数字中间的数字用方框或者空格补齐,如果“1 7 10”变成“1□□□□□7□□10”
2017年08月09日 07点08分
level 7
魔界小童 楼主
题目已经给出来了啊,就是一个字符串,为“数字 数字 数字”格式的,两个数字中间有空格,求将数字中间的数字用方框或者空格补齐,如果“1 7 10”变成“1□□□□□7□□10”
     天苍苍,野茫茫,一树梨花压海棠,
     车辚辚,马萧萧,二月春风似剪刀。
     红酥手,黄藤酒,两只黄鹂鸣翠柳,
     长亭外,古道边,一行白鹭上青天。~
2017年08月09日 07点08分 3
level 13
抛砖引玉。
=TEXTJOIN(REPT("口",TEXT(MMULT(IFERROR(--MID(SUBSTITUTE(A5," ",REPT(" ",99)),(ROW($1:$20)+{0,1})*99-98,99),),{-1;1})-1,"0;\0")),1,TRIM(MID(SUBSTITUTE(A5," ",REPT(" ",99)),ROW($1:$20)*99-98,99)))
2017年08月09日 07点08分 4
原来可以这样[啊]
2017年08月09日 07点08分
@夜辰无星 乱插[开心]
2017年08月09日 07点08分
@硫酸下 一开始想拿REPLACE来写的,但是想想多了的话就不行了
2017年08月09日 08点08分
@夜辰无星 那样不普适。刚才试了下楼主写的,我试了1 7 12出现错误。这个没有用row数组轻松拓展到负数。
2017年08月09日 08点08分
level 7
魔界小童 楼主
稍后我会把这个我的半残品公式和大神的公式整理出来,把解题思路写出来。@硫酸下
     “我走了。。”
     “我等你”
     “别傻了,等不来呢”
     “那便等不来!”
2017年08月10日 01点08分 5
level 7
魔界小童 楼主
我们先看大神的公式,作者@硫酸下
=TEXTJOIN(REPT("口",TEXT(MMULT(IFERROR(--MID(SUBSTITUTE(A5," ",REPT(" ",99)),(ROW($1:$20)+{0,1})*99-98,99),),{-1;1})-1,"0;\0")),1,TRIM(MID(SUBSTITUTE(A5," ",REPT(" ",99)),ROW($1:$20)*99-98,99)))
首先,我们先看这个公式涉及到的函数
TEXTJOIN 按条件合并数组内的字符
PERT 将字符连续重复N次
TEXT 格式化函数
MMULT 计算矩阵乘积
MID 从字符串第X个字符开始提取Y个字符
SUBSTITUTE 将字符串中的特定字符(字符串)替换为另外的特定字符(字符串)
ROW 提取单元格的函数
TRIM 删除字符串中的不可见字符
     “我走了。。”
     “我等你”
     “别傻了,等不来呢”
     “那便等不来!”
2017年08月10日 01点08分 7
level 7
魔界小童 楼主
这个题目不管采用什么解题方法都要将字符串中的数字单独提取出来
也就是将"1 7 10”提取为1/7/10,方便参与运算,计算中间的差值
这个帖子里面目前有两个方案
1个是@硫酸下 大神的
MID(SUBSTITUTE(A5," ",REPT(" ",99)),(ROW($1:$20)+{0,1})*99-98,99)
一个是我的
FILTERXML("<a><b>"&SUBSTITUTE(A5," ","</b><b>")&"</b></a>","//b")
其中硫酸下的公式里面用到了一个技巧,就是负负得正,因为不管是我们两个谁的公式,提取出来的都是文本型数字,所以要把它变为数值型数字,在EXCEL里面文本型数字参与运算后就会变为数值数字,所以这里让他计算两次负号。
硫酸下的公式
首先用REPT函数得到一串由99个空格组成的字符串,REPT(" ",99),将空格重复99次;
然后用SUBSTITUTE把“1 7 10”中的空格替换为99个空格;
利用ROW(1:20)得到一个数组{1;2;3;4;5;6;7;8;9;10;11;12;13;14;15;16;17;18;19;20}
此处的将这个数组+{0,1}是将这个数组变为一个二维数组,如图
将这些数字分别乘以99,在减去98,得到{1,100;100,199;199,298.......}的数组(这是一个二维数组,注意数组中的逗号和分号,详细信息请百度)
然后将我们最开始处理好的那个字符串拿出来(就是已经把1个空格替换为99个空格之后的那个),通过MID函数从第一个开始提取提取99个,再从第100个字符开始提取提取99个。。。。
然后我们就已经得到一个
{1空格空格(一共98个空格),空格7空格空格(一共97个空格);空格7空格空格},空格空格10空格空格(一共96个空格);空格空格10空格空格(一共96个空格),空格。。。。。}这个数组,
然后通过负负得正转换为{1,7;7,10;10," ";" "," "........}字符串,其实这会这个数组的空格因为参与计算,所以已经变为错误值。通过iferror函数将错误值转换为0,
结果就是{1,7;7,10;10,0;0,0;0,0;0,0;0,0;0,0;0,0;0,0;0,0;0,0;0,0;0,0;0,0;0,0;0,0;0,0;0,0;0,0}
在来说说我那个
FILTERXML("<a><b>"&SUBSTITUTE(A5," ","</b><b>")&"</b></a>","//b")
我这个首先用SUBSTITUTE将“1 7 10”中的空格替换为</b><b>;
变为"1</b><b>7</b><b>10",然后在前面加上<a><b>,后面加上</b></a>;
这会如果不算FILTERXML函数的话,字符串是"<a><b>1</b><b>7</b><b>10</b></a>"
学过HTML的应该都认识这段字符了吧;
然后通过filterxml函数将他处理为{1;7;10}数组。
     “我走了。。”
     “我等你”
     “别傻了,等不来呢”
     “那便等不来!”
2017年08月10日 03点08分 8
level 13
你的公式也最好改一下,单纯正数测试1 7 12或者6 12 18也出现了错误。
=CONCAT(IF(ISNUMBER(FIND(
" "&ROW(INDIRECT(MIN(FILTERXML("<a><b>"&SUBSTITUTE(A6," ","</b><b>")&"</b></a>","//b"))&":"&MAX(FILTERXML("<a><b>"&SUBSTITUTE(A6," ","</b><b>")&"</b></a>","//b"))))
&" ",
" "&A6&" ")),ROW(INDIRECT(MIN(FILTERXML("<a><b>"&SUBSTITUTE(A6," ","</b><b>")&"</b></a>","//b"))&":"&MAX(FILTERXML("<a><b>"&SUBSTITUTE(A6," ","</b><b>")&"</b></a>","//b")))),"□"))
2017年08月10日 03点08分 9
谢谢大神指导,加一个空格就能把非连续的识别出去了
2017年08月10日 04点08分
1