Y1YFrkMD.rar
(1.81 KB, 下载次数: 143)
附件中只有三个单元格,一个是源数据单元格A1,一个公共的一个辅助单元格,用作循环变量B1,另一个自然是结果单元格C1,功能就是提取A1单元格中的中文字符。 在工具-选项-重新计算中设置重新计算次数适当大(大于A列最大字符数的两倍)可以用公式=max(len(data))计算出最大的字符串长度N,其中data=offset($a$1,,,counta(a:a)).是名称定义。 A1:提取单元格中的中文zifu,把*&等符号去出 B1:=IF(B1>MAX(LEN(data))-1,0,B1+1),B1的值就在[0,N]之间变换,递增,然后到N时再变成0。数组公式,ctrl+shift+enter C1:=IF(B1=0,IF(LEN(C1)<>SUM(--(CODE(MID(A1,ROW(INDIRECT("1:"&LEN(A1))),1))>4000)),A1,C1),IF(CODE(MID(A1,MIN(LEN(A1),B1),1))<5000,SUBSTITUTE(C1,MID(A1,MIN(LEN(A1),B1),1),""),C1)) 这个有点复杂. 先用自然语言表述一下: B1单元格一直在循环变化[0,N],递增。 如果B1为0(相当于初始态,或者阶段性初始态) 那么再判断C1单元格是否完成了对A1单元格的中文字符提取, 如果完成了,那么C1单元格保持不变; 如果没有完成(这个情况可能是A1单元格又被修改了,或者确实刚开始处理),那么把C1再初始化为A1;这里很重要的一点就是把A1传递到C1的实现。 如果B1不为0 那么判断A1单元格的第B1位的字符是否不是中文字符 如果不是中文字符,那么把该字符在C1单元格中替换掉,替换为空 如果是中文字符,那么保持当前的C1.这样在一个完整的B1从0-N循环中确保了C1中只剩下了A1中的中文字符。而这个时候即使B1又变成了0,由于C1已经完成了提取的任务将保持不变。 ====================================================================== 写递代公式开始会有点无从下手的感觉,不过多写几次就会习惯的,而且比较简单。只要把自然逻辑变成公式就行了。 首先需要一个循环变量,这个可以用一个单元格从[0,n]自循环实现,差不多都是:=IF(B1>N-1,0,B1+1)的样子. 很重要的一个功能是要实现传递功能,因为递代的实现特点是对自身单元格的引用,所以要把待处理的单元格先传递到公式单元格,作为一个初始态。 第二个部分就是核心公式,核心公式其实就是一个重复操作的一个完整的中间片段,这里调用的单元格是自身,从而完成递代。 最后一个环节就是保持阶段,当公式单元格满足最终目标要求的时候就应该保持。 好好体会这几点,然后多尝试一下,我想他能成为一种旁门利器,呵呵。对不会VBA的同学是个福音。 =============================================================================== 所以可以套用这个模式,一个是自循环单元格B1,一个主公式:IF(B1=0(初始态),if(判断是否递代完成,保持功能,传递功能),一个重复运算的中间一个完整循环片段) ================================================================================ 关于循环的引用的另一个主题帖,推荐一下,呵呵
[此贴子已经被作者于2008-1-19 10:41:09编辑过] |