-1

我试图找到一种方法来查看哪些员工在两个日期之间没有工作。

我应该使用 vlookup、索引和匹配、过滤器、查询还是其他方式?

  • 表 1 包含员工详细信息和开始/结束日期。
  • 表 2 接受用户输入以选择 2 个日期,它将自动显示未工作的可用员工列表。

表 1 - 所有员工和工作天数的数据库/日志。

# 一个 C D
1 ID 姓名 开始日期 结束日期
2 12345 约翰 2021 年 1 月 1 日 2021 年 1 月 8 日
3 54321 莎拉 2021 年 1 月 24 日 2021 年 1 月 29 日
4 00731 詹姆士 2021 年 2 月 5 日 2021 年 2 月 15 日
5 00731 约翰 2021 年 2 月 10 日 2021 年 2 月 30 日

表 2(第 1-2 行)- 手动输入两个日期。

# 一个
1 开始日期(手动输入) 结束日期(手动输入)
2 2021 年 1 月 1 日 2021 年 1 月 30 日

表 2(第 3 行+)- 在表 2 中输入的两个日期之间未工作的所有员工的列表!A2:B2(预期结果)

# 一个
3 ID 姓名
4 00731 詹姆士
4

2 回答 2

0

尝试:

=INDEX(SUBSTITUTE(UNIQUE(QUERY(""&SPLIT(FLATTEN(IF(SEQUENCE(1, MAX(D2:D-C2:C))<=D2:D-C2:C, 
 "♥&quot;&A2:A&"♦&quot;&B2:B&"♦&quot;&C2:C+SEQUENCE(1, MAX(D2:D-C2:C), 0), )), "♦&quot;), 
 "select Col1,Col2 where not Col3 matches '"&JOIN("|", "^$", 
 IF(SEQUENCE(1, G2-F2)<=G2-F2, F2+SEQUENCE(1, G2-F2, 0), ))&"'", 0)), "♥&quot;, ))

在此处输入图像描述

演示表

于 2021-11-12T01:47:22.327 回答
0

假设您的第一张带有完整数据的工作表的名称实际上是Sheet1,请将以下内容放在 Sheet2 单元格 A4 中:

=FILTER(Sheet1!A2:B,Sheet1!A2:A<>"",(Sheet1!C2:C>G2)+(Sheet1!D2:D<F2))

(Sheet1!C2:C>G2)+(Sheet1!D2:D<F2)组合中的非此即彼条件FILTER意味着“开始日期在给定的范围日期之后,或者结束日期在给定的范围日期之前”。

另一个条件是Sheet1!A2:A<>""排除原始数据集中的空白行。就视觉结果而言,这不是绝对必要的;但它会阻止将空行添加到这些结果中,这将允许您根据需要在 Sheet2 的 Col A 和 B 中的结果下方输入数据,或者在 Sheet2 中的行数少于 Sheet1 中的行数而无需公式添加更多行容纳空返回。

您发布的示例数据不清楚。同一个 ID 有两个不同的名称(即 00731)。并且您在 2021 年 2 月 30 日的 D5 中有一个“结束日期”,这不是有效日期。无论如何,尚不清楚同一个人/ID 是否会在原始数据集中出现两次。我上面的公式假设你不会

如果您的原始数据列表实际上可能包含重复项,事情就会变得有点棘手。在这种情况下,请在 Sheet2 单元格 A4 中改用以下公式:

=UNIQUE(FILTER(A2:B,ISERROR(VLOOKUP(A2:A,FILTER(A2:A,((C2:C>=F2)*(C2:C<=G2))+((D2:D>=F2)*(D2:D<=G2))),1,FALSE))))

在这里,内部首先形成在该范围FILTER工作的所有人员的列表,然后外部过滤器在一组不在该内部列表中的人员中(即,尝试返回(an) )。FILTERUNIQUEVLOOKUPISERROR

于 2021-11-12T02:53:41.520 回答