从详细活动生成摘要甘特图

Generate summary gantt chart from detailed activities

我想创建一个甘特图摘要,根据详细的甘特图和不同人的活动列表,在一行中按天显示一个人的整个“忙碌”和“空闲”日程安排多行。

基本上是这样走的:

为此:(我手动创建的)

能够总结人们在活动之间的轮班空闲时间。

现在我只是使用这个公式来比较每一行中的开始和结束日期,如果条件为真则生成“1”,然后我只是对整个甘特图单元格进行条件格式化。

=IF(AND(Q>=$N12,DAY($K12)<>DAY($J12)),1,IF(AND(Q>=$N12-0.00001,Q<$O12-0.00001),1,""))

我不知道如何开始。我正在考虑做这些事情:

  1. 创建一个 table 所有可能要添加到甘特图中的人的名字。
  2. 对宏进行编程以使用相同的模板创建新的 sheet。
  3. 编写一个循环,开始迭代每个人的名字:
  4. 对于存在于要汇总的甘特图中的每个人的姓名,开始在他们安排了活动的每一天创建新行(我还不知道我将如何遍历它)。
  5. 在每个人的循环中,开始迭代原始 sheet 上的每一行,评估每个开始和结束日期并粘贴到新的 sheet 当前人的如果条件在相应的时间为真,则当天行为“1”。
  6. 循环直到每个人的所有个人活动都完成。
  7. 继续下一个人。

我想知道这是否是合乎逻辑的方式,如果您有任何指针或类似代码可以回收,我不精通 VBA 和 Excel 宏。

我把上面的评论作为完整的答案放在这里。

我将“完成日期”列之后的那些单元格称为“图表单元格”。要提取唯一的名称列表,请参考: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公式的解法,如果你的table不是很大,这很好。

看起来您正在尝试提取每个人和每天的唯一记录以获得person/day可用时间摘要但同时希望它在您进行操作时自动执行添加更多人和天数。

我能够通过结合使用 powerquery 和 pivot table 来做到这一点。当添加或更改新的 persons/dates 时,报告将更新,但您需要使用 CTRL+ALT+F5

进行刷新
  1. 您想突出显示整个报告或您认为会达到的区域。突出显示后,您将使用“公式”选项卡下的命名范围功能 ->“定义名称”功能区 ->“定义名称”下拉列表。我们可以将其命名为 REPORTAREA 或类似名称。

确保将报告中的条件格式公式更改为显示 0 而不是“”,这样才能正常工作

2 转到数据选项卡 -> 获取和转换功能区 -> 从其他来源 -> 空白查询。 这将作为空白查询打开电源查询编辑器

3 在公式栏中输入 =Excel.CurrentWorkbook() 区分大小写很重要

4 从那里您将看到 CONTENT 和 NAME 列。 在 NAME 列 select 下拉菜单中,转到 TEXT FILTERS -> Equals... 输入您命名范围的名称,这样查询就不会意外拾取任何其他内容。

5 右键单击​​ select 删除 NAME 列,然后将其删除。

6 您会注意到 CONTENT 列有两个指向左右的弯曲箭头,而不是像您在 excel 中习惯的那样笔直向下。单击这些箭头并确保取消选中“使用原始列名作为前缀”选项框并确保 EXPAND 选项已 selected。然后点击确定。

7 此时它看起来很像您的报告。转到主页选项卡 -> 转换功能区 -> 将第一行用作 headers。

8.Select 只有不是报告的 24 小时样式时间标签的列,然后右键单击 -> 取消透视其他列

9 此时您可以开始删除一些不需要的列,方法是右键单击并删除。还可以双击并根据需要重命名列。您可以右键单击列的顶部并将类型更改为您想要的。 不要担心 24HR 样式的时区看起来不正确,因为这将在稍后修复,此列应更改为十进制类型而不是时区类型。

  1. select 包含所需日期信息的列,然后右键单击 -> 复制列 -> 将类型更改为日期。

11.At 屏幕左上角有一个关闭和加载下拉菜单,您可以在其中加载新工作表。

  1. 那会产生绿色table。 Select table 并按 ALT+D+P 生成一个枢轴 table 链接到您从查询中生成的绿色 table。

  2. 您可能需要关闭打开的“查询和连接”框,才能看到将出现在您右侧的枢轴 table 选项。 将 24 小时样式列拖到列区域。 将 People 拖到 Rows 区域,然后将您在第 10 步中创建的 Column 拖到 Rows 区域。 将条件格式列拖到值区域。

  3. 您的枢轴 table 不会完全像您想要的那样。当 pivot table 被 selected 转到设计选项卡 -> 报告布局 -> 表格和小计 -> 在同一选项卡中时不要显示小计。

13 突出显示所有 24 小时样式时间标签并对其进行格式化,然后突出显示枢轴内部 table 所有 1 和 0 所在的位置并应用您之前应用的条件格式。不要忘记您最初更改了公式,因此您的 if 语句不以“”结尾,而是以 0 结尾。

如果您愿意,我认为切换数据透视表 table 字段的 ROWS 和 COLUMNS 区域更容易,这样报告更易于阅读。我选择在图片中这样做。如果您想按照您习惯的方式保留报告,您可以按照前面的说明进行操作。

不确定我是否理解正确,但看起来你有一组多条记录,其中存储了每个工人的进出时间,每个工人有几行。

基于此,您想要恢复数据,每个工作人员一行,突出显示每个工作人员的开始和结束时间,但都在一行中。

我做了一个这样的假数据集:

我添加了 2 个额外的列(如果您不想看到它们,您甚至可以隐藏它们)

  1. 字段START TIME得到这个公式:=B2-INT(B2)
  2. 字段END TIME得到这个公式:=C2-INT(C2)

在Excel中,日期是整数值,时间是小数。我使用这两个公式只得到每个开始和结束的小数部分。

所有这些数据都是一个名为 T_WORKERTIMES 的 table object。我做了一个 table object 所以如果你添加新记录,甘特图会自动更新。

然后我做了一个简单的(有点可怕的)甘特图:

我在 H2 和拖动中使用的公式是: =COUNTIFS(T_WORKERTIMES[Worker];$G2;T_WORKERTIMES[start time];"<="&H;T_WORKERTIMES[end time];">="&H)

其实我所有的数据都在同一个sheet:

如果公式的结果是 1/0,我添加了 2 个条件格式规则来突出显示 green/white 中的单元格。

此外,处理时间有时会很困难,因为小数。 0,677083333335759 表示 16:15。但是 0,6770833333333333 也是,所以在甘特图中,我将 headers 四舍五入到 6 位小数。

我在 H1 中的公式是 =ROUND(7/24;6) 我在 J1 中向右拖动的公式是 =ROUND(H1+1/24/4;6)

所以现在一切正常。请注意工人 1,从 07:00 到 08:00 没有活动。所以我添加了一个包含该数据的新行,所有内容都更新了:

我上传了一个示例哟Google驱动你可以看到公式,希望你能根据自己的需要进行调整。

https://drive.google.com/file/d/1KOuCAYsmlY9gfNUCUhIrihXu-tJz-K7t/view?usp=sharing

这里最大的问题是时间的小数部分,以确保它们符合甘特图。一个简单的解决方案是只减去 1 分钟到开始时间列(计算,你可以隐藏它)和 1 分钟到结束时间列(计算,你可以隐藏它)。

希望这可以指导您的项目。