SEQUENCE:造序列造日期造日历

造序号这件事,大多数人还在用最原始的办法:在 A1 写 1、A2 写 2,选中两格往下拖;或者写 =ROW(A1) 再往下填充。这两种做法都有同一个毛病——区域大小是死的。源数据从 500 行变成 800 行,你要么重新拖一次,要么忍受末尾多出一堆没用的行。SEQUENCE 的出现就是为了让序列变成“算出来的”而不是“填出来的”:你告诉它要几行几列、从几开始、每次加多少,它就溢出出一片刚刚好的数字。

这个函数看着不起眼,实际上它是动态数组家族里用途最杂的一个。造序号只是最基础的用法,真正让它值回票价的是三类场景:配合日期函数造连续的日期序列(月度报表的表头、排班表的横轴)、配合 TEXT 或者 INDEX 造循环序列(星期一循环、季度循环、班组轮值)、以及作为其他动态数组公式的“行号发生器”(给排序结果加名次、给拆分结果加编号)。本篇会逐个讲清楚,并给出可以直接复制的公式。

一、语法:四个参数

SEQUENCE 的语法写在下面的代码块里,一共四个参数,全部可以省略但至少要给第一个。

SEQUENCE(rows, [columns], [start], [step])

第一个参数 rows 是要几行。第二个参数 columns 是要几列,省略时默认为 1,也就是生成一列。第三个参数 start 是从哪个数字开始,省略时默认为 1。第四个参数 step 是每次增加多少,省略时默认为 1,写负数就是递减序列,写小数也可以。四个参数都可以是别的公式算出来的结果,这一点非常关键——比如把 rows 写成 COUNTA(B2:B500),序列长度就自动跟着数据条数走。

最简单的几个例子:=SEQUENCE(10) 生成 1 到 10 竖着排一列;=SEQUENCE(1,12) 生成 1 到 12 横着排一行,正好可以做十二个月份的表头;=SEQUENCE(5,1,100,-10) 生成 100、90、80、70、60 这样一个递减序列;=SEQUENCE(3,4) 生成一个三行四列的矩阵,按行优先依次填 1 到 12。注意填充顺序是先横着填满第一行,再换到第二行,这个规律在用 SEQUENCE 做日历时要用到。

参数联动是它最好用的特性。假设 B 列是不定长的客户名单,你想在旁边生成同样长度的序号,写成 =SEQUENCE(COUNTA(B2:B500)) 即可,客户增加一个序号就多一个,永远不会多出空行。更进一步,如果这个名单本身是 UNIQUE 的结果,可以写成 =SEQUENCE(ROWS(H2#)),用井号引用溢出区域的行数,连 COUNTA 都不用写,整套公式完全自适应。

二、造日期、造月份、造日历

SEQUENCE生成日期与日历

日期在 Excel 里本质上就是数字,所以 SEQUENCE 加一点算术就能造出连续的日期。最基础的写法是 =SEQUENCE(30,1,TODAY(),1),生成从今天起连续 30 天的日期,设置单元格格式为日期就能正常显示。把步长改成 7 就是每周一个日期,改成 1 就是每天。如果要生成某个月的每一天,写成 =SEQUENCE(DAY(EOMONTH(DATE(2026,3,1),0)),1,DATE(2026,3,1),1),先用 EOMONTH 算出这个月最后一天、再用 DAY 取出天数,然后以此为长度生成序列,三月就是 31 天,二月自动是 28 或 29 天,闰年也不用手工调整。

造十二个月份的表头,常用写法是 =DATE(2026,SEQUENCE(1,12),1),生成 2026 年每个月的第一天,再把单元格格式设成“mmm”或者自定义格式,就显示为“1月”到“12月”。这个写法的优点是结果仍然是真正的日期,可以直接参与比较和计算,而不只是长得像月份的文本。很多人在表头里手打“1月”“2月”,后面想按日期筛选时就全废了,用这个写法能避开这个坑。

造日历是 SEQUENCE 最能体现价值的地方。一个六行七列的月历,可以用一条公式生成:先算出目标月份第一天是星期几(用 WEEKDAY 函数),再用它作为起始偏移量,公式写成 =SEQUENCE(6,7,DATE(2026,10,1)-WEEKDAY(DATE(2026,10,1),2)+1,1)。它的原理是:先把起点回退到这一周的上一个周一,然后按每天加一铺满 42 个格子,于是第一行可能包含上个月末尾几天,最后一行可能包含下个月开头几天。把这些格子设成只显示“日”(自定义格式 d),再用条件格式把不属于本月的日期字体调成灰色,一张能自动换月的日历就做好了。

季度、星期、班组这类循环序列用取余的套路做。比如要生成“第一季度”到“第四季度”循环三次,写成 =INDEX({"第一季度";"第二季度";"第三季度";"第四季度"}, MOD(SEQUENCE(12)-1,4)+1);要生成星期一到星期日循环,写成 =TEXT(SEQUENCE(7),"ddd") 或者用 INDEX 配常量数组。核心思路是:SEQUENCE 负责给出一个递增的整数流,MOD 负责把它折叠成循环,INDEX 或者 TEXT 负责把数字翻译成你想要的文字。

理解 SEQUENCE 的填充顺序有个小窍门:它是按“行优先”填的,也就是先填满第一行再换行。所以 =SEQUENCE(3,4) 得到的第一行是 1、2、3、4,第二行是 5、6、7、8,第三行是 9、10、11、12。如果你期望的是按列填充,需要配合 TRANSPOSE 或者改用其他构造方式。做日历时这个特性正好符合直觉,因为一周七天刚好是一行;但做某些矩阵计算时要留意方向,算错了方向结果会完全不对。

三、五个能直接抄的写法

下表列出了五种最常见的造序列需求,公式可以直接复制。第二行和第四行在日常报表里出现频率最高。

需求 可复制的写法 要点
造 1 到 N 的序号 =SEQUENCE(10) 竖排一列,常用于名次、编号
造十二个月表头 =DATE(2026,SEQUENCE(1,12),1) 结果是真日期,格式设成 mmm
造连续 30 天 =SEQUENCE(30,1,TODAY(),1) 步长为 1,格式设成日期
造某月全部日期 =SEQUENCE(DAY(EOMONTH(DATE(2026,3,1),0)),1,DATE(2026,3,1),1) 自动处理大小月和闰年
造循环星期 =TEXT(SEQUENCE(7),"ddd") 配 TEXT 显示为周一到周日

还有两个变形值得记:造递减序列把步长写成负数,=SEQUENCE(5,1,100,-10) 得到 100、90、80、70、60;造二维数组给矩阵打底,=SEQUENCE(6,7) 得到一个六行七列的 1 到 42,做日历、做座位表、做排班网格都靠它。

把 SEQUENCE 和其他函数组合时,最实用的搭档是 INDEX。比如要按固定顺序重复列出一组项目名,写成 =INDEX(项目表, MOD(SEQUENCE(20)-1, ROWS(项目表))+1),项目表有几项就循环重复几次,长度由 SEQUENCE 的参数控制。这类“按模板批量生成行”的需求,过去只能靠复制粘贴或者 VBA,现在一条公式能生成几百行。

四、真实场景

第一个场景是给动态结果加编号。前面讲排序时说过,排行榜的名次可以用 =SEQUENCE(ROWS(H2#)) 生成,客户名单变化时名次自动增减。同理,用 FILTER 筛出来的明细行想加一列序号,也是同样的写法。注意这里的 ROWS 一定要配合井号引用,写成 ROWS(H2#) 而不是 ROWS(H2:H100),否则又变回写死区域的老毛病。

第二个场景是生成月度排班表或者考勤表的骨架。横轴是当月每一天,用“造某月全部日期”的写法横排;纵轴是员工名单,用 UNIQUE 从花名册里取。两个公式分别放在 B1 和 A2,整张表的行列就都活了:换一个月,日期自动变成那个月的天数;员工入职离职,纵轴自动增减。之后在中间用 COUNTIFS 或者其他公式填值即可,整张表没有任何一处需要手工维护。

第三个场景是批量生成测试数据和模板行。做模板时要预置十行空白的记录行,每行带序号,写成 =SEQUENCE(10) 配一列空值即可;做演示数据时要造一百个递增的编号和随机金额,写成 =HSTACK(SEQUENCE(100), RANDARRAY(100,1,1000,50000,TRUE)),一次生成两列。这种“先造骨架再填肉”的思路在做原型时非常高效。

第四个场景是做甘特图或者时间轴的底图。横轴用日期序列,每个格子的值用条件格式去判断是否落在任务的起止区间内,落在就填色,一张简易甘特图就出来了。因为横轴是真正的日期序列,条件格式里的判断可以直接用大于小于比较,比用文本月份做横轴省事得多,也不怕跨月。

第五个场景是配合其他动态数组做行号发生器。比如要把一列数据每隔三行抽一个,写成 =INDEX(B2:B500, SEQUENCE(ROUNDUP(ROWS(B2:B500)/3,0),1,1,3)),SEQUENCE 生成 1、4、7、10 这样的下标流,INDEX 按下标取值。这类“按规则抽行”的需求用 SEQUENCE 做下标再统一 INDEX 取值,是最标准的解法。更多关于如何把结果按条件进一步处理,可以参考 FILTER:按条件把行整条捞出来。

第六个场景是生成分段区间。做金额分布分析时常常需要给出“0 到 1000、1000 到 2000”这样的区间标签,用 SEQUENCE 配上算术就能一次生成:=TEXT(SEQUENCE(10,1,0,1000),"0")&"-"&TEXT(SEQUENCE(10,1,1000,1000),"0"),两个序列错开一位拼在一起,得到十段区间文本。之后用 COUNTIFS 统计每段里的记录数即可,区间改小改大只需要改步长。这类“用两个错位的序列拼出区间”的技巧,在做直方图、做分段统计时反复会用到。

五、翻车提醒与版本要求

SEQUENCE序列的三个坑

在正式讲翻车点之前,先说一个建立直觉的方法:把 SEQUENCE 想成“数数工具”而不是“填数工具”。你告诉它数几个、从哪儿开始数、每次跳几格,它就数给你看。所有看似复杂的用法——日历、排班、抽行、循环——本质上都是先数出一串整数,再让别的函数把整数翻译成日期、文字或者下标。建立起这个心智模型之后,遇到新需求时你就知道该从“我要几个、从哪开始、跳几格”这三个问题问起。

第一,参数是“个数”不是“结束值”。=SEQUENCE(10) 生成的是十个数字而不是到 10 结束,如果你写成 =SEQUENCE(10,1,5,1),得到的是 5 到 14 共十个数字。想生成 1 到 10 就是从 1 开始取 10 个,想生成 5 到 10 就该写成 =SEQUENCE(6,1,5,1)。这个区别在起点不是 1 的时候特别容易算错,建议先在心里确认“一共几个”。

第二,序列溢出区域被占用会报 #SPILL!,这一点和其他动态数组函数一样。做日历时尤其要注意,六行七列需要一片完整的矩形空地,哪怕中间有一个单元格有内容都会失败。

第三,日期序列必须设置单元格格式。SEQUENCE 生成的本质是数字,直接看会是五位数序列号,必须把格式改成日期才能正常显示。忘了设置格式是最常见的“看着像出错了”的情况,不是公式有问题。

第四,用 SEQUENCE 生成日期时别用文本拼接。有些人写 ="2026-"&SEQUENCE(12)&"-1" 试图造日期,结果得到的是文本,参与比较和筛选时全部失效。正确做法永远是用 DATE 函数构造真日期,需要什么显示样式就改单元格格式。

第五,参数里引用整列会很慢。=SEQUENCE(COUNTA(B:B)) 会先统计整列非空单元格,在一百多万行上做这件事开销不小。写 COUNTA(B2:B500) 或者用超级表结构化引用更稳妥。

版本方面,SEQUENCE 与 UNIQUE、FILTER、SORT 同批发布,需要 Microsoft 365 或者 Excel 2021 及以后版本。老版本里造序号有三条替代路:一是 =ROW(A1) 向下填充,简单但行数固定;二是 =ROW(A1:An) 之类的数组公式,按 Ctrl+Shift+Enter 输入;三是“填充”菜单里的“序列”命令,可以指定步长和终止值,一次性生成但不会自动更新。造日期序列在老版本里通常用“开始日期加 1”的公式向下填充,比 SEQUENCE 麻烦但不难;造日历则只能用辅助列加条件格式,工作量会大不少,这也是很多老模板里日历都是固定手工维护的原因。

如果你的序列还要继续做去重或者排序,可以参考 UNIQUE:去重不用再点删除重复项 与 SORT 和 SORTBY:排序交给公式。三者组合起来,几乎能覆盖所有“自动生成一片结构化数据”的需求。如果你造出来的序列还要参与拆分或者合并文本,可以继续看 TEXTSPLIT 和 TEXTJOIN:拆得开也合得上,那一篇讲的正是把一整串文本拆成行列、再拼回去的思路,和 SEQUENCE 造骨架的做法经常搭配使用。

常见问题

生成的序列长度能不能跟着另一张表的行数自动变?

可以,把第一个参数写成对那张表的统计即可。最常见的写法是 =SEQUENCE(ROWS(H2#)),其中 H2# 是某个动态数组结果的溢出区域,行数变化时序号跟着变。如果源数据是超级表,也可以用结构化引用配合 ROWS 或者 COUNTA。判断有没有生效很简单:往源表里加一行,看序号是不是多了一个,多出来就说明联动成功。这是检验“公式是不是真的动态”最快的办法。

SEQUENCE 能不能生成文本序列,比如甲乙丙丁?

不能直接生成,但可以配合 INDEX 或者 TEXT 转换。最常见的是用 INDEX 配常量数组:=INDEX({"甲";"乙";"丙";"丁"}, MOD(SEQUENCE(10)-1,4)+1) 会生成十个循环的甲乙丙丁。如果只需要一次不循环,写成 =INDEX({"甲";"乙";"丙";"丁"}, SEQUENCE(4)) 即可。另一个思路是用 TEXT 把数字格式化成中文数字,=TEXT(SEQUENCE(10),"[DBNum1]") 会得到“一”到“十”,适合做条款编号。

怎么生成从今天往前推 7 天的日期?

把步长写成 -1 即可:=SEQUENCE(7,1,TODAY(),-1) 生成从今天往前数七天的日期,顺序是由近到远。如果想由远到近排列,写成 =SORT(SEQUENCE(7,1,TODAY(),-1)) 在外面套一层排序,或者把起点改成 TODAY()-6 步长改为 1。做“最近七天趋势”这类报表时,后者更常用,因为图表的横轴习惯从左到右时间递增。

我想做一个能切换月份的日历,公式怎么改?

把月份起点换成对一个单元格的引用。比如在 H1 放一个月份选择(一个该月第一天的日期),日历公式写成 =SEQUENCE(6,7,H1-WEEKDAY(H1,2)+1,1)。之后只要改 H1 的值,整张日历自动重排。再用条件格式把不等于该月的格子字体设成浅灰:条件格式里用公式 =MONTH(B2)<>MONTH($H$1),应用到整个日历区域即可。把 H1 做成下拉菜单或者配合日期选择器,就得到一个完整的交互日历。

为什么我的 SEQUENCE 结果显示成一串五位数?

因为你造的是日期但单元格格式还是“常规”。Excel 的日期本质是序列号,2026 年对应的数字就在四万六千左右,显示为五位数是正常的。解决办法是选中结果区域,按 Ctrl+1 打开单元格格式,选“日期”或者自定义格式。做日历时常用自定义格式 d(只显示日),做月份表头时常用 mmm(显示“1月”这种简写)。格式改完显示就正常了,公式本身没有问题。

SEQUENCE 生成的结果能直接作为 SUM 或者 INDEX 的参数吗?

完全可以,这也是它最有用的地方之一。SEQUENCE 返回的是一个真正的数组,可以出现在任何接受数组参数的位置。比如求 1 到 100 的和可以写成 =SUM(SEQUENCE(100));取一列数据里第 1、4、7、10 行的值可以写成 =INDEX(B2:B500, SEQUENCE(4,1,1,3));甚至可以做矩阵运算,=MMULT(SEQUENCE(3,3), SEQUENCE(3,3)) 会返回两个矩阵的乘积。把它当成一个“现成的数字流”来用,能想到的组合会非常多。还有一个高阶用法值得提一句:配合 LET 可以把 SEQUENCE 的结果存成一个变量名,后面反复引用而不用重复计算,公式会长得像 =LET(s, SEQUENCE(100), SUM(s*2)) 这样。这种写法既省计算量又好读,是写长公式时非常推荐的习惯。