夜雨聆风学习资料网

ARTICLE · 1337864

一张 Excel 管住一个月的生产:5 张表、5300 条公式,全自动甘特图和产出日历

一张 Excel 管住一个月的生产:5 张表、5300 条公式,全自动甘特图和产出日历

现在做生产管控,低代码和多维表当然更规范:多人协同、权限分级、操作留痕,开箱就有。但今天要拆的这份 计划和进度台账1.xlsx 想说明另一件事——一张单机 Excel,也能做出相当复杂、而且相当自动化的管理表格。

它只有 5 张工作表:生产计划、生产任务单、生产完调度台账、工段产出报表、成品产出日历。没有 VBA、没有宏、没有外部链接,5,300 多条公式把「下计划 → 派工 → 报产 → 汇总判断 → 看板」串成一个闭环。最妙的两处是:甘特图不是图表,是三条条件格式规则;日历里没有一天是硬编码的,换个月份星期自己就对齐了。

对做生产管理的人来说,这份表值得看的不是某个函数怎么写,而是它把「人要填的东西」压到了多薄:全表真正需要手工录入的,只有调度台账里的 5 列。

一句话概括这套结构:主数据和事务数据分家,用任务单编号当主键;所有看板都是对同一份流水账的重新聚合。这也是所有 MES / ERP 的最小原型。

说明|本文所有公式、单元格区域、条件格式规则与示例数值,均来自对该 xlsx 的只读解析;原文件未作任何修改。公式中已去掉 WPS 保存时自动附加的 _xlfn. / _xlfn._xlws. 前缀,可直接复制使用。

一、先看全貌:五张表,一条数据链

图 1|五张表的职责与数据流向:数据只在 ③ 录一次,其余四张表全靠公式读它

把文件按「谁产生数据、谁消费数据」拆开,结构一下子就清楚了:

工作表
角色
谁在写
关键机制
① 生产计划
主数据 / 计划源
计划员填订单、工段、图号、计划量、起止日期
任务单编号自动生成;条件格式画甘特图
② 生产任务单
按工段派工
只在 B2 选一个工段
FILTER + CHOOSECOLS 溢出本工段任务
③ 生产完调度台账
唯一的事务流水
车间报产,只填 5 列
VLOOKUP 回填 8 列;右侧 FILTER 做调度查询
④ 工段产出报表
按日汇总 + 自动结论
只有 B2 选工段
SUMIFS 按 日期 × 工段 × 图号 分配产出
⑤ 成品产出日历
按产品看累计入库
只有 I3 选产品
WEEKDAY 对齐星期;两次累计 SUMIFS 拼 39/15

数据是这样流动的:生产计划 生成任务单编号 → 生产任务单 按工段把任务分派下去 → 车间每天在 调度台账 报一条产出 → 这条产出同时被计划表的每日网格、任务单的完成数、报表的日期格、日历的累计数读走。

整份表只有两个「总开关」:生产计划!L1(年)和 O1(月)。改这两个格,五张表的标题、日期轴长度、甘特条的参照、日历的起始周一,全部跟着重算。这种「参数集中」的做法,是模板能跨月复用的前提。

二、第一张表:改两个单元格,甘特图自己长出来

图 2|生产计划的 A:O 明细 + P:AS 日期网格;绿色横条就是各任务的计划跨度

2.1 一个标题、一个月首、一条日期轴

公式 ①|B1 动态标题复制公式

=L1&"年"&O1&"月生产计划"

L1 / O1 是手填的年和月。报表与日历的标题也都引用这两格(=生产计划!L1&"年"&生产计划!O1&"月在制品追踪表"),所以全工作簿的月份永远一致。

公式 ②|P2 本月 1 号复制公式

=DATE($L$1,$O$1,1)

把「年、月」两个数字变成一个真正的日期序列值。后面所有日期计算都以它为基准,避免了从文本标题里抠数字(旧版曾用 REGEXP + CONCAT 从「2026年11月生产计划」里提年月,兼容性很差)。

公式 ③|P3 横向溢出整月日期复制公式

=SEQUENCE(1,            DAY(EOMONTH(DATE(YEAR(P2),MONTH(P2),1),0)),            DATE(YEAR(P2),MONTH(P2),1),            1)

拆开看:EOMONTH(月初,0) 取本月最后一天 → DAY() 得到天数(28/29/30/31)→ SEQUENCE(1, 天数, 月初, 1) 生成 1 行 N 列、步长为 1 的日期序列。一个公式溢出到 P3:AS3,2 月不会多出两格,31 天月也不会少一格。

第 4 行是第 3 行的镜像(P4 = P3、Q4 = Q3 …),用来给表头做「日」格式;第 31 列 AT 则加了空值守卫:

公式 ④|AT4 / AT5 短月守卫复制公式

=IF(AT3="","",AT3)

日期轴最多预留 31 列。短月时 AT3 是空的,AT4 返回空,AT5:AT59 的 SUMIFS 也用 IF(AT$3="","",…) 直接不计算。这就是「预留上限 + 空值守卫」的自适应手法,报表和日历里还会再见到两次。

2.2 主键与缺口:让编号自己生成

公式 ⑤|C5 任务单编号复制公式

=IFERROR(--IF(AND(E5<>"",N5<>""),TEXT(N5,"yyyymm")&TEXT(ROW()-4,"0000"),""),"")

只有「图号 E」和「计划开始时间 N」都填了才生成编号:TEXT(N5,"yyyymm") 取年月 + TEXT(ROW()-4,"0000") 取 4 位流水号(第 5 行 → 0001)。前面的 -- 把文本转成数值,外层 IFERROR 让空行保持空白。于是 2026110001 这种编号既是主键,又自带月份信息。

公式 ⑥|L5 缺口复制公式

=I5*J5-K5

订单台数 × 每台用量 − 期末结存 = 还差多少。M 列计划数量是人工填的,但数据验证限制它必须 ≥ L 列缺口,否则弹「计划量不够」——业务规则被写进了单元格,而不是写在制度里。

公式 ⑦|P5 每日完成回填复制公式

=SUMIFS(生产完调度台账!$L$3:$L$200,生产完调度台账!$A$3:$A$200,$C5,生产完调度台账!$D$3:$D$200,P$3,生产完调度台账!$B$3:$B$200,$D5)

P5:AS59 共 55 行 × 30 列都是这一条公式的变体:按「任务单编号 + 工段 + 当日日期」三个条件,去台账把当天产出取回来。绿色计划条底下叠着实际完成数,一格同时承担了「计划」和「实绩」两种信息。

原理|注意混合引用:$C5 锁列不锁行(同一行取同一个任务单编号),P$3 锁行不锁列(同一列取同一个日期)。一个公式拖满整个矩形,就成了一张会自动刷新的二维透视表——这正是后面第四张表的核心手法。

2.3 甘特图其实是三条条件格式规则

图 3|条件格式规则管理器:三条公式分别负责计划横条、周末底纹、今日竖线
规则
公式
应用区域
作用
计划横条
AND(NOT(ISBLANK($N5)),$N5<=P$3,$O5>=P$3)
P5:AT59
绿色填充 FF00B050,画出计划跨度
周末底纹
AND(ISNUMBER(P$3),WEEKDAY(P$3,2)>5)
P3:AT4
浅灰,周六周日一目了然
今日竖线
P$3=TODAY()
P3:AT59
浅橙,打开文件就定位到今天

第一条是灵魂:行方向取 N/O 的起止日期,列方向取第 3 行的日期,两者一夹就是这条任务的计划区间。把它应用到 1705 个格子(55 行 × 31 列),Excel 会为每格判断一次,于是「图表」就长在单元格里了。计划日期一改,横条立刻变长变短;插入删除行也不用重设数据源。

第二条里的 ISNUMBER(P$3) 很容易被忽略:短月时后面几列是空的,空白在 Excel 里会被当成 0 号日期,WEEKDAY 算出来可能是周末,于是空白列被误涂成灰色。加一层数字判断就干净了。

划重点|配套的三条数据验证:G5:G59 去向只能选「转序 / 成品库」;M5:M59 计划数量 ≥ 缺口(出错标题「计划量不够」);N5:O59 要求 $M5>0 才允许填日期。把校验放在录入阶段,比事后对账便宜得多。

三、第二张表:选一个工段,只出这个工段的任务单

图 4|B2 选「焊二工段」,A4 一条公式溢出 9 行任务;完成数自动从台账汇总

B2 是一个数据验证下拉(下料 / 焊一 / 焊二 / 新产品 / 涂装 五个工段)。除了这一格,整张任务单没有一个字是手填的。

公式 ⑧|A4 按工段过滤并重排列序复制公式

=FILTER(   CHOOSECOLS(生产计划!$C$5:$O$200, 2,1,3,4,6,5,11,12,13),   (IFERROR(FIND($B$2,生产计划!$D$5:$D$200),0))    * (生产计划!$M$5:$M$200>0),   "")

两层嵌套,逐个说清楚:

CHOOSECOLS 取第几列
来自计划表
落到任务单
2 / 1 / 3 / 4
D 工段 / C 任务单编号 / E 图号 / F 零件名称
A / B / C / D
6 / 5 / 11
H 工序 / G 去向 / M 计划数量
E / F / G
12 / 13
N 开始日期 / O 完成日期
H / I

CHOOSECOLS 一口气完成两件事:挑列和重排。计划表 C:O 共 13 列,按 2,1,3,4,6,5,11,12,13 重排后,正好对上任务单 A:I 的表头顺序,不需要任何中间辅助列。

过滤条件是两个布尔数组相乘:IFERROR(FIND($B$2, D列),0) 判断工段名是否包含 B2(找不到就归 0),再乘 计划数量>0。原文件里有两单被自动排除:2026110004 属于焊一工段,2026110005 计划数量为 0。缓存结果正好 9 行。

公式 ⑨|J4 累计完成数复制公式

=IF(B4="","",SUMIFS(生产完调度台账!$L$3:$L$200,生产完调度台账!$A$3:$A$200,B4))

按任务单编号回台账汇总产出。配合条件格式 AND($G4>0,$J4>=$G4),完成数达标的那一行会自动加删除线变灰——又是一个「不用图表、不用 VBA」的可视化。

原理|FILTER 的第三参数 "" 不能省:没有匹配结果时返回空白而不是 #CALC!。溢出区域下界预留到第 25 行,新增计划时结果自动往下长;公式只在 A4 一格,其余格子是溢出内容,改不动也删不掉。

四、第三张表:全表只录 5 列,其余 8 列查回来

图 5|黄色=手填(任务单编号、产出日期、产出、废品、转出),蓝色=VLOOKUP 自动带回

这是整套表最关键的设计。车间报产只需要回答五个问题:哪一单、哪天、做了多少、废了多少、转出多少。图号、零件、工序、工段、去向、计划量、起止日期这些主数据,如果让人再填一遍,迟早和计划表对不上。

公式 ⑩|B3 等 8 列同构的 VLOOKUP复制公式

=IF($A3="","",IFERROR(VLOOKUP($A3,生产计划!$C$4:$O$200,2,0),""))

只换第 3 参数(列序号)就能复制出 8 列:工段=2、图号=3、零件=4、去向=5、工序=6、计划量=11、开始=12、完成=13。外层 IF 让空行保持空白,IFERROR 让查不到的编号显示空而不是 #N/A。

数据验证
规则
作用
A3:A200 列表
=生产计划!$C$5:$C$59
任务单编号只能从计划表里选,主键不会写错
D3:D200 自定义
IF(AND(ISNUMBER($I3),ISNUMBER($J3)),AND(D3>=$I3,D3<=$J3+10),TRUE)
产出日期必须落在计划窗口内(最多宽限 10 天)
A3:N200 条件格式
$L3>=$K3
产出 ≥ 计划量时整行高亮,$A3=0 空行不着色

4.1 同一张表右侧:四个条件格做出模糊查询

图 6|T2 / V2 / X2 / Z2 四个条件格,R5 一条 FILTER 溢出查询结果

公式 ⑪|R5 四条件 FILTER 调度查询复制公式

=FILTER(A3:N200,   (IFERROR(FIND(T2,B3:B200),0)) *        ← 工段包含   (IFERROR(FIND(V2,E3:E200),0)) *        ← 图号包含   IF(X2=0, 1,                            ← 起始日期留空则放行      (D3:D200>=X2) *      (D3:D200<=IF(Z2=0,DATE(9999,12,31),Z2))),   "无匹配记录")

四个条件相乘:工段模糊包含、图号模糊包含、起始日期、结束日期。

条件格
标签位置
对应筛选
留空时
T2 工段
S2「工段:」
FIND 模糊包含 B 列
全部工段
V2 图号
U2「图号:」
FIND 模糊包含 E 列
全部图号
X2 起始日期
W2「起始日期:」
D 列 ≥ X2
不限起点
Z2 结束日期
Y2「结束日期:」
D 列 ≤ Z2
不限终点(代入 9999-12-31)

踩坑提醒|两个容易写错的点:标签在 S2/U2/W2/Y2,输入框是它右边一格 T2/V2/X2/Z2,别对着标签取错单元格;FIND(空,文本) 返回 1,所以条件留空时自动变成「不筛选」,而 IFERROR 把找不到的情况归 0 —— 一放一收,正好构成模糊查询。

五、第四张表:把每天的产出「分配」到格子里,再自己下结论

图 7|B2 选工段,G:AK 是本月日期轴;台账里的每条产出会自动落到「某天 × 某图号」的格子里

5.1 先拉出本工段的图号清单

公式 ⑫|A5 本工段图号清单复制公式

=FILTER(CHOOSECOLS(生产计划!$E$5:$M$59,1,2,4,7,9),生产计划!$D$5:$D$59=$B$2,"本月无计划")

从计划表 E:M 里挑 5 列:图号、零件名称、工序、期末结存(当作月初结存)、计划数量,正好对应 A:E 表头。这里用的是精确匹配=$B$2,与任务单里的 FIND 模糊包含不同——报表要按工段严格归集,不能把名字相近的工段算进来。

5.2 日期轴自动停在月末

公式 ⑬|G3 / H3 月度守卫复制公式

=IF(G3="","",IF(MONTH(G3+1)<>生产计划!$O$1,"",G3+1))

G3 是 =DATE(生产计划!$L$1,生产计划!$O$1,1);H3 起逐格 +1,但每加一天先判断 MONTH(下一天) 是否还等于 O1 的月份——一旦跨月就返回空,后面的格子跟着连锁变空。28/29/30/31 天全自动适配,不需要每月手动删列。第 4 行 =G3 镜像给表头显示「日」。

5.3 三条件分配:SUMIFS 代替透视表

公式 ⑭|G5 某天 × 某工段 × 某图号的产出复制公式

=IF(OR($A5="",G$3=""),"",SUMIFS(生产完调度台账!$L$3:$L$200,生产完调度台账!$D$3:$D$200,G$3,生产完调度台账!$B$3:$B$200,$B$2,生产完调度台账!$E$3:$E$200,$A5))

日期 = 表头 G$3、工段 = $B$2、图号 = $A5,三个维度一锁,台账里那一条产出就自动落到正确的格子。向右拖满 31 列、向下填满行,就是一张打开即最新、不用右键刷新的产出透视表。OR($A5="",G$3="") 让空行和短月的空列不参与计算。

后面三列把这套数字收口:

列
公式
含义
F 欠品
=IF($A5="","",E5-D5-AL5)
计划数 − 月初结存 − 合计产出
AL 合计产出
=SUM(G5:AK5)
整行日期格求和
AM 实时库存
=IF($A5="","",D5+AL5-SUMIFS(生产完调度台账!$N$3:$N$200,生产完调度台账!$B$3:$B$200,$B$2,生产完调度台账!$E$3:$E$200,A5))
月初结存 + 累计产出 − 累计转出

公式 ⑮|AN5 自动结论(写成人话)复制公式

=IF(A5=0,"",IF(F5>0,"计划未完成",IF(AL5>E5,"超计划产出或重复录入,请排查","")))

不是冷冰冰的数字,而是中文判断:还欠着就说「计划未完成」,产出超过计划数就提示「超计划产出或重复录入,请排查」。原文件里 154-00-00004 这一行计划数为 0 却录了 25 件产出,结论列立刻报出异常——表格自己会查错。

结论|AN 列还有条件格式按 $AL5>$E5 标红、$F5>0 标灰、AND($F5<=0,$E5<>0) 提示;F 列欠品 >0 着色;周末与今日列沿用第一张表同款规则。三张表的可视化语言是统一的,看表的人不用重新学一遍。

六、第五张表:换个月份,日历自己把星期对齐

图 8|2026 年 11 月的日历:10/26 起、12/6 止,跨月自动变灰;每格显示「累计入库 / 累计计划」

这张表最讨喜。它不插入任何日期控件,也不用硬编码的日历数字,42 个日期格全部由一条公式推出来。

公式 ⑯|B7 本月 1 号所在周的周一复制公式

=DATE(生产计划!L1,生产计划!O1,1)-WEEKDAY(DATE(生产计划!L1,生产计划!O1,1),2)+1

WEEKDAY(日期,2) 让周一=1、周日=7。用本月 1 号减去它的星期序号再加 1,就退回那周的周一。2026-11-01 是周日(7),所以 B7 = 11/1 − 7 + 1 = 10/26(周一)。接下来 C7=B7+1 … H7=G7+1、B9=H7+1 …… 一路加到第 6 周,日期天然落在正确的星期列下。

公式 ⑰|B8 一格里的「累计入库 / 累计计划」复制公式

=SUMIFS(台账!$L$3:$L$200, 台账!$D$3:$D$200,"<="&B7,                     台账!$F$3:$F$200,"*"&$I$3&"*",                     台账!$H$3:$H$200,"成品库")  & "/" &  SUMIFS(计划!$M$5:$M$200, 计划!$N$5:$N$200,"<="&B7,                     计划!$F$5:$F$200,"*"&$I$3&"*",                     计划!$G$5:$G$200,"成品库")

两次 SUMIFS 都用 "<="&日期 取累计值(不是当天值),产品名用 "*"&$I$3&"*" 模糊匹配,再用「去向 = 成品库」只算入库;中间 &"/"& 把两个数字拼成 39/15 这样的字符串。

I3 是零件名称下拉,来源直接指向 生产完调度台账!$F$3:$F$200;F5 = 生产计划!$O$1 把月份单独放一格,专门给条件格式用:MONTH(B$7)<>$F$5 时把上月尾、下月头的日期和数值整片压灰。

图中 11/12 那格从 0/0 跳到 39/0、次日变成 39/15,正是原文件缓存里的真实结果——累计入库 39 件、累计计划 15 件。换产品、换月份,42 个日期格和 42 个累计数一起重算,没有一行需要手改。

七、想复刻?按这 8 步搭

  1. 先定参数
    :在生产计划表留两个单元格放年、月(L1 / O1),所有标题、日期轴、日历基准都引用它们,绝不从标题文本里抠数字。
  2. 建主数据表
    :列好订单、工段、图号、零件、去向、工序、台数、台量、结存、计划量、起止日期;用 TEXT(日期,"yyyymm")&TEXT(ROW(),"0000") 生成任务单编号当主键。
  3. 给主键加约束
    :编号公式要求「图号 + 开始日期」都填了才生成;计划量用数据验证卡住下限;去向做成下拉。
  4. 铺日期轴
    :用 SEQUENCE + EOMONTH 溢出本月天数,预留 31 列并在第 31 列加空值守卫;条件格式画甘特条、周末、今日线。
  5. 建事务流水表
    :只留 5 列手填(编号、日期、产出、废品、转出),其余全部 VLOOKUP 查回来;编号列做数据验证下拉,日期列做窗口校验。
  6. 做派工与查询
    :FILTER + CHOOSECOLS 按工段派工,右侧再用四条件 FILTER 做模糊调度查询,条件留空要能放行。
  7. 做报表与日历
    :报表用 SUMIFS(日期 × 工段 × 图号) 把流水分配到格;日历用 WEEKDAY 找周一、逐格 +1,数值行用两次累计 SUMIFS 拼 实绩/计划。
  8. 补上结论列与异常提示
    :欠品、超产、完工,用一列 IF 写成中文;再配条件格式着色。表格从「记录数字」升级成「替你判断」。
图 9|十条核心公式速查,点文章里每个公式框右上角的按钮可单独复制

划重点|区域范围统一收在 3:200 / 5:59 这类有限区间,不要写 A:A 整列。这份文件有 5,300 多条公式,其中上千条是 SUMIFS;整列引用会让每次重算都扫 100 万行,一改一个卡。

八、值得抄的是结构,不是公式

图 10|把思路拉直,并和低代码 / 多维表逐项对比

低代码和多维表现在确实能更规范地完成协同、权限和留痕。但把这套 Excel 的结构看明白,换任何工具都用得上:

  • 主数据 / 事务数据分家
    :计划表只放「要做什么」,台账只放「实际做了什么」,靠任务单编号关联。这是所有 MES 的最小原型。
  • 录入口越薄,数据越准
    :能查回来的不让人再填,能算出来的不让人再抄,能用数据验证挡住的错误别留到对账时。
  • 用 SUMIFS 代替透视表
    :预先铺好维度网格,公式自己把流水分配到格子里,打开即最新,不用刷新。
  • 让表格自己说结论
    :把异常写成中文提示,比让人盯着一堆数字自己判断可靠得多。
  • 参数集中、可视化统一
    :一个年月开关驱动全簿;周末、今日、完成、超产在几张表里用同一套颜色语言。
场景
这套 Excel
低代码 / 多维表
怎么选
多人同时录入 / 权限分级
文件锁,共享体验差
天然支持,按角色授权
多人协作就上多维表
数据留痕、版本回溯
需另建月度副本
自带记录历史与操作日志
要审计就别硬扛 Excel
字段变更、流程调整
改公式 + 改引用区域,容易断
改字段 / 改视图,成本较低
结构常变时用低代码
一人维护、几十行计划、要离线
打开就用,不依赖网络与账号
要先搭应用、配权限
这个场景下 Excel 反而最轻
一次性算清甘特 / 日历 / 结论
条件格式 + 动态数组即可
往往要写脚本或配组件
Excel 的表达力被低估了

结论:一套「一人维护、单机可跑、当月几十行计划」的小厂管控,用 Excel 把参数、主键、录入口、聚合、可视化这五件事理顺,已经足够自动化;而且这套思路可以直接搬进任何系统。

九、几个必须先知道的坑

  • 版本
    :SEQUENCE / FILTER / CHOOSECOLS 需要 Excel 365、2021 或新版 WPS。原文件由 WPS 保存,公式在 XML 里带 _xlfn._xlws.FILTER、_xlfn.CHOOSECOLS 这类前缀属正常兼容写法,用旧版 Excel 打开会显示 #NAME?。
  • 日期是数字
    :文件里 46327 就是 2026-11-01。所有比较、"<="&单元格 都依赖它是真日期,别把日期列存成文本。
  • 溢出区域不能手填
    :A4、A5、R5 这些是动态数组的锚点,右侧/下方的溢出格里手动写东西会触发 #SPILL!。
  • 条件格位置
    :台账里标签在 S2/U2/W2/Y2,输入框在 T2/V2/X2/Z2;写公式或做说明时别错位。
  • 条件格式优先级
    :今日列和周末列可能重叠,最终颜色由规则顺序决定;原文件把计划条设为优先级 1(最高)。
  • 空值守卫
    :第 31 列、报表第 31 天、日历第 6 周,都要用 IF(上一格="","",…) 或 MONTH()<>月份 处理短月,否则末尾会多出莫名其妙的 0 或灰格。
  • 主键一变,全链要重算
    :任务单编号由「开始日期 + 行号」生成,改动开始日期会换编号,台账里已录的产出就对不上了。上线前最好把编号冻结成值,或改成不会随日期变化的方式。

回首页,搜索你想要的文档

在首页搜索框输入关键词,快速定位资料

文库首页搜索指引 立即搜索

相关学习资料