楼主 toby08 |
一、问题的提出 A1单元格有这样一个文本:1230*007*93946*193 在B1:E1实现如下图效果 处理这种问题,我们有一个公式(也可以说是模板)可套用: =TRIM(MID(SUBSTITUTE(A1,"*",REPT(" ",X)),{1,1+X,1+2X,1+3X},X)) 这里X的取值选择15和14分别试验一下。 选择B1:E1单元格输入以下公式: =TRIM(MID(SUBSTITUTE(A1,"*",REPT(" ",15)),{1,16,31,46},15)),并按Ctrl+Shift+Enter三键结束,结果如下 合乎要求 但如果把上面公式改为: =TRIM(MID(SUBSTITUTE(A1,"*",REPT(" ",14)),{1,15,29,43},14)) 出错了??? 为什么15和14只是一步之遥,却有截然不同的结果呢? |
2楼 toby08 |
二、问题分析 =TRIM(MID(SUBSTITUTE(A1,"*",REPT(" ",X)),{1,1+X,1+2X,1+3X},X)) 这个公式神奇之处在哪里? 下面我们对这个公式进行剖析,看看它是如何工作的。 首先,SUBSTITUTE(A1,"*",REPT(" ",X))用多个空格替代*的过程必然产生了一些对过程有用但对结果无用的多余空格,所以最后我们仍需借用TRIM去掉这些空格。也可以这么说,公式的核心部分为红色的那一段。 为了方便讨论,跟开始A1文本内容类似,假设A1单元格有一文本,它被3个“*”这个“特殊符号”隔成4段。这里用M1代表第1个*之前的字符数,M2代表第1个*和第2个*之间的字符数,M3代表第2个*和第3个*之间的字符数,M4代表第3个*和第4个*之间的字符数。(当然,M1、M2、M3、M4是大于1的正整数,不然就没有讨论的意义了。) SUBSTITUTE(A1,"*",REPT(" ",X)) 得到如下图(绿色框住的部分)结果 进行区间划分: [1,M1] [M1+X+1,M1+X+M2] [M1+X+M2+X+1, M1+X+M2+X+M3] [M1+X+M2+X+M3+X+1, M1+X+M2+X+M3+X+M4] MID函数截取到的区间为: [1,X] [1+X,2X] [1+2X,3X] [1+3X,4X] 为了确保我们能正确获取到需要的文本块,则有如下关系: 1≤1≤M1≤X …………① 1+X≤M1+X+1≤M1+X+M2≤2X …………② 1+2X≤M1+X+M2+X+1≤M1+X+M2+X+M3≤3X …………③ 1+3X≤M1+X+M2+X+M3+X+1≤M1+X+M2+X+M3+X+M4≤4X …………④ 由①、②、③、④,有:X≥M1+ M2+ M3+ M4 |
3楼 toby08 |
三、小结 其实我们很容易就联想下去,对于n-1个分隔符“*”我们有: 至此,我们知道这个X也是有一个最小值的,不管怎样,X是不能比这个最小值更小了,否则就会出错。即:XMin=LEN(SUBSTITUTE(A1,"*",)) 不过对于大多数情况,我们通常只要取X=99就够用了,而不必在意X到底能有多小(因为我们始终可以取到一个相对比较大的数,这样就很“保险”了)。 本文只是对一开始提出的公式的核心参数作一个探讨而已,可能还有不完善的地方,望大家不吝指教! |
4楼 toby08 |
自己先补充说明两点: 一、为不失一般性,上述分析是在假定X为正整数的前提下进行的。因为若没有这一假定,对于1230*007*93946*193来说,用规划求解的方法可以求出一些比15还要小的小数出来,比如说X取13.666677154541、13.6667241210938、13.666725、13.6668076171875、13.666974609375这些特殊值时,仍可实现要求的。 二、X也是有最大值限制,即是说X不能也不必要非常大。 |
5楼 水星钓鱼 |
好贴。忍不住顶下。 |
6楼 laoyebin |
确实好贴,好久木有函数了,复习一下 不过还是split函数方便,呵呵 |
7楼 herenqing |
好贴。忍不住顶下。 |
8楼 yzcyzc1023 |
谢谢分享。 |
9楼 gouweicao78 |
没曾想toby08兄先发此帖了,而且对X的值算这么精确,呵呵。我直接用LEN来代替了,省得记: 【公式解析系列】之数据按分隔符“分列”函数解法 http://www.exceltip.net/thread-2188-1-1.html |
10楼 xiongkehua2008 |
這個公式其實在實際操作會經常用到,以前只知用,原理沒有深究過,看過此貼印象列深了... |
11楼 monvzhilei |
风兄居然也来参战了。 |
12楼 杏花雨V翟 |
XMin=LEN(SUBSTITUTE(A1,"*",)) 这个计算很精彩啊 |
13楼 wangqilong1980 |
谢谢分享,收藏学习 |
14楼 stevehai |