现在需要一种方法来区分这4对,等价于:
{0,0}:该对中的两个都是数字
{1,0}:该对中第一个是非数字,第二个是数字
{0,1}:该对中第一个是数字,第二个是非数字
{1,1}:该对中的两个都是非数字
显然,我们感兴趣的是中间的两对,因为这告诉我们字符串中数字与非数字的交界点 。为此,将得到的由0/1组成的数组乘以一个由两个元素(2和1)组成的1行2列的数组 。这样,公式转换为:
MMULT({2,0;0,0;0,1;2,0;0,0;0,0;0,0;0,1;2,1;2,0;0,0;0,0;0,0;0,1;2,0;0,0;0,1;2,0;0,0;0,1;2,1;2,1;2,1;2,1},{1;1})
得到:
{2;0;1;2;0;0;0;1;3;2;0;0;0;1;2;0;1;2;0;1;3;3;3;3}
数组中的0-3对应于上述四对组合 。例如,得到3的唯一方式是1加2,而乘以{2,1}后得到由1和2组成的数组的对是{1,1},其中的值都是非数字,因此3代表的都是非数字;值2来源于{2,1}乘以{1,0},代表非数字后跟着一个数字;值1来源于{2,1}乘以{0,1},代表数字后跟着一个非数字,等等 。
因此,Arry2后生成的数组让我们可以知道字符串中的字符从数字变为非数字或者从非数字变为数字的位置 。
3. 现在来看看单元格B1中的公式:
=IFERROR(0+MID(“α” & $A1& “α0″,1+SMALL(IF(Arry2=2,Arry1),COLUMNS($A:A)),SUM(SMALL(IF(ISNUMBER(MATCH(Arry2,{1,2},0)),Arry1),2*COLUMNS($A:A)+{-1,0})*{-1,1})),””)
看看这里传递给MID函数的两个参数 。要提取的字符串的起始位置参数start_num:
1+SMALL(IF(Arry2=2,Arry1),COLUMNS($A:A))
可以看到,我们基于Arry2等于2创建了一个数组,对应着由非数字字符和数字字符组成的对,即:
1+SMALL(IF({2;0;1;2;0;0;0;1;3;2;0;0;0;1;2;0;1;2;0;1;3;3;3;3}=2,{1;2;3;4;5;6;7;8;9;10;11;12;13;14;15;16;17;18;19;20;21;22;23;24}),COLUMNS($A:A))
转换为:
1+SMALL(IF({TRUE;FALSE;FALSE;TRUE;FALSE;FALSE;FALSE;FALSE;FALSE;TRUE;FALSE;FALSE;FALSE;FALSE;TRUE;FALSE;FALSE;TRUE;FALSE;FALSE;FALSE;FALSE;FALSE;FALSE},{1;2;3;4;5;6;7;8;9;10;11;12;13;14;15;16;17;18;19;20;21;22;23;24}),COLUMNS($A:A))
转换为:
1+SMALL({1;FALSE;FALSE;4;FALSE;FALSE;FALSE;FALSE;FALSE;10;FALSE;FALSE;FALSE;FALSE;15;FALSE;FALSE;18;FALSE;FALSE;FALSE;FALSE;FALSE;FALSE},COLUMNS($A:A))
可以看到,生成的数组中的数值1、4、10、15、18分别为指定字符串中每个数字的起始位置 。在B1中,COLUMNS函数返回1,公式可转换为:
1+SMALL({1;FALSE;FALSE;4;FALSE;FALSE;FALSE;FALSE;FALSE;10;FALSE;FALSE;FALSE;FALSE;15;FALSE;FALSE;18;FALSE;FALSE;FALSE;FALSE;FALSE;FALSE},1)
结果为(因为我们事先在A1中的字符串之前添加了一个字符):
2
对于传递给MID函数的获取要提取的字符数的参数num_char:
SUM(SMALL(IF(ISNUMBER(MATCH(Arry2,{1,2},0)),Arry1),2*COLUMNS($A:A)+{-1,0})*{-1,1})
我们对Arry2中的值1或2感兴趣,因为它们对应着字符串中的非数字/数字对 。
要确定提取的每个子字符串的长度,需要计算每个连续的非数字/数字和数字/非数字的间隔之间的字符数,因为它们代表每组连续数字的开始和结束位置 。将Arry2值代入后,上述公式转换为:
=SUM(SMALL(IF(ISNUMBER(MATCH({2;0;1;2;0;0;0;1;3;2;0;0;0;1;2;0;1;2;0;1;3;3;3;3},{1,2},0)),Arry1),2*COLUMNS($A:A)+{-1,0})*{-1,1})
转换为:
=SUM(SMALL(IF(ISNUMBER({2;#N/A;1;2;#N/A;#N/A;#N/A;1;#N/A;2;#N/A;#N/A;#N/A;1;2;#N/A;1;2;#N/A;1;#N/A;#N/A;#N/A;#N/A}),Arry1),2*COLUMNS($A:A)+{-1,0})*{-1,1})
转换为:
=SUM(SMALL(IF({TRUE;FALSE;TRUE;TRUE;FALSE;FALSE;FALSE;TRUE;FALSE;TRUE;FALSE;FALSE;FALSE;TRUE;TRUE;FALSE;TRUE;TRUE;FALSE;TRUE;FALSE;FALSE;FALSE;FALSE},Arry1),2*COLUMNS($A:A)+{-1,0})*{-1,1})
代入Arry1的值:
=SUM(SMALL(IF({TRUE;FALSE;TRUE;TRUE;FALSE;FALSE;FALSE;TRUE;FALSE;TRUE;FALSE;FALSE;FALSE;TRUE;TRUE;FALSE;TRUE;TRUE;FALSE;TRUE;FALSE;FALSE;FALSE;FALSE},{1;2;3;4;5;6;7;8;9;10;11;12;13;14;15;16;17;18;19;20;21;22;23;24}),2*COLUMNS($A:A)+{-1,0})*{-1,1})
推荐阅读
- excel从字符串中提取数字——数字位于字符串末尾
- excel将所有数字提取到单个单元格
- excel在主工作表中汇总多个工作表中满足条件的值
- excel公式技巧之强制返回数组的公式技术
- excel图表怎么使用公式排序
- 如何使用360浏览器将整个页面下载保存 使用360浏览器将整个页面下载保存的教程
- excel数据透视表怎么填充不重复的随机整数
- excel图表怎么从列表中返回满足多个条件的数据
- excel图表统计至少在一列中满足条件的行数
- 从excel图表字符串中提取指定长度的连续数字子串