做项目计划(PPL)文档最怕什么?不是任务列不全,而是计划刚发下去两周,日期就对不上了。今天我分享的这个 Excel 甘特图模板,核心就一件事:在甘特图上加一条自动跟着今天走的红色竖线——动态今日线。打开文件,线自己停在今天的位置,哪项任务该开始、哪项已经滞后,一眼就能扫出来。适合经常用 Excel 做计划的项目经理、计划工程师,也适合那些不想专门装项目管理软件、又想把计划做得清楚好看的人。
这个方案没有用任何昂贵的项目管理平台,就是最常见的 Excel,配合条件格式、堆积条形图和一点点 VBA。我一开始也怀疑 Excel 做出来会不会很简陋,实际做完之后发现,只要思路对,Excel 甘特图足够专业,而且动态今日线这个功能,很多付费软件反而不如自己做的灵活。下面把我的完整做法和踩过的坑都写出来,你可以直接在现有表格上照着改。
1. 整体设计思路:从「写死」到「动态」的转变
1.1 PPL 文档到底需要什么
PPL 就是 Project Plan,项目计划文档。它表面上就是一张表:任务名称、开始日期、结束日期、负责人、进度。但真正用过的人都知道,项目计划的核心不是"排期",而是"跟踪变化"。计划刚做出来那天怎么排都好看,真正考验人的是第二周、第三周:需求变了、有人请假了、开发延期了,计划文档如果不跟着动,它很快就变成一张没人看的废纸。
所以做这个文档的时候,我给自己定了三条标准。第一,改起来必须快,谁拿到手都能在五分钟内更新一条任务;第二,状态必须一眼可见,打开文件不用逐个看数字,光看颜色和线条就知道哪些任务正常、哪些已经滞后;第三,自动化的部分必须"真自动",不要每次打开文件还要手动改一个"今天"的日期,那等于没做自动化。
基于这三点,整个甘特图被我拆成了三个模块:数据区、展示区、动态机制。数据区就是最原始的任务清单和时间字段,负责接收修改;展示区是甘特图本身,把数据变成横条;动态机制负责让"今日线"自动找到今天的位置。这三个模块互相独立,改数据不会碰坏图表,改图表也不会影响数据,后期维护成本很低。
1.2 为什么是 Excel,而不是专业项目管理软件
我见过不少团队花大价钱上项目管理软件,最后用起来的还是少数人。不是说软件不好,而是对中小型项目来说,学习成本和维护成本往往比项目本身还高。Excel 的好处在于:公司电脑上基本都有,同事之间互相传文件没有门槛,而且你可以随自己的习惯调整布局,自由度极高。
当然,Excel 做甘特图也有明显的短板。没有自动的依赖关系,任务延期后后续任务不会自动顺延;多人同时编辑基本靠微信传文件;宏和 VBA 有时候会被安全策略拦掉。但对我来说,这些短板在"灵活"面前都可以接受。尤其是当领导偶尔问一句"这个任务怎么还没完",我能马上打开文件指着那条红色的今日线告诉他:你看,按计划今天应该开始测试了,现在还在开发,这就是滞后原因。这种沟通效率,是 Excel 给的。
1.3 三个关键模块的拆解
数据表是整个甘特图的底座。我习惯把字段设计成:序号、任务名称、开始日期、工期、结束日期、负责人、进度。其中结束日期不手动填,用公式从开始日期和工期算出来,后面会细说。
展示区有两种做法,我会在本篇里都讲清楚。第一种是用单元格条件格式画的条形图,适合直接在表格里看,适合打印,也适合发给不怎么懂 Excel 的人;第二种是用 Excel 原生图表里的堆积条形图做成的甘特图,视觉效果更接近真正的甘特图。两种方法各有场景,你完全可以做一个"表格版"用于日常维护,再在下方放一个"图表版"用于汇报。
动态机制是重头戏。核心就一个函数——TODAY(),它每天自动返回当前日期。然后围绕它做文章:条件格式里判断今日列并高亮,图表里用辅助系列画竖线,甚至用 VBA 自动计算坐标位置。这条线不是画死的,它会在你每次打开文件时自动落在当天。这就是"动态今日线"的完整含义。
2. 表格搭建与条件格式:让一张普通表先「能看」
2.1 字段设计与日期自动计算
我以"公司官网改版"项目为例,数据表大概长这样:
| 序号 | 任务名称 | 开始日期 | 工期(天) | 结束日期 | 负责人 | 进度 |
|---|---|---|---|---|---|---|
| 1 | 需求调研 | 2025/3/3 | 5 | 2025/3/7 | 张三 | 100% |
| 2 | UI 设计 | 2025/3/10 | 10 | 2025/3/19 | 李四 | 80% |
| 3 | 前端开发 | 2025/3/20 | 15 | 2025/4/3 | 王五 | 40% |
| 4 | 后端开发 | 2025/3/20 | 15 | 2025/4/3 | 赵六 | 40% |
| 5 | 测试 | 2025/4/6 | 7 | 2025/4/12 | 孙七 | 0% |
| 6 | 部署上线 | 2025/4/14 | 3 | 2025/4/16 | 周八 | 0% |
结束日期这一列不要手动填,用公式:=C2+D2-1。为什么要减 1?因为工期默认从开始日期当天算起,比如 3 月 3 日开始、工期 5 天,那结束日期应该是 3 月 7 日,而不是 3 月 8 日。这个细节不注意,后面的甘特图会整体偏一天。
接下来在表格右侧留出一片日期区域。比如 H1 开始放项目开始日期,I1 开始写=H1+1,然后向右拖拽,一直拖到项目结束日期附近。这样每一列就代表一个日期,后续条件格式就是拿每一列的表头日期去跟任务的开始、结束日期比对,命中就打上颜色。
2.2 用条件格式画出任务条
选中日期区域内所有任务对应的单元格,比如 H2 到 AC7,然后新建条件格式规则,选"使用公式确定要设置格式的单元格",输入:
=AND(H$1>=$C2,H$1<=$E2)这条公式的意思是:如果当前列的表头日期 H$1 落在这个任务的开始日期 $C2 和结束日期 $E2 之间,就把这个单元格标上颜色。这样每个任务就会在对应的日期区间里形成一条横条,看起来就是一个最简单的甘特图。
这里有个关键点:公式里的引用方式不能错。H$1 是"列相对、行绝对",这样向右填充时它会变成 I$1、J$1,分别判断每一列;$C2、$E2 是"列绝对、行相对",这样向下填充时会跟着任务行走。如果你在做规则的时候选中的区域不是 H2 开始,公式里的相对位置会整体错位,表现就是颜色标到了别的列,这是最常踩的坑。
2.3 今日高亮列:表格版「今日线」
有了任务条之后,再加一条高亮列规则,就能在表格里做出今日线。同样新建一个条件格式规则,这次要判断整列日期是否等于今天。我在 A2 单元格(或者任意一个空白单元格)放=TODAY(),然后在日期区域继续用公式:
=H$1=$A$2选中整个日期区域(比如 H1 到 AC7),应用这条规则,填充色选一个浅黄色。效果就是:今天对应的那一列整列变黄,而且在所有任务条上面,相当于一条纵向的"今日线"。
实际用的时候要注意规则顺序。条件格式是按先后顺序执行的,今日高亮的规则要放在任务条规则的前面,或者勾选"如果为真则停止",否则任务条的蓝色会盖住今日列的黄色,导致今日线"断断续续"看不清。打开"条件格式规则管理器",拖动规则顺序就可以调整,别嫌麻烦,这个优先级问题我至少被坑过两次。
3. 图表型甘特图制作:原生图表也能很专业
3.1 堆积条形图做甘特图的原理
单元格条件格式虽然简单,但如果你要给领导汇报,或者放到项目周报里,一个真正的图表型甘特图会更专业。Excel 里做甘特图,几乎都是用"堆积条形图"改出来的。
思路是这样的:一个任务对应图表里一个条形,但条形有两个堆叠的系列。第一个系列是"开始日期",数值等于任务的开始日期所对应的日期序列号,但这个系列不填充颜色,完全隐藏;第二个系列是"工期",数值等于工期天数,填充成你想要的蓝色。两个系列堆叠在一起,视觉上就是"第一个系列撑出左边的空白,第二个系列从开始日期的地方画出一条横条"。这个原理理解了,图表设置就很好上手。
3.2 插入图表与数据准备
插入图表之前,先把数据区准备成三列:任务名称、开始日期、工期。直接选中这三列(比如 A1 到 D7,包括表头),点击"插入 → 图表 → 所有图表 → 条形图 → 堆积条形图"。这时候出来的图肯定很乱,先别慌,乱是正常的,我们需要一步步调。
右键图表,选择"选择数据",会看到两个系列:开始日期和工期。确认这两个系列都在,然后开始处理坐标轴。条形图的坐标轴是反的:默认情况下第一个任务在最下面,这不方便看,所以双击垂直轴,在弹出的设置面板里勾选"逆序类别",让第一个任务显示在最上面。
水平轴是日期轴,双击水平轴,在"坐标轴类型"里选"日期坐标轴",然后在"边界"里把最小值设成项目开始日期的序列号。什么是序列号?其实就是这个日期在 Excel 内部对应的数字,你直接在边界输入框里填一个日期格式的值,Excel 会自动转换。比如填 2025/3/3,它就会自动变成对应序列号。最大边界设成项目结束日期,这样图表就不会出现大段多余的空白。
3.3 视觉细节调整
条形图做出来之后,第一步是把"开始日期"系列隐藏。右键选择这个系列,设置数据系列格式,把"填充"改成"无填充",再把"边框"改成"无边框"。因为它是条形,去掉填充后就不再显示任何颜色,但它在坐标轴上的占位依然有效,工期系列会从它右侧开始,也就是从开始日期开始。
然后是最影响美观的几步。删除图例里的"开始日期"项,或者直接在图例上点一下单独删除;隐藏垂直轴网格线,让绘图区干净一些;把工期系列的数据标签显示出来,标签内容可以设成任务名称,这样图表左边就不需要额外的任务名称坐标轴了,整体会非常清爽。
我一般还会把水平轴的字号调小一点,日期格式改成"m/d",避免"2025/3/3"这种长格式挤在一起。另外,工期系列的颜色建议统一用一种蓝色,不要用五颜六色,专业感一下子就出来了。
4. 动态今日线的三种实现方案
4.1 方案一:表格条件格式(零代码,适合表格版)
如果用的是条件格式做的表格版甘特图,动态今日线最简单,就是我在 2.3 节里写的高亮列公式:选一个单元格放=TODAY(),再对日期区域做条件格式判断=H$1=$A$2,整列高亮。这个方案的好处是零代码、稳定、不会因为 Excel 版本不同而出问题,而且打印出来也看得到那条黄线。
缺点是它只在表格里生效,没法叠加到图表型甘特图上。如果你既要表格,又要图表,建议用下面的方案二或方案三。
4.2 方案二:散点图辅助系列 + 直线(不写代码)
在图表型甘特图里,我推荐用散点图辅助系列的方式画今日线。原理是:在图表里多加一个"今日线"系列,这个系列只有两个数据点,两个点的 X 坐标都是今天的日期,Y 坐标分别对应绘图区的最底部和最顶部,然后在图表设置里让它显示为一条直线,就是我们要的竖线。
具体步骤是这样的。先在数据表下方准备两个辅助单元格:
J1 = TODAY() K1 = 0 J2 = TODAY() K2 = 任务数量 + 1这里的 K1 和 K2 是散点图系列在 Y 轴上的两个端点,0 和任务数+1 能确保线从第一个任务上方一直延伸到最后一个任务下方。接下来右键甘特图 → 选择数据 → 添加系列,系列名称填"今日线",X 轴系列值填 J1:J2,Y 轴系列值填 K1:K2。添加之后,右键这个系列,更改系列图表类型,把它改成带直线的散点图,并勾选"次坐标轴"。
这个时候图表会多出两个次坐标轴,不用怕。双击次水平轴,把它的最小值和最大值设置成和主日期轴完全一致,也可以直接引用主轴的边界值;然后把次垂直轴的最小值设成 0、最大值设成任务数+1。设置完成后,选中辅助系列,把数据标记隐藏(无标记),只保留直线,线条设成红色、虚线、粗细 2.25 磅。最后别忘了把次坐标轴的标签都隐藏掉,否则图表两边会出现一堆莫名其妙的数字。
这个方案完全不写代码,纯靠 Excel 原生功能实现,跨平台兼容性很好,Mac 版 Excel 也能用。缺点是辅助系列和坐标轴设置比较繁琐,步骤多,容易漏掉某一步导致线歪了,但只要按上面的顺序做一遍,效果是很稳的。
4.3 方案三:VBA 自动定位(终极方案)
如果你希望今天线"自动出现在正确位置",又懒得每次手动调坐标轴,那用 VBA 是最舒服的。我的做法是写一段宏,在打开工作簿的时候自动执行,读取今天日期和图表绘图区的位置,然后直接在工作表上画一条红色的竖线,位置精确落在"今天"对应的 X 坐标上。
核心代码如下,你把它粘贴到模块里即可:
Sub UpdateTodayLine() Dim ws As Worksheet Dim chtObj As ChartObject Dim cht As Chart Dim plotLeft As Double, plotTop As Double Dim plotWidth As Double, plotHeight As Double Dim minDate As Double, maxDate As Double Dim todayVal As Double Dim xPos As Double, yTop As Double, yBottom As Double Dim lineShape As Shape Set ws = ThisWorkbook.Sheets("项目计划") Set chtObj = ws.ChartObjects("甘特图") Set cht = chtObj.Chart With cht.PlotArea plotLeft = .Left plotTop = .Top plotWidth = .Width plotHeight = .Height End With minDate = cht.Axes(xlValue).MinimumScale maxDate = cht.Axes(xlValue).MaximumScale todayVal = CDbl(Date) xPos = plotLeft + (todayVal - minDate) / (maxDate - minDate) * plotWidth yTop = plotTop yBottom = plotTop + plotHeight On Error Resume Next Set lineShape = ws.Shapes("TodayLine") On Error GoTo 0 If lineShape Is Nothing Then Set lineShape = ws.Shapes.AddLine(xPos, yTop, xPos, yBottom) lineShape.Name = "TodayLine" Else lineShape.Left = xPos lineShape.Top = yTop lineShape.Height = yBottom - yTop End If With lineShape.Line .ForeColor.RGB = RGB(255, 85, 85) .Weight = 2.5 .DashStyle = msoLineDash End With End Sub这段代码的逻辑不复杂,我拆开说一下。cht.PlotArea的四个属性告诉我们图表绘图区在图表里的位置和大小,单位是磅。然后通过cht.Axes(xlValue)拿到水平轴的最小值和最大值,注意在条形图里,数值轴xlValue就是横着的日期轴,不要写错成xlCategory,否则取到的是垂直轴的任务类别,算出来的位置铁定不对。
todayVal = CDbl(Date)是把今天的日期转成 Excel 内部的日期序列号,这个数字和坐标轴上的日期刻度是同一种单位,可以直接参与比例计算。算出来的xPos是绘图区左侧起点加上"今天与项目开始日期的比例偏移量",也就是今日线应该在绘图区里的 X 坐标。
然后判断工作簿里有没有一条叫"TodayLine"的线,如果有就更新它的位置和高度,没有就重新画一条。每次打开文件时运行一次,线的位置就是当天的位置。如果你开着 Excel 跨天不关,也可以加一个Application.OnTime定时器,每隔一分钟刷新一次,但这属于进阶玩法,日常用Workbook_Open事件就够了。
在 ThisWorkbook 里挂载打开事件:
Private Sub Workbook_Open() Call UpdateTodayLine End Sub保存文件时,记得把文件格式选成"启用宏的工作簿"(.xlsm),否则宏根本不会被保存。另外 VBA 在 Mac 版 Excel 上也能运行,但有些细节属性可能不同,建议 Windows 上使用。
5. 常见问题与排查技巧实录
5.1 图表不按日期排序,或者日期轴显示一堆 1、2、3
这个问题十有八九是因为水平轴没有被设置成"日期坐标轴"。如果轴的类型还是"自动"或"文本坐标轴",Excel 会把日期当成普通文本,按顺序排列而不是按时间间隔排列。解决方法是双击水平轴,在坐标轴类型里手动选"日期坐标轴",然后把边界最小值设为项目开始日期、最大值设为项目结束日期。
还有一种情况是开始日期列是文本格式,比如从某个系统导出的日期是"2025/3/3"字符串,Excel 不认它是日期。处理方式是在旁边加一列,用=DATEVALUE()或者=VALUE()把它转成真正的日期,再重新选数据区。
5.2 今日线的位置不对,或者打开文件后没刷新
先检查Workbook_Open事件是否真的在执行。最简单的测试是打开文件后按Alt+F8,手动运行UpdateTodayLine,如果线移动到正确位置,说明宏本身没问题,问题出在事件挂载上。看看 ThisWorkbook 里的代码是不是写错了名称,或者文件是不是没存成 .xlsm 格式。
如果你用的是方案二(散点图辅助线),位置不对基本是次水平轴的边界没和主日期轴同步。手动设置一次边界后,通常能解决。还有一个容易被忽略的点:条形图的数值轴最大值如果包含未来日期,比如你设置了 2025/12/31,那么绘图区会被拉伸得很大,今日线会被挤到很靠左的位置,视觉上好像不对,其实是边界设置的问题,把边界最大值收回到项目结束日期附近就好。
5.3 条件格式错位、颜色不对、今日线被任务条盖住
条件格式错位是表格版甘特图最常见的坑。根本原因是规则里的相对引用和选中区域的活动单元格不对齐。我的排查方法是:选中区域后不要急着应用规则,先看左上角"名称框"里显示的活动单元格是哪个。公式里的相对引用要基于活动单元格来写。比如区域从 H2 开始,活动单元格是 H2,公式第一个引用就写 H$1,向下向右的填充逻辑才正确。
颜色被盖住的问题,在 2.3 已经说过,用规则管理器的"如果为真则停止"就行。如果发现任务条颜色和今日线颜色混在一起很难看,可以把今日线的填充色改成浅红或浅黄,透明度调低一点,总之要让两条规则的颜色明显不同。
5.4 Excel 本体的几个坑
做这个甘特图的过程中,我还遇到过 Excel 本身的一些麻烦。比如突然复制不了、粘贴没反应,排查了老半天发现是剪贴板被某个程序占用了,或者开了多个 Excel 进程导致状态卡死。解决办法是保存文件后彻底关闭 Excel,再重新打开;严重的话打开任务管理器结束所有 Excel 进程,再重新打开文件。
还有一次是打开文件后整个 Excel 窗口显示灰色,点哪里都没反应。这个通常是 Excel 加载项冲突或者文件损坏导致的重绘问题。我当时的处理方法很简单:先杀掉所有 Excel 进程,然后在文件菜单里用"打开并修复"打开文件,再检查一下加载项,把那些常年不用的第三方插件禁用掉。现在很多奇葩异常,十有八九跟加载项有关系,特别是从网上下载的那些"增强工具"。
5.5 Mac 版 Excel 的差异
如果你是 Mac 用户,有几个点要提前知道。第一,ActiveX 控件在 Mac 版 Excel 里不可用,所以别指望插入那些 Windows 专属的日期控件;第二,VBA 虽然能跑,但某些图表属性和形状样式在 Mac 和 Windows 上显示效果有差异,比如虚线样式、形状名称可能不识别;第三,文件名路径、剪贴板行为和 Windows 版不完全一样,复制粘贴的快捷键也别用惯了 Ctrl,Mac 上是 Cmd+C、Cmd+V。
如果主要在 Mac 上使用,我建议优先采用方案二(散点图辅助系列),毕竟不依赖 VBA,兼容性最好。表格条件格式方案也没问题,只要注意日期格式不要被本地化设置带偏,比如用2025/3/3这种带斜杠的格式一般问题不大,用中文"2025年3月3日"就可能出现识别问题。
写在最后:一点个人体会
这个带动态今日线的 Excel 甘特图,其实不只是一张图,它改变的是我看项目进度的方式。以前做周报,我要先打开计划表,找到今天的日期,再一个个核对手头的进度,非常消耗耐心。现在打开文件就是一条线,线左边是已过去的时间,线右边是剩下的工期,哪个任务撞线了、哪个任务还没开始,一清二楚。
我也试着把今日线的功能继续往外扩展过。比如在进度列加一个基于TODAY()的滞后提醒:如果任务结束日期早于今天但进度没到 100%,就用条件格式把任务名称标红;再比如把"负责人"列加一个数据验证下拉框,配合 SUMIFS 函数统计每个人手上有多少任务,做资源负载分析。这些都是基于同一个数据表完成的,不需要额外维护。你要是手头正好有一份计划表,不妨花半个小时把今日线加上去,我猜你用过一次就很难再回去翻日历了。