我在 Excel 中有一个非常大的表格,其中包含多行,每行包含两名在同一时间工作的员工之间的比较。请参见下图中的一些示例行的示例:
我的目的是找出哪些员工在一天中收入最高,但我不希望员工的工作时间重叠。例如,在上面的示例数据中,员工 145 与其他 3 名员工的工作时间从 17:00 到 17:30 重叠,在这种情况下,员工 147 的收入最高。因此,我只希望员工 145 的一条记录,其开始时间更改为 17:30,结束时间保持不变,仍为 18:00,因为他们不是 17:00-17:30 期间收入最高的员工。
对于员工 150 来说,情况稍微复杂一些,因为他们有 3 个重叠时间,每个重叠时间都不同。我想要的结果是员工 150 的开始时间不变,但结束时间应改为 15:15,因为在 15:15 到 16:00 期间,员工 152 的收入最高。
对于员工 160 的情况,我希望首先在 12:15 截断他们的条目,因为员工 161 在 12:15 到 12:45 之间的收入要高得多,但然后我希望在表中为员工 160 插入一个额外的行,其开始和结束时间分别为 12:45 和 13:00,因为他们在这段时间内没有重叠并且是当时收入最高的员工。
我知道这种情况可能还有更多情况,但我的目标是找出一天中每个时间段收入最高的员工,且不发生任何重叠。我已经设法创建了一些代码来处理单个重叠(可以根据上述标准截断、删除或添加条目),但我很难处理一个员工 ID 有多个重叠或一个重叠有另一个重叠的情况,因此如果有人知道如何在 VBA 中处理这种情况,我将不胜感激。伪代码也可以。
提前谢谢了!
答案1
我已将您之前帖子中的收入添加到表 A 中。
然后我复制了该查询,并对其进行了如下编辑:
let
Source = Excel.CurrentWorkbook(){[Name="Table1"]}[Content],
times = List.Times(Time.FromText("00:00:00"),1440,Duration.FromText("0:01")),
#"Changed Type2" = Table.TransformColumnTypes(Source,{{"Employee ID", Int64.Type}, {"Start time", type time}, {"End time", type time}}),
#"Added Custom" = Table.AddColumn(#"Changed Type2", "time_of_day", each times),
#"Expanded time_of_day" = Table.ExpandListColumn(#"Added Custom", "time_of_day"),
#"Changed Type" = Table.TransformColumnTypes(#"Expanded time_of_day",{{"time_of_day", type time}}),
#"Added Custom1" = Table.AddColumn(#"Changed Type", "shift", each [time_of_day] >= [Start time] and [time_of_day] <= [End time]),
#"Changed Type1" = Table.TransformColumnTypes(#"Added Custom1",{{"shift", type logical}}),
#"Filtered Rows" = Table.SelectRows(#"Changed Type1", each ([shift] = true)),
#"Removed Columns" = Table.RemoveColumns(#"Filtered Rows",{"shift"})
in
#"Removed Columns"
在这里,我们创建一天中每一分钟的列表(参见“时间”行),然后将其添加为查询 A 中要扩展的列。在步骤#'Expanded time_of_day'中,您将看到以下内容:
然后只需通过标志对表格进行过滤,该标志仅保留每个班次的开始日期和结束日期之间的分钟行:
将过滤结果设置为 TRUE 并删除过滤列,然后重新加载到电子表格中,您可以按分钟创建一个数据透视表,并让“最大收入”显示从第一个班次开始到最后一个班次结束每分钟的最大收入。
如果您愿意,可以按小时分组: