Excel数组学习笔记
学习视频:
深圳则秀教育官方账号的个人空间-深圳则秀教育官方账号个人主页-哔哩哔哩视频
思维扩展
我们平时习惯以单个单元格为计算单元,而忽视了数组的存在。但实际上,我们早已在不知不觉中使用了数组。
在 Excel 中,任何数据区域(包括单个单元格)在计算时,都是以数组形式传递给函数的。以往我们习惯使用单个单元格作为参数,其实可以直接传入包含 n 行 n 列的数据区域,函数会逐元素进行处理。
注意,并非所有函数都支持数组运算。部分函数只接受单个值作为参数,但逻辑本质仍是对数据的逐项处理,只是受限于函数本身的特性。
“一片数据区域”就是数组:
当使用 =SUM(A1:A10) 时,A1:A10 就是一个 10行1列的单列数组。
当使用 =AVERAGE(B2:D5) 时,B2:D5 就是一个 4行3列的二维数组。
SUM 函数的作用,就是接收这个数组作为参数,然后遍历其中的每一个元素进行求和。
常量数组也是数组,比如 =SUM({1,2,3,4})。这里的 {1,2,3,4} 就是一个 1行4列 的常量数组。
单个单元格是数组的最小形态:单个单元格(如 A1)可以看作是一个 1行1列的数组。
所以,数组就是数据的集合,而单元格区域是数组最常见的存在形式。
数组的定义
其实数组就是一片数据区域,一个m行n列的数据集合。
在Excel中,数组的输入/生成形式可以为:手动输入、引用单元格区域、函数生成/返回结果
手动输入:选择一个单元格,输入以下的内容,注意,如果数组覆盖区域包括非空单元格,就会报错#溢出。
={1,2,3},={4;5;6},={1,2,3;4,5,6},
逗号是分列,分号是换行。
如果输入的是字符,就得加双引号,如={1,"A","ABCD",2}
引用单元格区域:就平时那样引用,编辑栏输入=后,鼠标选择一块单元格区域
函数生成/返回结果:一般是返回一个数组
数组的扩展
理解数组的扩展,是为了更好理解数组的计算。总结来说就是,数组之间的计算,必须扩展成一样的形状,不然会报错。扩展的规则就是,1可以扩展,m和n不能再扩展(m>1,n>1)
一维数组
单个单元格1×1
单个单元格,可以随意扩展,1×1扩展成m×n
m行1列(m×1)
1可以扩展成n,即一列扩展成多列,就是向右复制。
选中一片空白单元格区域,选中后在编辑栏输入等号,选中数组区域A4:A6,按下Ctrl + Shift + Enter;如图所示,延展的数组第四行是报错的,说明一维纵向数组只能横向扩展;一维纵向是几行,正确的扩展就是几行。
1行n列(1×n)
1可以扩展成m,即一行扩展成多行,就是向下复制。
同理,延展后第四列是报错的,说明一维横向数组只能纵向扩展
二维数组(m×n)
m×n,不能扩展
数组的计算
为什么使用数组计算?
对数据进行计算时,传统操作是输入公式,在单元格右下角点击左键,手动拖动填充公式,若公式需修改,必须重新拖动或批量替换。拖动可能覆盖已有数据,或遗漏新增行。整个操作维护很麻烦且容易出错。
使用数组计算,结果可以自动“溢出”到相邻区域,无需手动拖动。当 A1:A100 有新增数据时,B 列的计算结果会自动更新。整个区域只需一个公式,修改维护更简单,效率更高。
计算逻辑
当两个数组直接运算(+ - * /),Excel会按相同位置的元素一对一计算,要求两者行列数完全相同。就是必须变成一样的形状啦。
如果数组维度不同,Excel会自动扩展小数组以匹配大数组,但必须满足小数组是单列、单行、单个单元格的条件,二维数组不能扩展。若两个行列不匹配的二维数组直接运算,会报错。
算数运算(+ - * /)
相同行/列的一维数组
已知数量和单价,计算总价
不同行/列的一维数组
一维横向数组与一维纵向数组
一维数组与相同行/列数的二维数组
一维数组与不同行/列数的二维数组
相同行列的二维数组进行运算
不同行列的二维数组进行运算
比较运算(>, <, =, <>)
当对两个数组进行逻辑比较(如 >, <, =, <> )时,Excel 会执行逐元素对比,并返回一个由TRUE/FALSE (1/0)组成的布尔值数组。
同理,比较运算的两个数组维度必须一致,或者至少有一个是一维数组(单行或单列)或单个单元格,才会自动扩展。
**布尔逻辑运算
适用场景:统计或计算符合条件的数据项,尤其适合多个条件同时判断(多条件统计、求和、平均等)
表面上,最直观作用是替代IF函数,使公式更简洁、快捷;本质上,它是将逻辑判断直接生成可参与运算的 0/1 数组,使逻辑与数值运算结合更自然、高效。
学习布尔逻辑运算的重点在于理解逻辑本身,使用 IF 还是直接布尔表达式取决于个人习惯。
书写时注意:与运算用 *
,或运算用 +
并用 >0
强制布尔化,非运算用 NOT()
或 <>
,异或可用 (条件1+条件2=1)
,避免 OR 运算结果直接为 2 导致计算错误。
使用案例
现有如下数据表,并对每一列数据区域进行了命名。分别是Sales,Completed,Dept
与运算
1、先看需求
统计 销售部 中 完成任务且销售额大于10000 的员工奖金总额(假设奖金 = 月销售额 × 10%)。
所以,要找到满足三个条件的员工,并把他们的奖金相加。
2、拆解条件
分别把3个判断条件写出:
- 销售额大于10000,即(Sales>10000)
- 部门是销售部,即(Dept = "销售部")
- 已完成任务,即(Completed = "是")
3. 组合条件 – 使用与运算
三个条件必须 同时成立,因此使用与运算符 *
=(Sales>10000) * (Dept="销售部") * (Completed="是")
-
当三个条件都成立时,结果返回 1。
-
只要有一个条件不成立,结果就是 0。
4、奖金计算与求和
奖金计算公式:Sales * 0.1
只有当条件成立时才计算奖金,因此要乘上布尔表达式:
=(Sales>10000) * (Dept="销售部") * (Completed="是") * (Sales*0.1)
再用 SUM 函数把所有员工的结果加总:
=SUM((Sales>10000) * (Dept="销售部") * (Completed="是") * (Sales*0.1))
或运算
1、先看需求
统计 销售部中销售额>10000 或完成任务的员工 的奖金总额(奖金 = 月销售额 ×10%)
所以,要找到 至少满足其中一个条件 的员工,然后把他们的奖金加总。
2、拆解条件
分别把3个判断条件写出:
- 销售额大于10000,即(Sales>10000)
- 部门是销售部,即(Dept = "销售部")
- 已完成任务,即(Completed = "是")
3、组合运算
- 前提条件必须是销售部员工,这是一个必须成立的条件,所以用 与运算(*);
表达式:(Dept = "销售部") * .... - 销售部员工,只需满足销售额>10000 或完成任务其中一个,这是“二选一就可以”的条件,所以用 或运算(+);
表达式:(Sales>10000) + (Completed = "是") - 整体组合,将两个部分相乘,保证只统计销售部员工,且他们满足任意一个条件;
表达式:(Dept = "销售部") * ((Sales>10000) + (Completed = "是"))
4、奖金计算与求和
奖金公式仍然是 Sales*0.1,乘上条件结果,再用 SUM 汇总。
问题:
在使用或运算时,计算结果可能是 0、1、2。如果所有条件都满足,结果会返回 2,这时候直接乘奖金会计算错误。例如错误公式:
=SUM((Dept="销售部") * ((Sales>10000) + (Completed="是")) * Sales*0.1)
解决方法:需要把或运算的结果强制布尔化,使其返回 0 或 1,保证奖金计算正确。
方式:使用 >0
- 对或运算结果使用 >0 进行判断:
- 结果为 0 → 不大于 0 → 返回 0
- 结果为 1 或 2 → 大于 0 → 返回 1
修改公式:
=SUM((Dept="销售部") * (((Sales>10000) + (Completed="是"))>0) * (Sales*0.1))
最后结果正确:
异或和非
1、先看需求
统计 非市场部 员工中,销售额大于 10000 或已完成任务,但不能同时满足 的员工奖金总额。
2、拆解条件
- 员工不是市场部:(Dept<>"市场部") ;这是非运算
- 销售额大于 10000:(Sales>10000)
- 已完成任务:(Completed="是")
- 销售额>10000 与已完成任务 不能同时满足 → 异或(XOR)
- Excel 中实现异或逻辑:(Sales>10000) <> (Completed="是")
3、组合运算
- 先判断非市场部员工:(Dept<>"市场部")
- 再判断销售额>10000 异或 已完成任务:(Sales>10000) <> (Completed="是")
- 两个条件必须同时满足,所以用 与运算(*) 组合:
(Dept<>"市场部") * ((Sales>10000) <> (Completed="是"))
4、统计求和
员工奖金 = Sales*0.1
=SUM((Dept<>"市场部") * ((Sales>10000) <> (Completed="是")) * (Sales*0.1))
**数组运算规则
算数运算/比较/布尔逻辑运算规则
对数组进行各类运算时,得注意数据类型和计算规则,避免结果出错。
规则总结如下:
实际案例如图:
函数参数处理规
每个函数对传入参数的处理都有其独特规则,这些规则可能与普通运算符的行为不同。
绝不能想当然地认为一个函数的行为会和一个含义相似的运算符完全相同。必须查阅或通过测试了解每个函数自己独特的参数处理规则。
SUM和+运算
SUM 函数在直接对数组进行计算时,会忽略其中的逻辑值;唯一的例外是逻辑值作为直接参数传入 SUM 时,此时会被转换为 1 或 0 参与求和(SUM(TRUE,1)的结果为2)。而算术运算符 +
在所有情况下都会将逻辑值转换为 1 或 0 参与计算。
SUM和组合运算
如有数据如下:
SUM1的公式为:=SUM(数组1*数组2)
此公式的计算流程:计算数组1*数组2,相乘时把TRUE和FALSE视为1和0,空白视为0,产生中间数组={200,3,0,0}
SUM函数对中间数组进行求和,结果=200+3+0+0 = 203
SUM和SUMPRODUCT
两个公式的意义都为求数组1和数组2乘积结果的总和,但结果却不同。
SUM3公式为:=SUM(数组1*数组2),计算逻辑上面有写;
SUMPRODUCT公式为:=SUMPRODUCT(数组1,数组2),因为忽略了逻辑值
SUMPRODUCT函数参数处理规则:
-
与 SUM 类似,逻辑值在数组或区域中 → 被忽略
-
若逻辑值作为直接参数传入 → 转换为 1/0
总结
-
数据类型统一很重要,否则不同函数和运算符会有不同处理结果。
-
逻辑值、文本、空白在算术运算和函数中行为差异大,不能想当然。
-
使用公式前应明确:
-
要处理的值类型
-
是直接参数还是数组/区域
-
函数或运算符的处理规则
-
XLOOKUP
同时查找多个复合条件,使用 &
连接符创建复合查找键;
左侧为源数据表,右侧价格列为需要查找的内容,图示数据产品唯一标识为【品牌+类型】
可以将【品牌】和【类型】使用&连接符组合起来,公式如下:
=XLOOKUP(品牌&类型,源品牌&源类型,源价格)