Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Excel公式练习38: 求一列中的数字剔除掉另一列中的数字后剩下的数字

Excel公式练习38: 求一列中的数字剔除掉另一列中的数字后剩下的数字

作者头像
fanjy
发布于 2020-02-26 06:07:19
发布于 2020-02-26 06:07:19
3.7K0
举报
文章被收录于专栏:完美Excel完美Excel

导语:继续研究来自于excelxor.com的案例。这个案例看似简单,然而实现起来却比较难,这里面用到的技巧值得学习。

本次的练习是:如下图1所示,在单元格区域A2:A12和B2:B12中给定两列数字,要在列C中从单元格C2开始生成一列数字。规则如下:

1. 列B中的数字的数量要小于等于列A中数字的数量。

2. 列B中的任意数字都可以在列A中找到。

3. 在列A或列B已存放数字的单元格之间不能有任何空单元格。

4. 在列C中的数字是从列A中的数字移除列B中的数字在列A中第一次出现的数字后剩下的数字。

5. 换句话说,列B和列C中的数字合起来就是列A中的数字。

图1

在单元格D1中的数字等于列A中的数字数量减去列B中的数字数量后的值,也就是列C中数字的数量。

现在,要在单元格C2中编写一个公式,然后下拉至单元格C12,得到如上图1所示的结果。

那么,如何编写这个公式呢?

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

公式

在单元格C2中输入数组公式:

=IF(ROWS($1:1)>$D$1,"",SMALL(IF(1-ISNUMBER(MATCH(List1+(COUNTIF(OFFSET(INDEX(List1,1,1),Arry1,,Arry2,),List1)/10^6),List2+(COUNTIF(OFFSET(INDEX(List2,1,1),Arry1,,Arry2,),List2)/10^6),0)),List1),ROWS($1:1)))

向下拖拉至单元格C12。

公式解析

这个案例中,存在的最大障碍是列表中的值有重复,如果能够消除这个障碍,那么就好办了。公式的思路就是构造一个数组,能够实现在List1和List2之间执行MATCH函数查找时,列C中的数值就是找不到的值,返回FALSE。

然而,实现起来并不是想像中的那么简单。我们必须首先确保生成的值是唯一的,并且仍然可以通过某种方式与原始值相对应,从而提取出原始值。

公式中的List1、List2、Arry1和Arry2是定义的四个名称。

名称:List1

引用位置:=$A$2:$A$12

名称:List2

引用位置:=$B$2:$B$12

名称:Arry1

引用位置:=ROW(List1)-MIN(ROW(List1))

名称:Arry2

引用位置:=ROWS(List1)-ROW(List1)+MIN(Row(List1))

在单元格D1中,使用下面的公式确定列C中要返回的数字数量:

=COUNT(List1)-COUNT(List2)

1. 在公式中IF子句的第一部分:

IF(ROWS($1:1)>$D$1,""

非常直观,如果公式向下拖放后ROWS函数的值大于7,则返回空。

重点在IF子句的第二部分,即其判断条件为FALSE的部分。

2. 看看公式中的COUNTIF函数部分:

COUNTIF(OFFSET(INDEX(List1,1,1),Arry1,,Arry2,),List1)

其中:

(1)INDEX(List1,1,1)

返回对List1中的第1个单元格的引用,示例中为单元格A2。

(2)OFFSET函数中的参数rows和height分别是Arry1和Arry2。现在看看这两个名称。

对于Arry1:

=ROW(List1)-MIN(ROW(List1))

转换为:

{2;3;4;5;6;7;8;9;10;11;12}-MIN({2;3;4;5;6;7;8;9;10;11;12})

转换为:

{2;3;4;5;6;7;8;9;10;11;12}-2

得到:

{0;1;2;3;4;5;6;7;8;9;10}

对于Arry2:

=ROWS(List1)-ROW(List1)+MIN(Row(List1))

转换为:

11-{2;3;4;5;6;7;8;9;10;11;12}+MIN({2;3;4;5;6;7;8;9;10;11;12})

转换为:

11-{2;3;4;5;6;7;8;9;10;11;12}+2

得到:

{11;10;9;8;7;6;5;4;3;2;1}

(3)现在,上述COUNTIF函数部分变为:

COUNTIF(OFFSET(A2,{0;1;2;3;4;5;6;7;8;9;10},,{11;10;9;8;7;6;5;4;3;2;1},),List1)

可以看到,传递了两个含有11个值的数组分别作为OFFSET函数的rows参数和height参数,这意味着我们给COUNTIF函数传递了11个单独的单元格区域。

第一个区域通过单元格A2偏移0行为起点、高度为11行组成,即为单元格A2:A12;第二个区域通过单元格A2偏移1行为起点、高度为10行组成,即为单元格A3:A12;第三个区域为A4:A12;第四个区域为A5:A12;依此类推,第11个区域为单元格A12。

对应于这11个单元格区域中的每个区域,传递给COUNTIF函数的第2个参数criteria是Arry1中11个数组元素相应位置的值,因此,上述COUNTIF函数部分实际上执行下列公式运算:

=COUNTIF(A2:A12,A2)

=COUNTIF(A3:A12,A3)

=COUNTIF(A4:A12,A4)

=COUNTIF(A12:A12,A12)

得到数组:

{2;1;1;3;2;1;2;1;1;2;1}

这里,我们已成功生成一系列数值,可帮助我们来区分List1中相同的数字。

3. 此时,公式中的部分:

List1+(COUNTIF(OFFSET(INDEX(List1,1,1),Arry1,,Arry2,),List1)/10^6)

转换为:

List1+({2;1;1;3;2;1;2;1;1;2;1}/10^6)

转换为:

List1+({0.000002;0.000001;0.000001;0.000003;0.000002;0.000001;0.000002;0.000001;0.000001;0.000002;0.000001})

转换为:

{1;1;2;3;3;3;4;4;5;6;6}+({0.000002;0.000001;0.000001;0.000003;0.000002;0.000001;0.000002;0.000001;0.000001;0.000002;0.000001})

结果为:

{1.000002;1.000001;2.000001;3.000003;3.000002;3.000001;4.000002;4.000001;5.000001;6.000002;6.000001}

虽然只是将List1中的各个数字增加了非常小的数字,但构成的数组中的每个元素都是唯一的。例如,在原来的List1中有三个3,现在变成了3.000001、3.000002和3.000003。

注意,这里区分这些List1中数字的小增量不只是随机的,相反,它们将计数每个元素的数量。例如,如果在生成的数组中整数部分为3的最大值为3.000003,那么我们知道List1中应该恰好有3个元素3。类似地,该数组中整数部分为2的最大值为2.000001,这告诉我们List1中只有1个元素1。

4. 在List2中执行相同的操作:

List2+(COUNTIF(OFFSET(INDEX(List2,1,1),Arry1,,Arry2,),List2)/10^6)

转换为:

{1;3;3;6;0;0;0;0;0;0;0}+(COUNTIF(OFFSET($B$2,{0;1;2;3;4;5;6;7;8;9;10},,{11;10;9;8;7;6;5;4;3;2;1},),{1;3;3;6;0;0;0;0;0;0;0})/10^6)

转换为:

{1;3;3;6;0;0;0;0;0;0;0}+({1;2;1;1;0;0;0;0;0;0;0}/10^6)

最后得到的结果为:

{1.000001;3.000002;3.000001;6.000001;0;0;0;0;0;0;0}

这样,将原来List2中的元素转换成了由唯一值构成的数组。

5. 现在,可以使用MATCH函数来比较这两个数组。IF语句中为FALSE的部分:

SMALL(IF(1-ISNUMBER(MATCH(List1+(COUNTIF(OFFSET(INDEX(List1,1,1),Arry1,,Arry2,),List1)/10^6),List2+(COUNTIF(OFFSET(INDEX(List2,1,1),Arry1,,Arry2,),List2)/10^6),0)),List1),ROWS($1:1))

可以转换为:

SMALL(IF(1-ISNUMBER(MATCH({1.000002;1.000001;2.000001;3.000003;3.000002;3.000001;4.000002;4.000001;5.000001;6.000002;6.000001},{1.000001;3.000002;3.000001;6.000001;0;0;0;0;0;0;0},0)),List1),ROWS($1:1))

转换为:

SMALL(IF(1-ISNUMBER({#N/A;1;#N/A;#N/A;2;3;#N/A;#N/A;#N/A;#N/A;4}),List1),ROWS($1:1))

转换为:

SMALL(IF(1-{FALSE;TRUE;FALSE;FALSE;TRUE;TRUE;FALSE;FALSE;FALSE;FALSE;TRUE},List1),ROWS($1:1))

转换为:

SMALL(IF({1;0;1;1;0;0;1;1;1;1;0},{1;1;2;3;3;3;4;4;5;6;6}),ROWS($1:1))

转换为:

SMALL({1;FALSE;2;3;FALSE; FALSE;4;4;5;6; FALSE },ROWS($1:1))

返回数字:

1

这正是我们需要的。

单元格C3中的公式会转换为:

SMALL({1;FALSE;2;3;FALSE; FALSE;4;4;5;6; FALSE },ROWS($1:2))

返回数字:

2

依此类推。

本案例关键技术:将统计数分配给单元格区域中的每个值,有效地将含有重复值的单元格区域中的值变成唯一值,这是一项很有用的技术。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-02-16,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 完美Excel 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Excel公式练习39: 求字符串中的数字组成的数能够被指定数整除的数的个数
导语:继续研究来自于excelxor.com的案例。这个案例比较复杂,需要仔细研究。
fanjy
2020/02/26
1.7K0
Excel公式练习37: 找到和的加数(增强版)
导语:继续研究来自于excelxor.com的案例。在《Excel公式练习36:找到和的加数》中,讲解了一个公式,可以标出指定和的加数,然而,如果有几种组合都可以得到这个和数,该公式只能标出其中一种组合,本文讲解的公式就来解决这个问题,将所有的组合都标出来。
fanjy
2020/02/14
1.1K0
Excel公式练习37: 找到和的加数(增强版)
Excel公式技巧14: 在主工作表中汇总多个工作表中满足条件的值
我们可能熟悉使用INDEX、SMALL等在给定单列或单行数组的情况下,返回满足一个或多个条件的值的列表。这是一项标准的公式技术。
fanjy
2020/03/12
9.6K0
Excel公式练习36: 找到和的加数
导语:继续研究来自于excelxor.com的案例。太有才了!多的不说,有兴趣的朋友往下看。
fanjy
2020/02/18
8080
Excel公式技巧17: 使用VLOOKUP函数在多个工作表中查找相匹配的值(2)
我们给出了基于在多个工作表给定列中匹配单个条件来返回值的解决方案。本文使用与之相同的示例,但是将匹配多个条件,并提供两个解决方案:一个是使用辅助列,另一个不使用辅助列。
fanjy
2020/03/12
14.8K0
Excel公式练习44: 从多列中返回唯一且按字母顺序排列的列表
导语:继续研究来自于excelxor.com的案例。这个案例似乎又有点复杂,但其中许多公式技术仍值得我们反复琢磨。
fanjy
2020/02/29
4.5K0
Excel公式练习40: 从单元格区域的字符串中提取唯一值
导语:继续研究来自于excelxor.com的案例。坚持到现在的,应该都有感觉了!
fanjy
2020/02/26
2.3K0
Excel公式技巧44: 对文本进行排序
在《Excel公式技巧39: COUNTIF函数在文本排序中的应用》中,我们使用COUNTIF函数来求得单元格区域中文本的顺序号,然后根据该顺序号获得相应的文本,从而实现文本排序。本文不使用辅助列,直接使用一个数组公式来获得排序文本。
fanjy
2020/08/04
4K0
Excel公式技巧44: 对文本进行排序
Excel公式练习49: 获取指定区域中2个及以上连续数值并按顺序排列
导语:继续研究来自于excelxor.com的案例。建议结合本文阅读原文,会了解更多的细节,会有更大的收获。
fanjy
2020/03/12
8040
Excel公式练习54: 判断素数,并将不是素数的数分解为素数的乘积
导语:继续研究来自于excelxor.com的案例。建议结合本文阅读原文,会了解更多的细节,会有更大的收获。
fanjy
2020/03/25
7500
Excel公式练习54: 判断素数,并将不是素数的数分解为素数的乘积
社群答疑精选01:不重复数据统计——如何统计员工负责的客户数?
初次看到这个问题,我以为很简单,但在Alpha发来示例数据工作表后,才觉得普通的公式难以解决,因为员工对应的客户存在重复,例如“员工2”对应的“客户2”就有3条重复数据。这给这个问题增加了不小的难度!
fanjy
2020/08/04
1.6K0
社群答疑精选01:不重复数据统计——如何统计员工负责的客户数?
Excel公式技巧43:OFFSET函数应用技巧
OFFSET函数是我们经常会用到的一个函数,能够以某单元格为基点,偏移得到指定位置的单元格或者单元格区域。其语法为:
fanjy
2020/08/04
1.4K0
Excel公式技巧43:OFFSET函数应用技巧
Excel公式技巧13: 从字符串中提取数字——将所有数字提取到单个单元格
前三篇文章分别讲解了提取位于字符串开头和末尾的数字的公式技术、提取字符串中所有的数字并放在不同的单元格中的公式技术,本文研究从字符串中提取所有数字并将这些数字作为单个数字放置在单个单元格中的技术。
fanjy
2020/03/16
2.7K0
精通Excel数组公式011:令人惊叹的SUMPRODUCT函数
本文主要探讨什么时候使用SUMPRODUCT函数更有效,而什么时候应该使用SUMIFS函数代替SUMPRODUCT函数。
fanjy
2020/09/17
6.4K0
精通Excel数组公式011:令人惊叹的SUMPRODUCT函数
36条常用Excel技巧 收藏备用!
1、两列数据查找相同值对应的位置 =MATCH(B1,A:A,0) 2、已知公式得结果 定义名称=EVALUATE(Sheet1!C1) 已知结果得公式 定义名称=GET.CELL(6,Sheet1!C1) 3、强制换行 用Alt+Enter 4、超过15位数字输入 这个问题问的人太多了,也收起来吧。一、单元格设置为文本;二、在输入数字前先输入' 5、如果隐藏了B列,如果让它显示出来? 选中A到C列,点击右键,取消隐藏 选中A到C列,双击选中任一列宽线或改变任一列宽 将鼠标移到到AC列之间,等鼠标变为双竖线
CDA数据分析师
2018/02/24
3.5K0
精通Excel数组公式021:提取唯一值列表并排序
本文将综合使用前面系列中学习到的技术,包括布尔逻辑、动态单元格区域、提取满足条件的数据、统计唯一值等,创建出一个解决问题的大型公式。当然,如果你不需要自动动态更新数据,完全可以使用Excel内置的高级筛选或数据透视表功能。
fanjy
2021/03/12
5.3K0
精通Excel数组公式022:提取唯一值列表并排序(续)
下图12展示了两个对数字进行排序的公式。使用SMALL/ROWS函数从小到大排序,使用LARGE/ROWS函数从大到小排序。
fanjy
2021/03/12
5.5K0
Excel公式技巧19: 在方形区域内填充不重复的随机整数
本文分享一个基于公式生成n×n随机整数的解决方案,并且每个整数都是唯一的。例如,下图1显示了生成10行10列的不重复随机整数。
fanjy
2020/03/16
1.1K0
Excel公式练习42: 统计句子中满足条件的单词个数
导语:继续研究来自于excelxor.com的案例。这个案例应用了前面分享的一些公式技巧,值得反复学习。
fanjy
2020/02/26
1.5K0
Excel公式练习58: 获取与查找值相对应的多个值
导语:本文所讲的案例在第一季公式练习中有相似的例子,这里再巩固一下。只要知道要在公式中使用的函数,没有Excel解决不了的问题!
fanjy
2020/04/22
2.9K0
推荐阅读
相关推荐
Excel公式练习39: 求字符串中的数字组成的数能够被指定数整除的数的个数
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档