excel公式教程: 求一列中的数字剔除掉另一列中的数字后剩下的数字
发布时间:2023-05-27 02:12:57
excel公式教程:如下图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
依此类推。
本案例关键技术:将统计数分配给单元格区域中的每个值,有效地将含有重复值的单元格区域中的值变成唯一值,这是一项很有用的技术。


猜你喜欢
- 本文介绍Microsoft Excel中LN函数的语法和用法。函数说明LN函数的主要作用是返回一个数的自然对数。自然对数以常数项 e (2.
- 有时单位为了自身形像宣传与交流,需要印制一些内部刊物。而在刊物的编辑过程中,为了版面美观、大方更具吸引力,甚至动用了专业的图型处理软件,如P
- 笔者常常会在摄影社区看到很多摄影爱好者问,到底微软最新的Windows 10(下简称Win10)正式版好不好用,该不该升级。而大多数人会认为
- 在win10正式版系统中许多用户会给账户设置密码,一定程序上保护系统安全,当然一些用户为了安全还想设置BIOS密码。那么Win10系统如何设
- 如何在微软Word文档中添加数字签名?在微软Word文档中签署文档是给文档添加个人标签的一种绝佳方式。在不同版本的Word软件中,添加签名行
- 1.打开需要繁简转换的Excel文档,选中需要转换的单元格内容2.点击工具栏的“审阅”,在审阅里我们就可以看到繁转简、简转繁或者是简繁转换的
- 昨天说了vlookup的各种用法,今天再来说下lookup的各种用法。lookup是一个很有用很强大的函数,值得你学会。-01-lookup
- 最近很多小伙伴在登录Steam社区市场的时候发现自己被限制,这导致很多小伙伴无法查看自己售卖的物品,那么遇到这种情况应该怎么办呢?下面就和小
- win7系统疑难解答0x80131700错误代码怎么解决?在用户遇到系统问题时,内置的疑难解答可以给用户提供很好的帮助,但是有的用户在打开疑
- 近日,Windows 10 Mobile发布了RTM正式版10586.11,而Win10 Mobile 10586升级后却出现无限重启,这种
- 一、保护整个工作表 在Excel 2003中,选择某个需要保护的工作表,单击菜单“工具→保护→保护工作表
- word打字后面的字会消失,覆盖后面的文字这种情况,出现这种情况一般是因为insert键或Word设置问题。可以看一下word最下方是插入还
- 磁盘调度在多道程序设计的计算机系统中,各个进程可能会不断提出不同的对磁盘进行读/写操作的请求。由于有时候这些进程的发送请求的速度比磁盘响应的
- Word 2007 通用快捷键身为Word老兵自然对Word快捷键背得滚瓜烂熟,Ctrl+S保存,Ctrl+A全选,Ctrl+X剪贴……等等
- 启动英雄联盟游戏的时候提示“您的游戏环境异常,请重启机器后再试”怎么办?打开LOL提示游戏环境异常如何解决?下面来看看具体解决方法。解决方法
- Win11打开文件夹卡顿怎么办?一些升级了Win11系统的朋友发现打开文件夹会卡顿,下面为大家带来解决的方法。1、双击打开此电脑2、点击此电
- 有时我们在Excel中制作的工作表需要反复修改,并保存为多个版本。修改的次数多了,很容易混淆。如果能把工作簿的最后保存日期和时间显示在工作表
- 路由器被限速了怎么办?路由器被限速了的话再连接路由器使用之后网速就非常慢,这让用户们非常头疼谁受的了网速慢的问题呢?所以需要解决路由器被限制
- 当电脑进入安全模式时,我们可以删除顽固文件、查杀病毒、解除组策略的锁定、卸载不正确的驱动等,因此很受人欢迎。今天小编和大家一起浅谈进入Win
- 如何使用天猫积分兑换购物券?天猫是一个网上购物平台,里面有非常多的商品可供用户选择。大家知道天猫积分是可以兑换购物劵的吗?若是不知道,今天就