上一章介绍了公式的输入方式和单元格引用规则,解决的是"怎么写公式"的问题。但光会写公式还远远不够——实际工作中,大量的计算需求不是简单的加减乘除能搞定的。要给 500 行数据自动编上序号,手动从 1 敲到 500 不现实;随机把 40 个人分成 8 组,靠抽签太慢;一列销售额里找出最高和最低的那笔,逐行比对容易看花眼。这些场景都需要用到函数。函数是 Excel 预先定义好的计算工具,输入参数就能直接拿到结果,不需要自己去构造计算逻辑。这一章先从八个最基础的函数开始,它们各自的功能都不复杂,但组合起来能解决很多实际问题。
ROW 函数返回指定单元格所在的行号,COLUMN 函数返回所在的列号。看上去功能非常简单,但在自动编号、动态计算偏移量等场景下用处不小。
语法:
=ROW(单元格引用)
如果不填参数,ROW() 返回公式本身所在的行号。填了参数,就返回参数对应的行号。
在 A1 单元格输入 =ROW(),结果是 1;在 A5 单元格输入 =ROW(),结果是 5;在任意单元格输入 =ROW(B10),结果都是 10,因为 B10 在第 10 行。
语法:
=COLUMN(单元格引用)
逻辑和 ROW 完全一样,只是方向从行变成了列。在 C3 单元格输入 =COLUMN(),结果是 3,因为 C 是第 3 列。在任意单元格输入 =COLUMN(F1),结果是 6。
最常见的用法是自动编序号。一份员工花名册从 A2 开始录入数据(A1 是表头"序号"),需要在 A 列自动生成 1、2、3……的编号。
在 A2 输入:
=ROW()-1
因为 A2 在第 2 行,ROW() 返回 2,减去 1 就是 1。把这个公式往下拖填到 A201,每行的序号自动递增:A3 的 ROW() 返回 3 减 1 等于 2,A4 的 ROW() 返回 4 减 1 等于 3,以此类推。
这种方式比手动输入 1、2、3 再下拉填充有一个关键优势:如果中间删除了某一行数据,序号会自动重新计算,不会出现断号。手动输入的序号删掉一行后会直接从 3 跳到 5,而 ROW()-1 会自动补上缺口。

如果表头不在第 1 行——比如数据从第 5 行开始,表头在第 4 行——公式要改成 =ROW()-4,让第 5 行的序号从 1 开始。减去的数字就是表头所在的行号。
在制作九九乘法表时,ROW 和 COLUMN 可以配合使用。在 B2 到 J10 的区域制作一张乘法表:A 列(A2:A10)填上 1 到 9,第 1 行(B1:J1)也填上 1 到 9 作为行列标题。
在 B2 输入:
=(ROW()-1)*(COLUMN()-1)
ROW()-1 拿到的是当前行对应的乘数(第 2 行减 1 等于 1),COLUMN()-1 拿到的是当前列对应的乘数(B 列是第 2 列减 1 等于 1),两个乘起来就是 1×1=1。把这个公式向右和向下填充到 J10,整张九九乘法表自动生成,不需要手动输入 81 个结果。
需要随机分配任务、随机抽取样本、随机生成测试数据时,靠人脑"想一个随机数"既慢又不够随机。RAND 和 RANDBETWEEN 是 Excel 提供的两个随机数函数,区别在于生成的数值范围不同。
语法:
=RAND()
不需要任何参数。每次调用返回一个大于等于 0、小于 1 的随机小数,类似 0.371928、0.854216 这样的值。每次按 Enter、F9 或者编辑工作表中任意单元格后,RAND 的结果都会重新计算,产生一个新的随机数。
语法:
=RANDBETWEEN(最小值, 最大值)
返回指定范围内的一个随机整数,包含两端的边界值。=RANDBETWEEN(1,10) 可能返回 1 到 10 中的任何一个整数。
一份培训签到表有 40 名参训人员(B2:B41),需要随机分成 8 组,每组 5 人。
在 C1 输入表头"组号",在 C2 输入公式 =RANDBETWEEN(1,8),然后向下填充到 C41。每个人旁边出现一个 1 到 8 之间的随机数字,代表被分配到了哪一组。
分组结果出来后,按 C 列排序,同一组的人就排在了一起。但此时有一个问题:纯随机分配不保证每组恰好 5 人,可能某组 7 人、某组 3 人。
如果需要严格的每组 5 人,可以换一种思路:在 C 列用 RAND() 生成随机小数,然后按 C 列排序打乱原始顺序,排序后前 5 人分到第 1 组、第 6 到 10 人分到第 2 组,以此类推。这样每组人数一定相等。
RAND 和 RANDBETWEEN 的结果是"易变的"——任何一次编辑操作(哪怕是修改一个不相关的单元格)都会触发它们重新计算,产生新的随机数。如果需要固定随机结果,必须在生成后立刻选中随机数所在的区域,Ctrl+C 复制,然后在原位"选择性粘贴"→"数值",把公式替换成固定的数字。否则一不小心碰了键盘,分组结果就全变了。
课堂上需要随机决定 30 名学生的发言顺序。学生名单在 A 列(A2:A31),在 B 列输入 =RAND(),向下填充到 B31。每个学生旁边出现一个随机小数。按 B 列升序排列后,学生名单的顺序完全随机化了。第一个发言的就是排在最上面的人,以此类推。
这个方法比 RANDBETWEEN 更适合"打乱顺序"的场景,因为 RAND 生成的小数几乎不可能重复(重复概率极低),排序后不会出现两个人并列的情况。
MOD 函数用于计算两个数相除后的余数。日常工作中,隔行标色、判断奇偶、按固定周期轮换值班——这些逻辑的底层都是"除法取余"。
语法:
=MOD(被除数, 除数)
=MOD(10,3) 的结果是 1,因为 10÷3=3 余 1。=MOD(12,4) 的结果是 0,因为 12 能被 4 整除,没有余数。
一份表格有 200 行数据,需要标记出所有偶数行(用于后续的隔行底色设置或隔行提取数据)。在辅助列输入:
=MOD(ROW(),2)
ROW() 返回行号,除以 2 取余。奇数行的结果是 1,偶数行的结果是 0。有了这个标记列,用筛选功能筛选出所有值为 0 的行,就是全部偶数行。
公司有 3 个值班组(A 组、B 组、C 组),每天轮换一组。给定一列日期序列(比如 1 月 1 日到 1 月 31 日),需要在旁边自动标注每天哪个组值班。
假设 A 列是日期(A2:A32),在 B2 输入:
=MOD(ROW()-2,3)+1
ROW()-2 让第一行数据从 0 开始计数。除以 3 取余的结果在 0、1、2 之间循环。加 1 后变成 1、2、3 的循环。向下填充后,B 列的值依次是 1、2、3、1、2、3……,对应 A 组、B 组、C 组的轮值顺序。
如果需要直接显示组名而不是数字,可以配合后面会学到的 IF 函数来实现,或者用一张对照表手动匹配。
仓库发货时,每箱固定装 12 件产品。一批订单中,有的要 36 件、有的要 50 件、有的要 72 件,需要快速判断哪些订单的数量能刚好装满整箱、哪些会有散件。
假设 B 列是订单数量,在 C 列输入:
=MOD(B2,12)
结果为 0 的订单数量恰好是 12 的倍数,可以整箱发货。结果不为 0 的订单,余数就是散件数量——比如 50 件的余数是 2,意味着装满 4 箱后还剩 2 件需要单独处理。
MOD 的除数不能为 0,否则会返回 #DIV/0! 错误。在实际使用中,如果除数来自其他单元格的引用,要确保那个单元格不是空的也不是 0。
REPT 函数把一段文本重复指定的次数。听起来是个不起眼的小功能,但在制作简易图表、生成填充字符、构造评分可视化等场景下非常实用。
语法:
=REPT(要重复的文本, 重复次数)
=REPT("★",3) 的结果是 ★★★。=REPT("ab",4) 的结果是 abababab。重复次数为 0 时返回空文本,负数会报错。
一份"各部门月度加班时长"表,B 列是加班小时数(范围从 5 到 45),想在 C 列用字符条直观展示各部门加班时长的对比,不需要插入正式的图表。
在 C2 输入:
=REPT("▌",B2/5)
B2 的值除以 5 作为重复次数——加班 25 小时的部门显示 5 个"▌"字符,加班 45 小时的显示 9 个。效果类似一个简易的条形图,直接嵌在单元格里:
这种做法的好处是不需要额外的图表空间,数据和可视化在同一行内,打印出来也能保留效果。

一份"产品评分表",B 列是评分(1 到 5 的整数),需要在 C 列用星号直观展示评分等级。
在 C2 输入:
=REPT("★",B2)
评分为 3 的产品显示 ★★★,评分为 5 的显示 ★★★★★。比单纯的数字更直观。
如果还想显示"空星"来表达满分是 5 星(类似 ★★★☆☆ 的效果),可以把公式改成:
=REPT("★",B2) & REPT("☆",5-B2)
前半部分生成实心星,后半部分用 5 减去评分得到空星的数量。评分 3 的结果就是 ★★★☆☆,评分 5 的结果是 ★★★★★,视觉上非常清晰。
财务系统要求凭证编号统一为 6 位数字,不足的前面补零——编号 42 要显示为 000042,编号 7 要显示为 000007。
假设 A 列是原始编号,在 B 列输入:
=REPT("0",6-LEN(A2)) & A2
LEN(A2) 计算原始编号的字符长度,6 减去这个长度就是需要补的零的个数。REPT("0",需要补的个数) 生成对应数量的零,& 把零和原始编号拼接起来。编号 42 的长度是 2,需要补 4 个零,结果就是 000042。
REPT 的重复次数如果是小数,Excel 会自动截断取整数部分。=REPT("A",3.7) 的结果和 =REPT("A",3) 一样,都是 AAA。在用除法计算重复次数时要注意这一点,可能导致条形图长度不够精确。
MAX 返回一组数值中的最大值,MIN 返回最小值。这是两个使用频率极高的函数,适用于找最高成绩、最低库存、最大订单金额、最早日期等各种场景。
语法:
=MAX(数值1, 数值2, ...)
参数可以是单个数值、单元格引用,也可以是一个区域。=MAX(85,92,78,96,88) 的结果是 96。=MAX(B2:B100) 会在 B2 到 B100 的范围内找出最大的那个值。
语法:
=MIN(数值1, 数值2, ...)
用法和 MAX 完全对称。=MIN(85,92,78,96,88) 的结果是 78。=MIN(B2:B100) 返回该区域中的最小值。
一份"全年月度销售额"表,B 列是 1 月到 12 月的销售金额(B2:B13)。在汇总区域做以下计算:
最高月销售额:=MAX(B2:B13)
最低月销售额:=MIN(B2:B13)
最高与最低的差距:=MAX(B2:B13)-MIN(B2:B13)
假设 12 个月的销售额在 18 万到 52 万之间波动,MAX 返回 52 万,MIN 返回 18 万,差距是 34 万。这三个数字直接反映了全年销售的波动幅度——差距越大说明业绩越不稳定,需要进一步分析低谷月份的原因。

一份期末考试成绩表,C 列是数学成绩(C2:C61,共 60 名学生)。
在汇总区域输入 =MAX(C2:C61),得到全班最高分。
输入 =MIN(C2:C61),得到全班最低分。
输入 =MAX(C2:C61)-MIN(C2:C61),得到分差(极差),反映成绩的离散程度。
如果最高分 98、最低分 23,极差是 75 分,说明班级内部成绩差距非常大。如果最高分 95、最低分 72,极差只有 23 分,说明整体水平比较均匀。
MAX 和 MIN 的参数可以包含多个不连续的区域。一份表格中,D 列是语文成绩、E 列是数学成绩、F 列是英语成绩,需要找出某个学生三科中的最高分和最低分:
三科最高分:=MAX(D2,E2,F2)
三科最低分:=MIN(D2,E2,F2)
也可以一次性在所有学生的所有科目中找出全校最高分:
=MAX(D2:F61)
这个公式会在 D2 到 F61 的整个矩形区域中搜索,不管是哪一科、哪个学生,只要是最大的那个数值就返回。
有一种不太直观但非常实用的用法:用 MAX 来保证结果不低于某个值,用 MIN 来保证结果不超过某个值。
员工月度绩效奖金的计算规则是"销售额的 5%",但公司规定奖金最低 500 元、最高 8000 元。如果直接用 =B2*5% 计算,销售额只有 3000 的员工奖金是 150 元(低于下限),销售额 20 万的员工奖金是 10000 元(超过上限)。
用 MAX 和 MIN 做双向限制:
=MIN(MAX(B2*5%,500),8000)
内层 MAX(B25%,500) 先处理下限——如果 B25% 小于 500,就取 500;外层 MIN(...,8000) 再处理上限——如果结果大于 8000,就取 8000。两层嵌套后,奖金永远落在 500 到 8000 的区间内。
MAX 和 MIN 会自动忽略区域中的文本和空白单元格,只对数值进行比较。如果 B2:B100 中间有几个空格子或者有人误输入了文字,不影响函数的计算结果。但如果整个区域全是文本或全是空白,MAX 返回 0,MIN 也返回 0——不会报错,但结果可能不是预期的。
这八个基础函数各自功能简单,但组合使用时能力会成倍增长。ROW 配合 MOD 可以实现周期编号,REPT 配合除法能做出单元格内的迷你图表,MAX 和 MIN 嵌套能做数值的上下限控制,RANDBETWEEN 配合排序能完成各种随机分配任务。掌握了这些基础工具后,后面学习统计函数和逻辑函数时会轻松很多——因为更复杂的函数本质上就是在这些基础能力上叠加条件判断和批量计算。