从详细活动生成摘要甘特图
Posted
技术标签:
【中文标题】从详细活动生成摘要甘特图【英文标题】:Generate summary gantt chart from detailed activities 【发布时间】:2020-10-14 04:19:51 【问题描述】:我想创建一个甘特图摘要,从包含多行不同人员活动列表的详细甘特图中按天和单行显示一个人的整个“忙碌”和“空闲”日程安排.
基本上从这个出发:
至此:(我手动创建的)
能够总结人们在活动之间的空闲时间轮班。
现在我只是使用这个公式来比较每一行中的开始日期和结束日期,如果条件为真则产生一个“1”,然后我只是对整个甘特单元格进行条件格式化。
=IF(AND(Q$8>=$N12,DAY($K12)<>DAY($J12)),1,IF(AND(Q$8>=$N12-0.00001,Q$8<$O12-0.00001),1,""))
我不知道如何开始。我正在考虑做巢的事情:
-
创建一个表格,其中包含要添加到甘特图中的所有可能人员的姓名。
对宏进行编程以使用相同的模板创建新工作表。
编写一个循环,以每个人的姓名开始迭代:
对于甘特图中要汇总的每个人的姓名,开始在他们安排了活动的每一天创建新行(我还不知道我将如何迭代)。
在每个人的循环中,开始迭代原始工作表上的每一行,评估每个开始和结束日期,并在新工作表的当前人员当前日期行上粘贴“1”,如果条件在相应的时间里是真的。
循环直到每个人的所有个人活动都完成。
与下一个人继续。
我想知道这是否合乎逻辑,如果您有任何指针或类似代码要回收,我不精通 VBA 和 Excel 宏。
【问题讨论】:
不确定我是否理解正确。因此,您在“完成”时间之后在每个单元格中使用您的公式(我称之为“图表单元格”)并格式化那些值为 1 的单元格,对吗?如果是这样,只需使用=sumif([name range], "[each name]", [for each column of the chart cells])
,然后,只需使用值>0 进行相同的条件格式化。然后,它是一个摘要图表。根据您的使用情况,您可以有不同的方法来提取名称范围内的唯一名称。
@OliverLeung 完全正确。 SUMIF 肯定会解决为每个名称汇总所有内容的问题。我怎么能白天提取它并自主添加其他人?
【参考方案1】:
不确定我是否理解正确,但看起来您有一组多条记录,其中存储了每个工人的进出时间,每个工人有几行。
基于此,您希望恢复数据,每个工作人员一行,突出显示每个工作人员的开始和结束时间,但都在一行中。
我做了一个这样的假数据集:
我添加了 2 个额外的列(如果您不想看到它们,甚至可以隐藏它们)
-
字段
START TIME
得到这个公式:=B2-INT(B2)
字段END TIME
得到这个公式:=C2-INT(C2)
在 Excel 中,日期是整数值,时间是十进制值。我使用这两个公式只得到每个开始和结束的小数部分。
所有这些数据都是一个名为T_WORKERTIMES
的表对象。我创建了一个表格对象,因此如果您添加新记录,甘特图将自动更新。
然后我做了一个简单(有点可怕)的甘特图:
我在 H2 和拖动中使用的公式是:
=COUNTIFS(T_WORKERTIMES[Worker];$G2;T_WORKERTIMES[start time];"<="&H$1;T_WORKERTIMES[end time];">="&H$1)
实际上,我所有的数据都在同一张表中:
如果公式的结果是 1/0,我添加了 2 条条件格式规则以绿色/白色突出显示单元格。
此外,有时处理时间可能很困难,因为小数。 0,677083333335759
表示 16:15
。但是0,6770833333333333
也是如此,所以在甘特图中我将标题四舍五入到小数点后 6 位。
我在 H1 中的公式是=ROUND(7/24;6)
我在 J1 中的公式并向右拖动是=ROUND(H1+1/24/4;6)
所以现在一切正常。请注意工人 1,从 07:00 到 08:00 没有活动。因此,我使用该数据添加了一个新行,并且所有内容都会更新:
我已经在 Google Drive 上上传了一个示例,您可以看到公式,希望您可以根据自己的需要进行调整。
https://drive.google.com/file/d/1KOuCAYsmlY9gfNUCUhIrihXu-tJz-K7t/view?usp=sharing
这里最大的问题是时间的小数部分,以确保它们符合甘特图。一个简单的解决方案是减去 1 分钟开始时间列(计算,您可以隐藏它)和 1 分钟结束时间列(计算,您可以隐藏它)。
希望这可以指导您的项目。
【讨论】:
【参考方案2】:您似乎正在尝试提取每个人和每天的唯一记录,以获取一个人/天的可用时间摘要但也希望随着您添加更多的人和天而自动化。
我能够通过结合使用 powerquery 和数据透视表来做到这一点。添加或更改新人员/日期时,报告将更新,但您需要使用 CTRL+ALT+F5 进行刷新
-
您想突出显示您的整个报告或您认为的最大区域。突出显示后,您将使用公式选项卡 -> 定义名称功能区 -> 定义名称下拉菜单下的命名范围功能。我们可以将其命名为 REPORTAREA 或类似名称。
确保将报告中的条件格式公式更改为显示 0 而不是“”,这样才能正常工作
2 转到数据选项卡 -> 获取和转换功能区 -> 从其他来源 -> 空白查询。 这会将电源查询编辑器作为空白查询打开
3 在公式栏中输入 =Excel.CurrentWorkbook() 区分大小写很重要
4 从那里您将看到 CONTENT 和 NAME 列。 在 NAME 列中选择下拉菜单,然后转到 TEXT FILTERS -> Equals... 输入您的命名范围的名称,这样查询就不会意外提取任何其他内容。
5 删除 NAME 列,右击选择它然后删除。
6 您会注意到 CONTENT 列有两个指向左右的弯曲箭头,而不是像您在 excel 中习惯的那样直接向下。单击这些箭头并确保取消选中“使用原始列名作为前缀”选项框并确保选择了 EXPAND 选项。然后点击确定。
7 在这一点上,它看起来很像您的报告。转到主页选项卡 -> 转换功能区 -> 将第一行用作标题。
8. 仅选择不是报告的 24 小时样式时间标签的列,然后右键单击 -> 取消透视其他列
9 此时,您可以通过右键单击并删除来开始删除一些您不想要的列。还可以根据需要双击并重命名列。您可以右键单击列的顶部并将类型更改为您想要的。 不要担心 24HR 样式的时区看起来不正确,因为这将在稍后修复,此列应更改为小数类型而不是时区类型。
-
选择包含您需要的日期信息的列并右键单击 -> 复制列 -> 将类型更改为日期。
11.在屏幕的左上角有一个 CLOSE AND LOAD 下拉菜单,您将在其中加载到一个新的工作表。
这将产生一个绿色的桌子。选择表并按 ALT+D+P 生成一个数据透视表,该数据透视表链接到您从查询中生成的绿色表。
您可能需要关闭打开的“查询和连接”框才能看到右侧显示的数据透视表选项。 将 24 小时样式列拖到列区域。 将人员拖到行区域,然后将您在步骤 10 中创建的列拖到行区域。 将条件格式列拖到值区域。
您的数据透视表看起来与您想要的完全不一样。选择数据透视表时,转到设计选项卡 -> 报告布局 -> 表格和小计 -> 不要在同一选项卡中显示小计。
13 突出显示所有 24 小时样式时间标签并格式化它们,然后突出显示所有 1 和 0 所在的数据透视表内部,并应用您之前应用的条件格式。不要忘记您最初更改了公式,因此您的 if 语句不以“”结尾,而是以 0 结尾。
如果您愿意,我认为在数据透视表字段的 ROWS 和 COLUMNS 区域之间切换会更容易,以便报告更易于阅读。我选择在图片中这样做。如果您想以您习惯的方式保留报告,您可以按照之前的说明进行操作。
【讨论】:
@Roy 我的建议听起来像您正在寻找的解决方案吗? 这是我正在寻找的一个非常好的自动化选项。我一直坚持到制作数据透视表。我不明白您是如何获得“时间标题”列的?一开始我选择了整个报告,包括从 07:00 到 20:00 的所有单独的 24 小时时间标签;这就是你在第 8 步中的意思吗? 您是如何获得整个时间标头的?我认为这是我唯一想念的东西 在流程开始时,您应该突出显示正确命名范围的整个报告。时间标题栏实际上是您的 24 小时时间标签。我只是在 unpivot 到时间标题之后重命名了该列,但您可以使用任何您喜欢的名称。第 8 步(取消透视其他列)的目的是使时间标签垂直而不是水平,同时稍微更改报表结构以便于使用透视表。绿色的表格是不是和我的很像,还是只是透视表给你带来了麻烦? 我想我明白了。在我的图片时间标题列中,第一行显示为 .291666667 看到了吗?那实际上是 7:00,但 excel 只显示格式。在真正的 excel 中认为 .291666667。我粘贴了您的 24 小时时间标签,但电源查询删除了格式。后来我将格式重新应用于数据透视表,以便您可以随意查看。【参考方案3】:我把上面的评论放在这里作为一个完整的答案。
我将“完成日期”列之后的那些单元格称为“图表单元格”。提取唯一名称列表,请参考:here
如果每个名称,您可以使用以下公式和格式为单元格值>0 显示条形。
=SUMIF([name range], "[each name]", [for each column of the chart cells])
如果您还需要按日期过滤,则需要改用sumifs()
:
=SUMIFS([each column of chart cells], [name range], [unique name obtained from above], [Finish date range],"<=" & DATEVALUE("[target date]")+1,[start date range],"<=" & DATEVALUE("[target date]"))
这是 Excel 公式解决方案,如果您的表格不大,这很好。
【讨论】:
我不明白我应该在目标日期中输入什么,你能详细说明一下吗? 我的错。我修正了公式。只需输入您想要摘要的日期的文本字符串。例如如果您想要 24/Jun/2020 的摘要,请将占位符[target date]
替换为“24/Jun/2020”以上是关于从详细活动生成摘要甘特图的主要内容,如果未能解决你的问题,请参考以下文章