【问题标题】:Excel Formula to return earliest date and latest date within a date rangeExcel公式返回日期范围内的最早日期和最晚日期
【发布时间】:2020-04-28 21:55:43
【问题描述】:

UPDATED sample input and output table

有关示例数据(左表)和预期结果(右表),请参见附图。

我尝试使用本网站上针对类似问题提供的示例公式,但未能根据我的具体问题对其进行调整。希望得到一些针对我的案例的意见和指导。

我的表中有 1000 行数据,类似于图中所示。

  • 第 1 列 - ID
  • 第 2 列 - 起始范围
  • 第 3 列 - 结束范围
  • 第 4 栏 - 开始日期
  • 第 5 栏 - 结束日期

我想根据第 2 列和第 3 列中的重叠日期范围(即合并具有重叠日期范围的行)合并行以显示第 1、4 和 5 列,以获得与就在它只显示每个组的最早日期和最晚日期的地方。

作为参考,以下是我目前所拥有的。这个公式为我的输出的第二列(开始日期)提供了我需要的一切,除了它返回与所有条件匹配的第一个值,而不是返回最小值(不确定在此公式中添加 MIN 函数的位置)。

=IFERROR(INDEX([Start Date],MATCH(1, IF([Start Date]>=[@[Start Range]], IF([Start Date]<=[@[End Range]], IF([Key1]=[@Key1],1),0),0),0)),"")

如果您需要任何进一步的信息,请告诉我。谢谢!

【问题讨论】:

  • 嗨,Ashley,如果使用样本数据展示几个预期结果的示例,那就太好了。使用 x 样本集,我希望得到 y 结果
  • 您好 EoinS,感谢您的回复。我附上了一张图片,显示了左侧表格中的示例数据和右侧的预期结果。您可以查看我附加到帖子中的图片吗?
  • 您是在寻找只能使用工作表函数完成的东西还是可以接受 VBA?
  • 对于第 2 列和第 3 列中的一个重叠区间,第 1、4 和 5 列是否总是具有相同的精确值(因此,例如,ID 1 和 ID 2 在第 2 列和第 3 列)?
  • 嗨,Jery,我以前使用 VBA 的工作并不多,所以我不确定是否可以轻松使用它,但是可以,可以使用 VBA

标签: excel date range formula overlapping


【解决方案1】:

MATCH 只能返回一个行号,但您需要一个包含所有匹配行的数组,以便您可以选择最小/最大 - 您需要一个数组公式。

您有多个条件,但 AND 和 OR 在数组公式中不起作用,因此需要一个技巧来模拟 AND 和 OR:

AND(a=b,c=d)OR(a=b,c=d)a=bc=d 视为 TRUE/FALSE 值,但将它们视为 FALSE=0 和 TRUE0 也同样有效。如果你这样做,那么(a=b)*(c=d) 与使用 AND 相同,(a=b)+(c=d) 与 OR 相同。

首先,我们使用 MIN 来查找匹配的最小项目。匹配的是显示为日期的数字。那些不匹配的呢?我们需要一个比任何可以想象的日期都大的数字。数字 2958465 是 9999 年 12 月 31 日(最大日期),因此我们可以使用大于该日期的任何值 - 我们将使用 9999999,这绝对不是有效日期。

最后,我们使用 MAX 来查找最大的匹配项。匹配的是显示为日期的数字。对于那些不匹配的,我们需要一个小于任何可以想象的日期的数字。数字 0 是最小的有效日期,因此我们将使用 -1,这绝对不是有效日期。

所以我们需要用到的数组公式是:

对于ID,把这个公式放到G2中,然后将每一行原始数据的结果复制下来:

=A2

对于开始日期,将此公式放入 H2 并按 Control-Shift-Enter 而不是仅 Enter,然后将结果复制到原始数据的每一行:

=MIN(IF((D2>=B:B)*(D2<=C:C)*(A2=A:A)+(E2>=B:B)*(E2<=C:C)*(A2=A:A),D:D,9999999))

对于结束日期,将此公式放入 I2 并按 Control-Shift-Enter 而不是仅 Enter,然后将结果复制到原始数据的每一行:

=MAX(IF((D2>=B:B)*(D2<=C:C)*(A2=A:A)+(E2>=B:B)*(E2<=C:C)*(A2=A:A),E:E,-1))

当使用 Control-Shift-Enter 将单元格作为数组公式输入时,Excel 会在其周围加上花括号,以便您可以判断它是数组公式。

现在,这并不完美,因为您想要一个没有重复的单独结果表,而这个有很多重复。您可以使用高级过滤器仅显示唯一值 - 您可以选择隐藏行或将其复制到另一个位置进行过滤。

如果此单独的结果表与原始数据位于同一工作表上,则适当的过滤也会隐藏原始数据中的行,因此您最好将此单独的表放在不同的工作表上。

如果您通过复制到新位置(可能就在右侧)进行过滤,那么您可以隐藏带有重复项的结果列 - 请注意,因为您制作的副本只是值,它们不会自动更新。

【讨论】:

  • 这是一个工作示例 - 它会在 7 天后到期:easyupload.io/b7s9z4
  • 非常感谢,杰瑞!这很好用!我理解了公式的所有部分,除了最后一部分。最后,“1E+300”和“-1E+300”指的是什么?
  • 我们正在寻找最小值/最大值。匹配的是显示为日期的数字。不匹配的时候怎么办?我们需要一个数字,因为这是 min/max 所期望的。对于最小值:一个比任何可以想象的日期都大的数字,这样它就不会被选中。我们不能使用 999999,因为如果日期不在任何范围内,它将显示 4637 年 11 月 23 日 - 这会令人困惑。我们可以使用 9999999,因为它不是有效日期,但我选择了 1 后跟 300 个零。与最大值相同。所以也许我们应该使用 9999999 和 -9999999 以便可以计算出公式。我会改变答案。
猜你喜欢
  • 1970-01-01
  • 2010-10-21
  • 1970-01-01
  • 1970-01-01
  • 2021-09-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多