1. 5.1小节:公式的第一课——等号、运算符和那个让人抓狂的$
1.1 运算符优先级:为什么括号比例不是永远最高
学Excel公式和函数,第一个认知必须是:所有公式都从等号开始。这不是废话,很多刚入门的朋友在单元格里输入sum(A1:A10),按下回车,Excel直接当文本显示,就是因为少了那个前导等号。我当时也干过这事,还以为自己公式写错了,折腾半天才发现只是差了一个字符。
等号后面的内容,就是一个表达式。表达式里的运算是按优先级来的,这一点和数学课上学的基本一致:括号优先、乘方次之、然后是乘除、加减。但Excel有个特殊的地方,它有三种引用运算符,优先级比算术运算符还高:冒号表示区域引用,空格表示两个区域的交集,逗号表示把多个区域联合起来。举一个我实际踩过的例子:
=SUM(A1:B10 C5:D15)这个公式的本意是“把A1到B10和C5到D15这两个区域加起来”,但中间如果用空格连接,含义就变成了“只计算两个区域的交叉部分”。如果两个区域没有交叉,公式会直接报#NULL!错误。所以,想同时求两个区域的合计,要么用逗号,要么老老实实把区域拆开:=SUM(A1:B10,C5:D15)。
另一个容易忽略的是连接符&。它的优先级比加减乘除都低,比比较运算符高。举个例子:
="1"&2+3结果是"15",不是"23"。因为Excel先算2+3=5,然后文本和数字拼接成“15”。如果我想得到“23”,必须写成:
="1"&(2+3)这种细节平时可能用不上,但一旦你在做“公式生成的报表标题”或者“动态提示语”的时候,&连接符的优先级就会跳出来坑你一次。我见过不止一个新人在做类似="本月销售"&B2+C2的公式时,发现数字结果完全对不上,其实就是没意识到&之后只连接了B2这一个值,C2根本没有参与拼接。
1.2 三种引用方式:复制填充时不希望它“乱跑”就得按F4
这一节是整个公式应用里最值钱的知识之一。Excel引用分三种:相对引用、绝对引用、混合引用。相对引用就是默认状态,公式往下拖的时候,单元格引用会跟着动。绝对引用就是加了$符号,行列都不动。混合引用则是固定行或者固定列。
这里我建议大家做一个小实验,几分钟就能彻底理解。在A1输入1、B1输入2,然后在C1输入:
=A1+B1把C1往下拖到C3,你会发现公式自动变成了=A2+B2、=A3+B3。这是因为相对引用会“跟随”目标位置变化。这很符合直觉,但问题是:当你需要引用一个固定的单元格时,比如税率、单价、折扣率,如果没有加$,往下填充后引用位置就会跑偏,结果就全错了。
我做工资表时就吃过这个亏。把“社保基数”写在G1单元格,然后在每一行的工资明细公式里引用=G1*E2,往下填充后,第二行变成=G2*E3,G2是空的,结果直接变0。后来我改成=$G$1*E2,问题瞬间解决。
混合引用的经典应用是做九九乘法表。在B1输入1到9,A2输入1到9,在B2输入:
=B$1&"×"&$A2&"="&B$1*$A2然后右下角填充,一个完整的九九乘法表就出来了。这里面的逻辑是:B$1固定第一行但列可以变化,$A2固定第一列但行可以变化。想清楚这一点,绝大多数填充类问题都能解决。
注意:按F4可以快速切换引用方式。在编辑公式时,光标停在某个引用上,按一次加全选
$,再按一次只锁行,再按一次只锁列,再按一次回到相对引用。这个快捷键用熟了,效率能翻倍。
1.3 跨表与跨工作簿引用:写错一个引号就报错
跨工作表引用的基本格式是=工作表名!单元格。比如Sheet2的A1单元格要引用Sheet1的B2,就直接写:
=Sheet1!B2但如果工作表名字里有空格、中文、特殊符号,或者名字以数字开头,就必须加单引号:
='1月销售报表'!B2这个细节特别容易踩坑。我原来在做一个多门店汇总表时,工作表命名为“5月-华东区”,直接写=5月-华东区!B2,Excel直接报错。后来想起来需要加单引号,改成='5月-华东区'!B2才算正常。跨工作簿引用更要注意,格式是=[工作簿名.xlsx]工作表名!单元格,一旦原文件被移动或重命名,引用就会失效并出现#REF!错误。
还有一个经验:多人协同时,最好不要频繁跨工作簿引用,因为别人打开你这个文件时,如果引用的工作簿没开,Excel会弹“更新链接”的提示,而且数出来可能是旧缓存。管理上更稳妥的做法是把需要引用的数据用“数据→获取数据”或者直接复制到一张汇总表里,再在当前表做计算。
2. 5.2小节:常用函数不是背出来的,是被真实需求逼出来的
2.1 聚合函数与逻辑判断:从SUM到IFS
很多人一上来就说“函数太多了,记不住”。我的真实感受是:不要背函数,先拿自己的表去套需求。等你有五六个真实场景,常用的那几十个函数自然就记住了。
最基本的聚合是SUM、AVERAGE、COUNT、COUNTA、MAX、MIN。这里有一个很多新手容易搞混的地方:COUNT只统计数值,COUNTA统计非空单元格。如果统计的区域里有“缺勤”“待定”这类文本,用COUNT就会漏算,用COUNTA才能把文本也算进去。相反,如果你只想统计真实的数字个数,用COUNTA反而会把杂七杂八的文本也算进来,结果虚高。
逻辑判断最核心的是IF。单层IF很好理解:
=IF(B2>60,"及格","不及格")但现实业务里经常有多个条件。传统写法是嵌套多个IF,公式会变得特别长,而且括号稍微错一个就找不出来。新版本Excel里的IFS函数好用很多:
=IFS(B2>=90,"优秀",B2>=70,"良好",B2>=60,"及格",TRUE,"不及格")这个写法的好处是:条件从上往下逐个判断,遇到第一个成立的就返回对应值。最后的TRUE相当于“其他所有情况”。这种模式比嵌套IF直观太多了。我建议在Office 2019或Office 365环境下的朋友直接优先使用IFS。
2.2 文本函数实战:身份证号、单位转换和脏数据清洗
文本函数里有几个高频组合,尤其是处理从系统里导出的脏数据时特别有用。先说身份证号。身份证号第7到14位是出生日期,第17位可以判断性别。提取出生日期:
=TEXT(MID(A2,7,8),"0000-00-00")其中MID从第7位开始截取8位,得到8位数字,再用TEXT加格式变成“1990-05-20”。性别判断则用:
=IF(MOD(MID(A2,17,1),2),"男","女")MOD取第17位数字除以2的余数,余1是奇数返回TRUE对应男,余0返回FALSE对应女。这里有个小坑:如果A2的身份证号是文本格式还好,如果是常规格式且数值超过15位,Excel会自动把后面的数字变成0,导致提取结果错误。所以身份证号这类长数字,录入时一定要先把单元格格式设为文本,或者在数字前面加英文单引号。
另一个常用场景是金额单位转换。比如要把报表里的“123456789”显示成“1.23亿”,可以这样写:
=TEXT(ROUND(B2/100000000,2),"0.00")&"亿"如果要显示成“亿/万”混合,逻辑也是一样的,无非是加几个IF判断数字量级。这里我要提醒一句:TEXT函数返回的是文本,不能再直接参与四则运算。你要是后面还要汇总,最好保留原始数值列,把单位转换只放在展示用的辅助列里。
文本清洗方面,我推荐TRIM(去除首尾空格)、CLEAN(去除不可见字符)、SUBSTITUTE(按指定文本替换)、LEFT/RIGHT/MID(按位置截取)。很多人从ERP系统导出的数据经常带着换行符和制表符,看起来没问题,但SUM一算就报#VALUE!。这时候先用TRIM和CLEAN清一遍,再用VALUE把文本型数字转成真数字,问题基本就解决了。
2.3 日期函数的隐藏坑:DATEDIF不自动提示,却比想象的更常用
日期计算的复杂度被大多数人低估了。TODAY()返回当前日期,但这个函数是“易失性”的,每次打开工作簿或者重新计算时都会变化。如果你需要固定记录“今天”这个值,应该用快捷键Ctrl+;直接录入静态日期,而不是用TODAY()。
计算年龄或工龄时,DATEDIF是神器。它的语法是:
=DATEDIF(开始日期,结束日期,"y") -- 整年数 =DATEDIF(开始日期,结束日期,"ym") -- 不满一年的月数 =DATEDIF(开始日期,结束日期,"md") -- 不满一个月的天数比如计算工龄:
=DATEDIF(D2,TODAY(),"y")&"年"&DATEDIF(D2,TODAY(),"ym")&"个月"但有一个坑:DATEDIF在Excel里没有被列进函数库,输入时也没有智能提示,很多新手以为没有这个函数。实际上它是老版本兼容函数,用法是完整的。不过使用时要小心,如果开始日期大于结束日期,它不会报错,而是返回#NUM!,这一点比较反直觉。
日期本质上就是数字,每个日期对应一个序列号。所以你可以直接对日期做加减:=B2+7表示7天后,=B2-30表示30天前。但如果你要精确计算两个日期间的“工作日”,就得用NETWORKDAYS,它默认不包含周末,还可以加假期列表,人事做考勤统计时特别实用。
3. 5.3小节:查找引用函数——从VLOOKUP到INDEX+MATCH的思维升级
3.1 VLOOKUP的三种“性格”和一个致命局限
VLOOKUP是很多人的启蒙查找函数,写起来也直观:
=VLOOKUP(要查找的值, 查找区域, 返回第几列, 精确匹配/近似匹配)第4参数是FALSE或0,表示精确匹配;TRUE或1表示近似匹配。很多人只知道精确匹配,忽略了近似匹配在区间查找里的巨大价值。比如根据销售额匹配提成比例:
=VLOOKUP(B2,$E$2:$F$5,2,TRUE)这里只要E列的“销售额下限”是按升序排列的,VLOOKUP就能自动匹配到“小于等于查找值”的最大档位。这种区间匹配在薪酬表、优惠折扣表里都很好用,比嵌套IF干净得多。
但VLOOKUP有一个致命限制:它只能从查找列向右查。比如数据区域是A列姓名、B列工号,你想根据工号找姓名,VLOOKUP做不到,因为工号在B列,而姓名在A列,属于向左查。标准做法是INDEX+MATCH组合,这个我们下一小段说。
另一个坑是:如果查找区域第一列有重复值,VLOOKUP只会返回从上往下找到的第一条。如果表里存在重复记录,你就需要先对数据去重,或者改用XLOOKUP配合条件筛选。还有,默认参数省略时VLOOKUP用的是近似匹配,这一点坑了无数人。我见过一个报表,公式写了=VLOOKUP(D2,A:B,2),看起来没毛病,但因为第4参数省略,实际做的是近似匹配,数据校验时才发现大量错配。
3.2 INDEX+MATCH组合:反向、多条件、任意列返回
INDEX+MATCH的核心其实是两个函数拆开用:MATCH负责“定位行号/列号”,INDEX负责“根据定位去取数”。
=INDEX(C:C, MATCH(G2, A:A, 0))这个公式的意思是:在A列里找到G2所在的行,然后返回C列同一行的值。MATCH的第三个参数0表示精确匹配。这个组合比VLOOKUP灵活太多:要查找的列可以在任意位置,不管向左向右都行;而且即使你在返回列前插入一个新列,只要改INDEX的列区域,公式仍然稳定,而VLOOKUP的第三参数如果不变,就会错位返回错误数据。
多条件查找也用它。比如要根据“部门+姓名”两个条件查找工资:
=INDEX(D:D, MATCH(1, (A:A=G2)*(B:B=H2), 0))这是一个数组公式,老版本需要按Ctrl+Shift+Enter确认。(A:A=G2)*(B:B=H2)会把两个条件同时成立的记录标记为1,不成立的标记为0,然后MATCH找1所在的行。这个思路非常强大,把它吃透以后,很多“这个表格看不懂”的问题都会迎刃而解。
如果版本足够新,可以直接用XLOOKUP,一个函数搞定大多数查找需求,还支持找不到值时返回自定义提示。但如果你的表格要发给别人用,建议先确认对方的Excel版本,避免对方打开后看到一堆#NAME?错误。
3.3 动态区域引用:OFFSET和INDIRECT的正确打开方式
动态区域是让公式自动适应数据量变化的关键。比如每天在表格里新增一行销售记录,而统计区域写死了A1:A100,新数据进来了也统计不到。OFFSET可以根据偏移量动态抓取区域:
=SUM(OFFSET(A1,0,0,COUNTA(A:A),1))这个公式的含义是:从A1开始,偏移0行0列,区域高度取COUNTA(A:A)(A列非空个数),宽度为1。只要A列的数据是新接在已有内容后面的,COUNT统计的区域高度就会跟着变,SUM的结果也自动覆盖新数据。
INDIRECT更特殊,它可以把“文本形式的单元格引用”变成真正的引用。比如数据分在Sheet1到Sheet12,12个月的工作表结构一模一样,你想在汇总表里按月份切换取值,可以这样写:
=INDIRECT("'"&A2&"'!B10")A2填“1月”,公式就引用1月表的B10;A2填“6月”,就引用6月表的B10。这种写法在月度报表汇总里非常实用。不过要注意,INDIRECT是易失性函数,使用太频繁会让工作簿打开和计算变慢。简单场景下能不用就不用。
4. 5.4小节:条件统计函数里最容易被参数顺序坑到的三种写法
4.1 SUMIF与SUMIFS参数顺序对比
条件统计函数里最经典的三个是COUNTIF、SUMIF、AVERAGEIF,以及它们带S的多条件版本。这个问题是学习记录里必须要记的一笔:SUMIF和SUMIFS的参数顺序是反的。
SUMIF的语法是:
=SUMIF(条件区域, 条件, 求和区域)SUMIFS的语法是:
=SUMIFS(求和区域, 条件区域1, 条件1, 条件区域2, 条件2, ...)也就是说,SUMIF第一参数是条件区域,求和区域放第三位;而SUMIFS第一参数直接就是求和区域,后面才是成对的条件区域和条件。如果你从SUMIF转到SUMIFS,很容易把区域顺序写错,导致Excel不报错,但结果却是错的——因为函数把区域当不同的参数在解读。我建议,如果你两种都常用,干脆统一用SUMIFS,因为它参数位置更直观,求和区域在最前面,一眼就能看到。
COUNTIF与COUNTIFS也有类似差异,但至少COUNTIFS从第二参数开始才是条件,不容易写反。AVERAGEIF和AVERAGEIFS同样套用SUMIF系逻辑,只是把SUM换成了AVERAGE。
4.2 通配符、日期条件和“错误值别怕”的三类条件写法
条件统计中的条件不只是“等于某值”。文本条件支持通配符:*代表任意多个字符,?代表任意单个字符,~用于转义。比如:
=COUNTIF(A:A,"*华为*")统计A列所有包含“华为”两个字的单元格。如果你要统计的是分类名称里带有星号的文本,星号要用波浪号转义:"~*"。
日期条件要特别小心。直接在公式里写=">=2024-1-1",Excel会把它当文本比较,结果往往不对。正确写法是用DATE函数生成日期序列号:
=COUNTIFS(日期列,">="&DATE(2024,1,1),日期列,"<="&DATE(2024,12,31))这里的&先把">="和日期值拼起来,Excel才能正确识别为条件。连带地,如果你要统计“本月到期合同”,可以结合EOMONTH计算月末日期,比如:
=COUNTIFS(到期日期,">="&EOMONTH(TODAY(),-1)+1,到期日期,"<="&EOMONTH(TODAY(),0))用条件统计函数处理错误值时也有套路。比如要对一列可能含#N/A的数据求和,直接用SUM会返回错误,而用SUMIF(原区域,">0")可以跳过错误值,因为错误值都不满足“大于0”的条件。同理,要统计非错误值个数,可以写=COUNTIF(A:A,"<>#N/A"),或者简单地=COUNT(A:A)加上COUNTIF(A:A,">0")的组合。
4.3 多条件统计的数组思维:SUMPRODUCT的妙用
SUMPRODUCT是我个人极喜欢的函数。它表面上是“乘积之和”,但配合数组运算,可以完成很多灵巧的多条件统计。
多条件求和:
=SUMPRODUCT((A2:A100="销售部")*(B2:B100="产品A")*C2:C100)这个公式的逻辑是:前两个括号内的判断会得到一组TRUE/FALSE值,TRUE在Excel中等于1,FALSE等于0,相乘之后,符合条件的行“保留原值”,不符合条件的行“变为0”,最后加起来。
多条件计数:
=SUMPRODUCT((A2:A100="销售部")*(B2:B100="产品A"))不需要求和区域,两个判断相乘的结果就是符合条件的个数。这里有一个细节:如果区域里有文本单元格,普通的SUM家族可能会报错,SUMPRODUCT在乘法运算时会自动把文本当作0处理,所以它天然可以容忍区域中混入文本,这一点在脏数据场景下非常实用。
不过SUMPRODUCT的缺点是它是数组运算,数据量超过几万行时会明显变慢。大数据量场景下,还是优先用SUMIFS,让Excel走更优化的计算路径。
5. 5.5小节:公式报错别慌——先看懂错误值,再学会F9调试链
5.1 七个错误值分别是什么意思,逐一拆解
公式用多了,没有不出错的。关键是看到错误值不要慌,先看它的类型。Excel常见错误值有七个,每个背后原因都不太一样:
| 错误值 | 含义 | 常见触发场景 |
|---|---|---|
#DIV/0! | 除数为0 | 公式中出现“除以0”或“除以空单元格” |
#N/A | 没有可用的值 | VLOOKUP或MATCH找不到查找值 |
#NAME? | 名称或函数名拼写错误 | 函数名写错、文本没加引号、名称不存在。这和系统提示“无法将npm识别为命令”是同一个道理,Excel也认不出你写的函数名 |
#NULL! | 区域没有交集 | 用空格连接了两个不相交的区域 |
#NUM! | 数值无效 | 如DATEDIF开始日期大于结束日期、函数计算超出数值范围 |
#REF! | 引用无效 | 删除了公式引用的行/列/工作表 |
#VALUE! | 参数类型错误 | 文本不能参与数值运算、数组公式用法不对 |
这七个错误值不需要背,但看到一个错误,先想“它属于哪一类”能大大提高排查速度。比如#NAME?,我第一反应就是检查函数名拼写、引号、名称管理器里有没有定义过这个名字。
还有一个容易被忽略的错误值来源:单元格里存的看起来是数字,但其实是文本。比如从系统导出的表格,单元格左上角有一个绿色小三角,SUM后结果不对或者报#VALUE!,这时用VALUE(B2)转一下,或者把整列“分列”一次,问题就解决了。
5.2 公式审核工具和F9调试,把“黑盒”变成“玻璃盒”
排查公式错误最好用的工具,不是什么高深插件,而是Excel自带的公式审核功能。在“公式”选项卡下,有“追踪引用单元格”和“追踪从属单元格”两个命令。点击之后,Excel会在工作表上用蓝色箭头画出当前公式引用了哪些单元格,以及哪些单元格引用了当前单元格。箭头能帮你一眼看出公式区域选错的问题,尤其是那种“看起来算对了但实际引用跑偏”的情况。
另一个更直观的调试方法是“求值公式”。选中公式单元格,点“公式→求值公式”,Excel会一步步展示公式的计算过程,每一步都显示当前计算结果,直到最终值。这个过程相当于把一个多层的公式逐层剥开,直接定位到某一步开始算错。
F9也是调试神器。在编辑栏里用鼠标选中公式的某一段,按F9,Excel会立刻把这一段替换成计算结果。比如你怀疑SUMIFS里的求和区域选错了,就选中求和区域那段,按F9,它直接显示那个区域的值;如果显示的不是你期望的数值范围,基本就找到问题了。
注意:按F9只会在编辑公式状态下生效,查看完结果后一定要按Esc退出,不要按Enter,否则公式片段会被永久替换成计算值。
5.3 一个真实的#VALUE!排查全过程
我记得有一次做一个销售汇总表,公式很简单:
=SUMIFS(C2:C200,A2:A200,"销售部",B2:B200,">100")结果单元格一直显示#VALUE!。我先是怀疑条件写法有问题,反复看了几遍语法,又用“求值公式”一步步看,发现前两步都正常,到第三步“求和区域”那一段,F9一按,弹出的是一个包含#VALUE!错误的数组——原来C2到C200里面混入了几个文本单元格,比如“未回款”三个字。
这个问题的根因不是公式,而是数据源。我最后用两种方式解决了:第一种,用N函数包裹文本?不行,N只能处理单个值。最直接的处理是把“未回款”这类文本替换成0,或者在源表中增加一列“实际金额”,把文本统一排除掉。第二种,改成SUMPRODUCT((A2:A200="销售部")*(B2:B200>100)*C2:C200),因为SUMPRODUCT在数组乘法时会把文本当成0,不会再报错。
这次排查给我最大的启发是:公式报错不一定是公式写错了,很可能是数据源不干净。以后遇到#VALUE!,第一件事不是改公式,而是检查引用的数据区域里有没有混进文本、空格、不可见字符。这个习惯帮我省了很多时间。
名称管理器也是一个经常被忽略的排查点。我之前遇到过一种情况:复制一个工作表到新工作簿,所有公式都变成了#REF!,排查了很久才发现,是原表里定义了一个名称,引用了源工作簿的某个单元格区域,复制之后名称引用断裂,导致所有使用该名称的公式集体失效。解决办法是到“公式→名称管理器”里把有问题的名称改掉或者删除,全局公式就恢复正常了。
学了这一节之后,我对公式和函数的态度有了明显变化。以前总觉得写公式靠的是“记忆”,记不住就搜。现在反而觉得,最重要的是看懂错误信息、掌握调试方法、理解数据特性。Excel里几乎没有不能调试的公式,怕的不是报错,而是错误摆在那里你却不知道从哪里下手。只要学会了F9分段调试和公式审核,任何黑盒公式都能一步步看穿。