excel公式技巧获取指定区域中2个及以上连续数值并按顺序排列

如题所述

给定单元格区域A1:D5(其中每个单元格中都是整数,并且在该单元格区域内是唯一的),使用单个公式生成一个数组,该数组由该区域中所有连续的数值组成,连续的数值至少包含两个,且返回的数组中的元素按从小到大的顺序排列。

图1

也就是说,可以返回结果:

{1;2;3;12;13;14;15;16;17;36;37}

也可以返回结果:

{1,2,3,12,13,14,15,16,17,36,37}

注意,所给出的公式应包含最少的字符;在公式中必须同时包含行列引用,不允许全是列引用(如A:D)或行引用(如1:5);公式中不允许使用名称。

先不看答案,自已动手试一试。

公式

公式1:

=MODE.MULT(SMALL(A1:D5,ROW(A1:A20)),IF(COUNTIF(A1:D5,A1:D5+1)+COUNTIF(A1:D5,A1:D5-1),A1:D5))

使用了91个字符。

公式2:

=MODE.MULT(IFERROR(SMALL(IF(COUNTIF(A1:D5,A1:D5+1)+COUNTIF(A1:D5,A1:D5-1),A1:D5),ROW(A1:A20))*{1,1},””))

使用了103个字符。

尝试通过同时评估两个COUNTIF构造来缩短此公式构造-并消除了对IFERROR子句的需要,但最终比上述公式稍长一些,有105字符,即公式3:

=MODE.MULT(IF(MMULT(COUNTIF(A1:D5,SMALL(A1:D5,ROW(A1:A20))-{1,-1}),{1;1}),{1,1}*SMALL(A1:D5,ROW(A1:A20))))

或者公式4:

=MODE.MULT(IF(MMULT(COUNTIF(A1:D5,SMALL(A1:D5,ROW(A1:A20))-{1,-1}),{1;1}),SMALL(A1:D5,ROW(A1:A20))),A1:D5)

公式解析

由于我们想要从所给区域中返回一个数组,该数组由区域内至少两个连续的数值构成,因此,执行此操作的一种方法是针对区域内的每个值检查是否在该区域内还会发现比该值大1或小1的值。

这样,我们需要查看下面两种构造的结果:

COUNTIF(A1:D5,A1:D5+1)

COUNTIF(A1:D5,A1:D5-1)

由于我们要求对于每个值,其两个返回值中只有一个为非零值即可,因此可以通过简单地将上述构造加在一起,这等价于OR操作。于是,公式中的:

COUNTIF(A1:D5,A1:D5+1)+COUNTIF(A1:D5,A1:D5-1)

转换为:

{0,0,1,0;0,0,0,0;1,1,0,1;1,0,1,1;1,0,0,0}+{0,1,1,0;0,0,0,1;0,1,1,1;1,0,0,0;1,0,0,0}

结果为:

{0,1,2,0;0,0,0,1;1,2,1,2;2,0,1,1;2,0,0,0}

从中可以看出,元素0表示:在区域中未找到比要查找的值大1或小1的值。同样,元素1表示:在区域中找到了比要查找的值大1或小1的值。值2表示在区域中找到了比要查找的值大1的值和小1的值。因此:

IF(COUNTIF(A1:D5,A1:D5+1)+COUNTIF(A1:D5,A1:D5-1),A1:D5)

转换为:

IF({0,1,2,0;0,0,0,1;1,2,1,2;2,0,1,1;2,0,0,0},A1:D5)

得到:

{FALSE,17,14,FALSE;FALSE,FALSE,FALSE,37;12,15,3,2;13,FALSE,1,36;16,FALSE,FALSE,FALSE}

现在,我们已经生成了所需的值。但是,仍然存在两项工作要解决:按升序对它们进行排序以及删除任何非数字元素。

使用SMALL函数来完成排序操作:

SMALL(IF(COUNTIF(A1:D5,A1:D5+1)+COUNTIF(A1:D5,A1:D5-1),A1:D5),ROW(A1:A20))

转换为:

SMALL({FALSE,17,14,FALSE;FALSE,FALSE,FALSE,37;12,15,3,2;13,FALSE,1,36;16,FALSE,FALSE,FALSE},ROW(A1:A20))

转换为:

SMALL({FALSE,17,14,FALSE;FALSE,FALSE,FALSE,37;12,15,3,2;13,FALSE,1,36;16,FALSE,FALSE,FALSE},{1;2;3;4;5;6;7;8;9;10;11;12;13;14;15;16;17;18;19;20})

结果为:

{1;2;3;12;13;14;15;16;17;36;37;#NUM!;#NUM!;#NUM!;#NUM!;#NUM!;#NUM!;#NUM!;#NUM!;#NUM!}

通常,我们可能试图通过构造一个合适的数组传递给SMALL函数作为其参数k的值来缩小数组,然而,这里使用了MODE.MULT函数,更简洁。注意,这里使用的缩小数组的技术,当我们希望返回的元素在被处理的数组中出现的频率相等时才合适。此外,该频率必须至少为两倍,因为如果没有一个以上的值出现,那么MODE.MULT不会返回任何值。

因此,先与数组{1,1}相乘的原因是,当我们将SMALL构造(一个20行1列的数组)与数组{1,1}(一个1行2列的数组)相乘时,生成20行2列的数组,其每行中列的元素都是相同的。这样:

SMALL(IF(COUNTIF(A1:D5,A1:D5+1)+COUNTIF(A1:D5,A1:D5-1),A1:D5),ROW(A1:A20))*{1,1}

转换为:

{1;2;3;12;13;14;15;16;17;36;37;#NUM!;#NUM!;#NUM!;#NUM!;#NUM!;#NUM!;#NUM!;#NUM!;#NUM!}*{1,1}

结果为:

{1,1;2,2;3,3;12,12;13,13;14,14;15,15;16,16;17,17;36,36;37,37;#NUM!,#NUM!;#NUM!,#NUM!;#NUM!,#NUM!;#NUM!,#NUM!;#NUM!,#NUM!;#NUM!,#NUM!;#NUM!,#NUM!;#NUM!,#NUM!;#NUM!,#NUM!}

可以看出,我们已经成功地使每个元素的数量简单地翻了一倍,现在可以安全地将其传递给MODE.MULT函数。但是,我们先要消除这些错误值。像绝大多数函数一样,MODE.MULT函数不会处理包含此类错误值的数组。

这样,公式中的:

IFERROR(SMALL(IF(COUNTIF(A1:D5,A1:D5+1)+COUNTIF(A1:D5,A1:D5-1),A1:D5),ROW(A1:A20))*{1,1},””)

转换为:

IFERROR({1,1;2,2;3,3;12,12;13,13;14,14;15,15;16,16;17,17;36,36;37,37;#NUM!,#NUM!;#NUM!,#NUM!;#NUM!,#NUM!;#NUM!,#NUM!;#NUM!,#NUM!;#NUM!,#NUM!;#NUM!,#NUM!;#NUM!,#NUM!;#NUM!,#NUM!},””)

得到:

{1,1;2,2;3,3;12,12;13,13;14,14;15,15;16,16;17,17;36,36;37,37;””,””;””,””;””,””;””,””;””,””;””,””;””,””;””,””;””,””}

最后,将其传递给MODE.MULT函数:

MODE.MULT(IFERROR(SMALL(IF(COUNTIF(A1:D5,A1:D5+1)+COUNTIF(A1:D5,A1:D5-1),A1:D5),ROW(A1:A20))*{1,1},””))

转换为:

MODE.MULT({1,1;2,2;3,3;12,12;13,13;14,14;15,15;16,16;17,17;36,36;37,37;””,””;””,””;””,””;””,””;””,””;””,””;””,””;””,””;””,””})

得到:

{1;2;3;12;13;14;15;16;17;36;37}

小结

MODE.MULT函数的妙用!

温馨提示:内容为网友见解,仅供参考
无其他回答

excel公式技巧获取指定区域中2个及以上连续数值并按顺序排列
给定单元格区域A1:D5(其中每个单元格中都是整数,并且在该单元格区域内是唯一的),使用单个公式生成一个数组,该数组由该区域中所有连续的数值组成,连续的数值至少包含两个,且返回的数组中的元素按从小到大的顺序排列。图1 也就是说,可以返回结果:{1;2;3;12;13;14;15;16;17;36;37} 也...

excel单元格内有个位数和双位数的值,用公式如何提取并排列?
看过了 这个数据你想要提取出来 告诉你一个办法 采用分列的形式就做出来了 为了保证你的原始数据,你单独复制出来放在一边 我逐步截图你看

excel 表中如何筛选统计出同时符合2个或以上条件的组数
方法一:2003以下版本通过SUMPRODUCT条件计数 输入 =SUMPRODUCT((A2:A11=5784)*(B2:B11="播报"))方法二:2007以上版本通过COUNTIFS多条件计数 输入 =COUNTIFS(A:A,5784,B:B,"播报")

Excel 求公式提取指定区域数值,并在一行中排列出来。
ctrl shift enter

excel如何筛选一定范围的数值并填入指定位置?
EXCEL2021版,在F2中输入或复制粘贴下列公式 =IFERROR(TEXTJOIN(",",,FILTER($A2:$D2,($A2:$D2>=LEFT(F$1,FIND("-",F$1)-1)*1)*($A2:$D2<=RIGHT(F$1,LEN(F$1)-FIND("-",F$1))*1)*($A2:$D2<>""))),"")下拉填充,右拉填充 ...

excel中匹配存在两个或以上符合条件的项,请问如何将他们的返回值合并计...
第一个参数:Range为条件区域,用于条件判断的单元格区域。第二个参数:Criteria是求和条件,由数字、逻辑表达式等组成的判定条件。第三个参数:Sum_range 为实际求和区域,需要求和的单元格、区域或引用。当省略第三个参数时,则条件区域就是实际求和区域。criteria 参数中使用通配符(包括问号 (?) 和星号...

如何让Excel中的数值按指定的顺序排列?
在上一单元格写入1,下一单元格写入2,选中这两个单元格,点住右下角的小黑点,光标成黑十字形状时,点住左键下拉拖拽 方法四 在单元格写入1---编辑---填充---序列---产生在列---等差序列---步长为1---终止值写入你要的序列的最大值如写入1000---确定 方法五 单元格中写入公式 =ROW(A1)...

EXCEL表格选择区域中满足两个或两个以上条件后数值相加
答案是13不是19,公式如下:=SUMIF(C9:C17,"P8*",D9:D17)如图所示:

excel如何从一个表里面取数,并且自动排序
$1:$1000))=LARGE((Sheet1!$B$1:$B$1000+1\/ROW($1:$1000)),ROW(A1)))*ROW($1:$1000)),1)然后依次往下拉。在sheet2单元格B2填写上公式=VLOOKUP(A1,Sheet1!A:B,2,0) 依次往下拉就可以了。只要表格sheet1里边的成绩改变了,表格sheet2单元格的排序也会跟着改变的。

excel 如何统计某个区域内的两个字符串同时出现的次数?
1.原始数据区域为A1:A5,每个单元格中包含不同或相同的文本,要根据需求求某个字符或关键字在各单元格文本中出现的次数总和。2.首先,求“北京”出现的次数(整个单元格内容等于“北京”)。我们输入公式:=COUNTIF(A1:A5,"北京")结果返回1,因为源数据中只有A1单元格整个文本内容是“北京”。3....

相似回答
大家正在搜