
做项目计划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/352025/3/7张三100%2UI 设计2025/3/10102025/3/19李四80%3前端开发2025/3/20152025/4/3王五40%4后端开发2025/3/20152025/4/3赵六40%5测试2025/4/672025/4/12孙七0%6部署上线2025/4/1432025/4/16周八0%结束日期这一列不要手动填用公式C2D2-1。为什么要减 1因为工期默认从开始日期当天算起比如 3 月 3 日开始、工期 5 天那结束日期应该是 3 月 7 日而不是 3 月 8 日。这个细节不注意后面的甘特图会整体偏一天。接下来在表格右侧留出一片日期区域。比如 H1 开始放项目开始日期I1 开始写H11然后向右拖拽一直拖到项目结束日期附近。这样每一列就代表一个日期后续条件格式就是拿每一列的表头日期去跟任务的开始、结束日期比对命中就打上颜色。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:J2Y 轴系列值填 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事件是否真的在执行。最简单的测试是打开文件后按AltF8手动运行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 版不完全一样复制粘贴的快捷键也别用惯了 CtrlMac 上是 CmdC、CmdV。如果主要在 Mac 上使用我建议优先采用方案二散点图辅助系列毕竟不依赖 VBA兼容性最好。表格条件格式方案也没问题只要注意日期格式不要被本地化设置带偏比如用2025/3/3这种带斜杠的格式一般问题不大用中文2025年3月3日就可能出现识别问题。写在最后一点个人体会这个带动态今日线的 Excel 甘特图其实不只是一张图它改变的是我看项目进度的方式。以前做周报我要先打开计划表找到今天的日期再一个个核对手头的进度非常消耗耐心。现在打开文件就是一条线线左边是已过去的时间线右边是剩下的工期哪个任务撞线了、哪个任务还没开始一清二楚。我也试着把今日线的功能继续往外扩展过。比如在进度列加一个基于TODAY()的滞后提醒如果任务结束日期早于今天但进度没到 100%就用条件格式把任务名称标红再比如把负责人列加一个数据验证下拉框配合 SUMIFS 函数统计每个人手上有多少任务做资源负载分析。这些都是基于同一个数据表完成的不需要额外维护。你要是手头正好有一份计划表不妨花半个小时把今日线加上去我猜你用过一次就很难再回去翻日历了。