ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

Excel动态甘特图制作教程:条件格式+今日线实现项目排期

Excel动态甘特图制作教程:条件格式+今日线实现项目排期 做项目跟踪这几年我身边换过不少协作工具最后发现被反复打开的文件居然还是Excel。原因特别简单汇报对象要Excel、数据源在Excel、历史表也是Excel。而甘特图这件事过去被很多人想复杂了——以为非要上Project、OmniPlan其实Excel里用条件格式画的甘特图只要再加一条会自己往前跑的“今日线”日常排期和进度汇报完全够用甚至比某些重型软件更轻快。这篇文章就讲讲我怎么用Excel从零做带动态今日线的甘特图。内容覆盖底层表格结构、条件格式绘图逻辑、今日线的两种实现方式尤其是用散点图叠加的做法以及配套的任务状态自动判定和踩坑记录。适合需要在Excel里做项目排期、进度跟踪、生产计划的朋友哪怕你对公式和图表不熟照着做也能复制一套自己的模板。1. 用Excel画甘特图不是将就是刚需1.1 为什么我不再一上来就推荐专业项目管理软件很多人一听到项目排期第一反应是推荐微软Project、Teambition、Trello之类。但实际用下来Excel依然是无法绕开的载体内部数据库导出的时间表是Excel领导要的周报是Excel客户要的可编辑计划模板也是Excel。把甘特图和计划、任务、负责人放在同一个文件里减少一次转换就少一次人工误差。还有一个现实问题是软件版权和安装权限。公司电脑不一定允许装额外客户端就算装了IT权限不足也白搭。用Excel做的甘特图双击打开就能看不需要服务器不需要登录随时加密传到外部也不怕数据泄露。这不是说专业工具不好而是说对一个几十行任务的中小型项目Excel的成本和门槛已经低到几乎可以忽略。另一个被低估的点是可编辑性。用Project做的计划发给甲方或领导没装软件的人根本没法看在线协作工具又经常遇到外部协作者没有账号的尴尬。Excel文件人人都有接收方可以自己拖拽日期、改负责人、加备注这在实际项目沟通中特别重要。尤其是做项目集管理的人经常要汇总多个子计划Excel的合并成本远比专业软件低。1.2 传统Excel甘特图的痛点在于图不动我最早接触Excel甘特图是在一张巨大无比的排期表里。那会大家怎么画选中日期区域的单元格手动填充背景色。任务开始那天拖动到结束那天涂成蓝色没开始的先空着做完了再涂成绿色。看上去花花绿绿还挺像回事但问题非常致命改一次排期就要重涂一次漏涂、错涂是家常便饭第二周打开文件图还是上周的样子没有人记得更新今天的位置。真正的动态甘特图核心应该解决两件事一是任务条随开始日期、工期自动伸缩二是今天这条线自己在图上跑。第一件靠条件格式就能做到第二件则需要把系统日期接进图里。这两件事都不难难的是很多人不知道Excel原生功能就够用不需要VBA不需要插件更不需要手工画形状。1.3 加了今日线之后这张表会变成什么样子简单描述一下做完之后的效果左侧是任务清单包含编号、任务名称、负责人、开始日期、工期、结束日期右侧从项目开始日期到结束日期每一列代表一天。每个任务在日期区域以一条深色色条表示起止区间周末和节假日自动用浅灰色底隔开。最关键的是图表中间始终立着一条红色竖线今天在哪这条线就在哪。今天是多少号系统知道打开文件就自动定位不用任何人去挪。在今日线的基础上我可以让未开始进行中已逾期这些状态自己算出来还能让未来三天内到期的任务自动变黄。也就是说这张表已经从给人看的图变成了会提醒你的排期看板。下面按步骤拆开讲。2. 数据是图的底盘先把任务表和日期行搭对2.1 任务表字段怎么设计决定了后面少踩多少坑我看到过不少网友自己做的甘特图失败原因多半是表结构太随意。甘特图看起来是图画问题实际上本质是数据问题。任务表至少需要以下几个字段编号、任务名称、负责人、开始日期、工期、结束日期。我个人还会加两列完成标记、状态后面自动化判断用得上。以第4行开始放任务数据为例表格列可以这样安排列字段说明A编号任务唯一标识如T001B任务名称当前任务或阶段名C负责人配合数据验证做下拉选择D开始日期必须是Excel可识别的真日期E工期按天计算填数字F结束日期用公式生成不要手输G完成标记填是或留空H状态用公式自动生成结束日期是我一定要用公式的地方。它不应该手工输入而应该写成D4E4-1。为什么要减1因为开始日期当天就算1天工期3天且开始日期是1号时结束日期是3号而不是4号。如果算法不一致后面条件格式画出的甘特条会多一天或少一天排期表看起来总是不对劲。工期如果允许半天的粒度建议把工期单位改成小时或0.5天公式逻辑不变。开始日期和工期这两列一个必须严格是日期一个必须严格是数字。很多新人在开始日期里写1月5日-1月8日这种文本后面全盘皆输。先确保这两列规范再谈美化。2.2 日期行每一列代表一天任务表下方或者上方要有一行日期行它相当于甘特图的横坐标。我习惯把日期行放在第2行任务数据从第4行开始第3行放表头整个日期区从I列开始。为什么从I列开始因为左侧A到H是任务信息右侧吐出一大片区域专门画日期逻辑清晰。在I2输入MIN(D4:D100)取所有任务里最早的开始日期防止手工敲错。J2输入I21然后向右拖动填充到项目结束日期所在的列。如果排期表规划了90天就拖到第90列。日期行不要合并单元格不要把它变成2024/1/1-2024/1/7这种文本条件格式判断日期靠的是单元格里的真日期值不是看起来像日期的字符串。日期行生成后可以把这一行字号缩小或者把日期格式改成d只显示几号月份则靠第一行的月份行配合。习惯上我会在上方再加一行月份合并单元格比如2024年1月跨31列不过那是美化阶段的事不影响核心功能。2.3 核心驱动单元格藏好TODAY()整个甘特图动态的核心其实是Excel内置的TODAY()函数。在任何一个空单元格比如参数区的N1输入TODAY()返回的就是系统当天日期。每次打开文件或者触发重算这个值都会自动刷新。后面要用它做今日线、状态判断、延期天数计算。容易忽略的一点是TODAY()是易失函数意思是你做任何操作触发了工作簿重算它都会重新读取系统日期。如果文件发到别人手里打开时显示的自然是对方系统当天。这个特性对我们做动态排期是好事但有时候开会前想让图冻结在某一天就需要额外做一个开关单元格后面第6章会讲具体做法。另外日期行和参数区里的日期一定要确认是Excel的日期序列值而不是肉眼看着像日期的文本。判断方法很简单用公式ISNUMBER(N1)返回TRUE就是真日期返回FALSE就是文本。这一步值得花30秒检查。2.4 假日期是条件格式的第一杀手我在网上回答Excel问题时日期变成文本导致条件格式失灵是最高频的问题之一。表现是日期看起来明明是2024-01-01但条件格式死活不生效下拉筛选也按字母顺序排而不是按日期排。原因往往是数据从别的系统导出或者从网页复制粘贴进来Excel没能自动识别成日期。解决办法有三种一是选中日期列后用数据→分列→下一步→下一步→列数据格式选日期→完成这是最稳妥的批量转换二是用公式DATEVALUE(2024-01-01)把文本转成日期值三是用--A1的运算技巧强制转换。判断是否转换成功还是上面说的ISNUMBER()。这一步没做干净后面条件格式、状态公式、散点图全都会出怪病。我在做模板时会专门把开始日期和结束日期两列做一次体检宁可慢一分钟不然后面排查一整天。3. 条件格式当画笔甘特条是这样刷出来的3.1 换个思路把每个单元格当成一个像素条件格式画甘特图的思路可能和大多数人想的不一样。它不是每行画一个形状而是把日期区域的每一个单元格当成一个像素当这个像素所在的列日期落在某任务的开始日期和结束日期之间时这个小方块就填充上任务颜色。也就是一个二维判断横向上列日期是否落在任务区间内纵向上每个任务行独立判断自己的区间。最终效果就是每个任务对应的那一段日期列全部被点亮看起来就像一根任务条。这个思路最大的好处是任务一旦拖动开始日期或工期甘特条自动跟随不需要人工重涂。整个画图过程甚至不需要任何VBA只需要写对一条条件格式公式选中一整片区域应用即可。下面把步骤拆开。3.2 新建规则一个公式刷出所有任务条假设日期区域从I4开始也就是第一个任务的第一天从I列开始显示。选中I4到最后一个日期列和最后一个任务行的区域比如I4:BH100。选区域的时候要注意活动单元格保持为I4这一点非常关键因为条件格式公式是以活动单元格为基准写相对引用的。执行开始→条件格式→新建规则→使用公式确定要设置格式的单元格输入AND(I$2$D4,I$2$F4)然后设置填充颜色比如深蓝色点确定。这一条公式应用到整个I4:BH100区域后每个单元格都会以自己所在列和行去判断当前单元格的列日期I$2行锁死是否大于等于本行开始日期$D4列锁死同时小于等于本行结束日期$F4列锁死。两个条件同时成立说明这一天确实排了这个任务于是显示任务色。解释一下引用方式I$2表示列可以随单元格移动变化行始终锁定在第2行日期行$D4表示列锁定在D列行随单元格移动变化$F4同理是结束日期列。混合引用是条件格式能一次刷全表的精髓很多新手在这步卡住要么把$加错了要么活动单元格选错了位置结果颜色全跑偏。3.3 周末和节假日自动灰规则的顺序才是关键光有任务条还不够日期区一整片都是白的看不出节奏。我习惯把周六周日改成浅灰底一眼扫过去就能看出哪些日子是周末。新建第二条规则还是用公式OR(WEEKDAY(I$2,2)6,WEEKDAY(I$2,2)7)设置浅灰填充。WEEKDAY的第二个参数用2意思是周一返回1、周日返回7所以返回值6和7就对应周六和周日。这里有个大多数教程不会提的细节规则顺序决定显示优先级。打开条件格式管理规则把任务条规则放在最上面周末规则放在下面同时任务条规则要勾选如果为真则停止。这样处理的效果是有任务的周末格子显示任务色没有任务的周末格子显示灰色。如果不勾选停止两条规则会同时生效填充色互相覆盖很容易出现周末有任务时灰色把蓝色盖住的情况。节假日同理可以把法定节假日列在一个隐藏工作表里命名为Holidays然后第三条件公式写COUNTIF(Holidays,I$2)0设置浅灰填充规则顺序放在任务条规则后面、周末规则前面或后面都行只要不勾停止没任务时才会显示灰色。3.4 里程碑怎么标不用长条用菱形项目排期里除了普通任务还有一类东西叫里程碑比如需求评审通过版本上线。里程碑不占工期就是某个时点的一个标记。如果也画成长条会误导看图的人。做法是在任务名称列加一个标记比如A列或B列写里程碑三个字然后新建条件格式公式AND($A4里程碑,I$2$D4)设置格式时字体选Wingdings或Symbol类型输入一个类似◆的字符颜色设成红色居中对齐。这样里程碑当天会显示一个菱形而不是长长的一条。实际应用中我会在完成标记列旁边单独开一列写节点类型保证判断条件不冲突。4. 动态今日线从一行TODAY()到图表层叠加4.1 方案A条件格式给今天竖一条边最简单的今日线做法还是用条件格式。新建一条规则公式I$2$N$1其中N1是之前放的TODAY()。这条规则会让今天对应的整列单元格被选中然后给这些单元格设置左边框为红色粗线。视觉效果就是每个任务行在今天的左边框都有一条红边连起来看就是一条竖线。如果还想更醒目可以同时给这一列加一个很淡的浅红填充但要注意它会把任务色覆盖掉所以多数情况我只加边框不加填充。方案A最大的优点是简单、不会浮在表格上遮挡操作打印报告时也能直接带出这条线适合内部日常跟踪用。缺点也明显它是由每个单元格的左边框拼出来的视觉效果比较碎不够精致尤其行高比较大时横向的网格线会把这条竖线切成几段。4.2 方案B散点图叠加一根真正贯穿的红线如果要做给领导看、放到大屏或者项目周报里我推荐用散点图叠加法做出来是一条连续的、贯穿上下任务行的红色竖实线视觉上职业得多。操作步骤拆开说。第一步确认N1单元格有TODAY()。第二步插入一个空白散点图。在Excel菜单里选插入→图表→散点图→仅带数据标记的散点图。第三步准备一个两行的数据区域。我习惯在工作表边缘放一个小块比如Z1:AA2XYN10.5N1COUNTA(B4:B100)0.5然后右键图表选择数据添加一个系列X轴选Z1:Z2Y轴选AA1:AA2。这个系列画出来就是两个点两点X坐标相同、Y坐标不同。再把系列改为带直线和数据标记的散点图这两个点之间就会连出一条垂直线。第四步隐藏数据点。选中数据点设置数据标记选项为无这样图上只留下一根线。第五步设置坐标轴范围这是最容易被忽略的一步。右键水平轴设置坐标轴格式边界里的最小值和最大值需要填日期序列值。Excel的日期本质是数字比如2024年1月1日对应45292左右。为了准确可以在两个空单元格分别使用N(MIN(D4:D100))和N(MAX(F4:F100))把返回值抄到坐标轴边界的输入框。垂直轴的最小值填0.5最大值填COUNTA(B4:B100)0.5这样红线会从第一行任务上方一直画到最后一行任务下方。第六步清理图表外观。把水平轴、垂直轴的标签和线条都设为无网格线删除图例删除。图表区的填充设为无填充边框设为无边框绘图区同样处理。把图表移动到甘特图日期区上面按住Alt键拖动边缘图表边缘会自动吸附到单元格网格线这样就能和表格精确对齐。最后把线条颜色改成红色粗细设为2磅左右。4.3 方案A与B如何取舍维度方案A 条件格式边框方案B 散点图叠加实现成本5分钟15-20分钟视觉效果一般适合打印精致适合汇报展示是否遮挡表格不遮挡图表浮在上层编辑时需移开缩放适应性随表格自动适应缩放比例变化时可能需要重新对齐复杂报表定制无法再做更多变化可以再加多条竖线做里程碑我的建议是自己用或团队内部用直接上方案A需要对外汇报文件、放在大屏展示就用方案B。如果时间允许把方案B的浅红填充和高亮也保留着方案B负责画线方案A负责给整列加一点淡淡的背景色两不冲突。5. 今日线还能带动什么状态判定与预警自动化5.1 状态列进行中、已逾期、未开始自动算今日线只是可视化但它的价值远不止好看。只要有了TODAY()我们完全可以顺手把任务状态列变成公式自动生成。接前面第2章的表结构H列是状态G列是完成标记。H4写IF(G4是,已完成,IF(TODAY()F4,已逾期,IF(TODAY()D4,进行中,未开始)))这个公式的逻辑顺序很重要先判断是否已完成再判断是否逾期最后判断是否进行中。如果把逾期判断放在前面一个已经完成但结束日期已过的任务会被错误标成已逾期因为完成标记可能还没来得及填。公式优先级解释已经填了是的任务无论日期如何都显示已完成没完成且今天大于结束日期说明拖过去了显示已逾期没完成但今天已经到开始日期或晚于开始日期显示进行中连开始日期都没到就是未开始。5.2 延期天数逾期一目了然光知道已逾期不够还要知道逾期多少天。可以在状态列旁边加一列延期天数IF(G4是,,IF(TODAY()F4,TODAY()-F4,0))这个公式只有两个分支已完成的任务不显示延期防止历史逾期干扰未完成但今天大于结束日期时算出延期天数否则显示0。再配合条件格式把延期天数大于0的单元格标成红色加粗打开文件的一瞬间哪些任务出了问题非常直观。我还会给已逾期状态做第二层条件格式让整个状态列变红底白字。在Excel里这叫用公式确定要设置格式的单元格公式写$H4已逾期然后应用到H4:H100区域即可。5.3 未来3天到期预警打开文件就知道哪些要催今日线往前走我们关心的不只是已经晚了的活还有马上要到期的活。这个用公式判断也很快。在日期区域或者任务信息区域加一条预警规则公式AND($G4是,$D4TODAY(),$F4-TODAY()3,$F4-TODAY()0)意思是任务未完成、今天已经在这个任务的执行区间内、距离结束日期还有0到3天。同时满足时把整行或整个日期条标成黄色。放在预警规则里应用到A4:I100或I4:BH100都可以。这样一来每周一打开排期表今天线会告诉你现在在哪个阶段黄色预警会告诉你未来三天必须收口的任务有哪些红色状态会告诉你已经拖了多少天。不用人肉核对也不容易漏项。这就是把静态甘特图变成动态排期看板最有价值的地方。5.4 顶部汇总看板把散落的进度攒成一个仪表盘最后再往顶部加一个小的汇总区。用COUNTA(B4:B100)统计总任务数用COUNTIF(H4:H100,进行中)统计进行中数量用COUNTIF(H4:H100,已完成)统计已完成数量用COUNTIF(H4:H100,已逾期)统计已逾期数量。完成率可以用COUNTIF(H4:H100,已完成)/COUNTA(B4:B100)计算然后插入一个数据条视觉上就是一根进度条。这个汇总区可以放在表格最上方几行也可以放到单独一个看板工作表。我习惯放在顶部这样打开文件不用下拉就能看到全局状态。配合今日线整张表就形成了一个完整闭环有图、有状态、有汇总、有预警。6. 模板化改造与踩坑记录把这张图变成月度可复用的东西6.1 模板化把排期表变成可复用的资产整套做完之后第一件事就是把文件另存为模板。你可以把任务表区域直接套用Excel表格快捷键CtrlT这样新增行时公式会自动向下填充条件格式区域通常也会跟着扩展。不过要注意套用表格后有些手动画的边框和散点图位置可能需要微调建议先备份一个未套用表格的版本。我自己的做法是做一个空白模板工作簿里面保留全部条件格式、公式、今日线散点图但任务表里只留示例数据。每月或者每个新项目开始时复制这个模板清空任务内容只修改开始日期和工期整张图会自动刷新。负责人列可以加数据验证下拉选项来自一个成员名单工作表选人时不会敲错名字。保存时建议另存为xltx模板文件放到一个固定目录。如果不方便用模板格式直接保留一个空白xlsx备份也一样关键是拿到就能改改完就能用。6.2 日期区域不够宽怎么办项目中途新增了任务或者整个计划往后顺延原来预留的日期列不够用是常事。第一步在最后一个日期列的右侧插入新列Excel默认会复制左侧列的格式和公式第二步把新列第2行的日期公式手动拖过去比如原来到BH列插入新列后BJ2填BH21第三步回到条件格式管理规则把应用范围从I4:BH100改成I4:BJ100第四步如果用方案B散点图还要更新水平轴最大值。这一点是模板最容易卡壳的地方。所以我通常一开始就把日期区做到足够宽比如90天甚至120天用不到的部分直接隐藏列。隐藏列不会影响条件格式和散点图等需要时再取消隐藏比临时插列省事得多。6.3 踩坑1粘贴数据后条件格式全乱症状是从其他表格复制数据粘到任务表后日期区很多填充色消失或者变成了奇怪的条纹。原因是粘贴操作把源单元格的条件格式也带进来了覆盖掉原有规则。解决方法是养成习惯向任务表粘贴数据时右键选择选择性粘贴→值或者选择性粘贴→值和数字格式千万不要用默认的CtrlV。如果已经搞乱了打开条件格式管理规则把多余的新规则删掉再把应用范围改回来。粘贴前先做个备份成本最低。6.4 踩坑2日期变成了40367这大概是Excel里最经典的看起来像错误其实不是错误的问题。40367其实是日期的序列值只是单元格格式被设成了常规。处理方法是选中这些单元格右键设置单元格格式分类选日期选一个自己喜欢的日期格式。但要注意一种特殊情况明明设成了日期格式显示还是不对而且日期整体差一天或四天。这通常和日期系统有关。Excel在Windows上默认使用1900日期系统Mac上有时候会启用1904日期系统两个系统同一个日期序列值对应的日期不一样。如果你经常和Mac用户交换文件建议在两台机器上打开同一个文件看看日期有没有偏移如果有在文件→选项→高级→使用1904日期系统里统一一下。这个问题不常见但一旦遇到非常头疼提前了解能省很多排查时间。6.5 踩坑3散点图和表格错位方案B的散点图最怕插入列和改变列宽。插入列后表格里的日期列位置整体右移但散点图X轴坐标范围和图表覆盖位置不会自动变红线就会对不上日期。解决办法是插列后重新检查坐标轴边界必要时把图表重新对齐到新的区域上。还有一个显示层面的问题工作表缩放级别变化时散点图位置不跟随缩放看起来会暂时错位打印或恢复100%缩放后就会正常。如果每次打开文件默认缩放不是100%建议在视图→缩放里把工作表比例固定或者干脆把缩放设置成100%减少误判。6.6 踩坑4发给别人后今天自动变成了对方打开那天这个坑和TODAY()的特性直接相关。你周五做完排期表周末发给领导领导下周一打开今日线自动跑到了周一原本还有3天到期的任务可能已经变成已逾期。这在大多数场景下是动态效果的正确表现但有时候客户要求看到的计划是以某一天为基准的冻结版本。我常用的解决办法是加一个快照控制单元格。把N1的公式从TODAY()改成IF($P$1,TODAY(),$P$1)P1留空时跟随系统当天需要冻结某天时在P1输入一个具体日期比如2024-06-01今日线就固定在那一天。汇报结束后清空P1恢复动态。这样一来动态和冻结两种模式可以在同一个文件里切换既满足日常跟踪也满足对外发布。最后说一句我自己的使用感受。这套东西我从最早的手拉色块改到现在的动态版本大概花了两个晚上之后每次排周计划只需要改开始日期、工期和完成标记今日线自己会走状态自己会变。真正让我觉得值回票价的不是某一次汇报上的漂亮展示而是它让我不用再每周手工更新一次图表。工具朴素一点没关系只要今天打开它它知道今天是哪天这才是有生命力的排期表。如果这篇文章对你有用建议先按第2节搭表再逐步加条件格式和今日线做完记得多存两个版本。有更好的玩法也欢迎交流。
返回列表