如何根据可用性表计算下一天/同一天?
Posted
技术标签:
【中文标题】如何根据可用性表计算下一天/同一天?【英文标题】:How to calculate next/same day based on availability table? 【发布时间】:2019-10-17 00:24:59 【问题描述】:我正在研究一个 Excel 公式,以根据 Excel 表查找下一个可用日期。我有两个表,A 和 B,表 A 有日期和结果列,表 B 有日期和计数,我想根据表 A 和 B 中的日期计数从表 B 中获取日期到表 A 的结果列. 请注意,表 A 的“结果”列中的日期是预期输出,它始终与表 A 的日期列中的日期相同或更高。日期格式为月/日/年
table A
Date Result
01-02-2018 01-02-2018
01-02-2018 01-02-2018
01-05-2018 01-05-2018
01-05-2018 01-05-2018
01-05-2018 01-07-2018
01-05-2018 01-07-2018
01-06-2018 01-07-2018
01-07-2018 01-10-2018
01-09-2018 01-10-2018
01-11-2018 01-12-2018
01-12-2018 01-12-2018
table B
Date Count
01-02-2018 3
01-03-2018 1
01-04-2018 3
01-05-2018 2
01-07-2018 3
01-10-2018 3
01-12-2018 2
【问题讨论】:
嗨,表A,“结果”列是预期的输出,它基于表B的“日期”和“计数”列。一个 excel 公式将是理想的,我也可以使用 r 函数。 :) 请详细说明如何根据Date
和Count
返回表A中的日期?
我的意思是一个日期最多可以出现在表 A 结果列是基于表 B 的计数列。例如,对于表 A 中的行 3、4、5,它们的日期列为 01-05-2018 但在表 B 01-05-2018 中的计数为 2,因此结果列的第 3、4 行表 A 的日期为 01-05-2018,第 5 行的下一个日期列在表 B 中,即 01-07-2018。在这里,对于表 A 中的每个日期,结果日期要么是同一日期,要么是下一个更高的日期
表 A 和表 B 中的日期是否总是按升序排列,或者它们可以随机出现,如果没有匹配,你想显示什么?还有您使用的是什么版本的 Excel(这可能会开辟解决问题的新方法)。
两个表中的所有日期都按升序排列,表 A 和 B 之间可能有少数日期不匹配。在这种情况下,您可以看到表 A 中存在日期 01-06-2018 但是不是 B。我在 32 位 Office 365 中使用 excel
【参考方案1】:
这个任务花费了我比预期更长的时间来解决,最后我在几个帮助列的帮助下想出了一个解决方案(不确定是否可以选择?)。
假设您有以下命名范围:
TblA_Date 是您Table A
中的所有日期(这是可选的,因为我没有在我的解决方案中使用它...);
TblB_Date 是您Table B
中的所有日期。
首先,我将您的Table B
“扩展”为一个列出所有日期的列表结构:
我的示例单元格J2
中第一个辅助列的公式是:
=SUM($I$2:I2)
这是在
Table B
中找到计数的总和。
单元格M2
中第二个辅助列的公式为:
=INDEX(TblB_Date,MATCH(1,--(ROW(A1)<=$J$2:$J$8),0))
使用行位置作为参考“布置”
Table B
中的所有日期,并将其与运行的计数总数进行比较并返回相应的日期。鉴于它是一个数组公式,您必须按 Ctrl+Shift+Enter完成公式栏中的公式后,否则它将无法正常工作。然后,您只需将公式向下拖动即可应用。请注意,我已为第二个辅助列
M2:M18
(不包括错误的M19
)命名为 TblB_Date_Expanded。
下一步是根据您的条件在 TblB_Date_Expanded 中找到所需日期的位置
-
"对于表 A 中的每个日期,结果日期要么是同一日期,要么是下一个更高的日期" AND
来自
Table B
的日期只能使用不超过其相应的计数。
单元格E2
中的公式为:
=MAX(MATCH(AGGREGATE(15,6,TblB_Date_Expanded/(A2<=TblB_Date_Expanded),1),TblB_Date_Expanded,0),E1+1)
A2
是Table A
中的第一个日期,您将在我的下一个屏幕截图中看到。
逻辑是使用AGGREGATE函数根据
Table A
中的给定日期返回TblB_Date_Expanded
中最接近的开始日期,然后使用MATCH函数返回行位置,最后使用 MAX 函数将位置增加1
,如果已经使用了相同的位置(在上面的行中)。
有了已知的行位置,我们可以很容易地使用以下公式从TblB_Date_Expanded
返回对应的日期:
=INDEX(TblB_Date_Expanded,E2)
思考,我无法克服的困难部分是在辅助列中使用“循环引用”或“自我引用”。换句话说,我不确定如何使用单个公式返回一个值数组,其计算取决于其先例值。我希望有人能想出一个更优雅的方法来解决这个问题:)
如果您有任何问题,请告诉我。干杯:)
【讨论】:
嗨特里,我知道这是一个有点棘手的问题,很高兴你明白了。这非常有效,我真的很感激。 @user12229564 乐于提供帮助。我没有太多时间来测试结果,所以如果您遇到任何异常,请告诉我,我会尽快查看。【参考方案2】:假设“A表”放在A1:A9中,包括A1
:“表A”,A2:B2
(表头):“日期”和“结果”
“table B”放入A11:A1,包括A11
:“table B”,A12:B12
(header):“Date”和“Count”
在“结果”列B3
,复制下来的公式:
=IF(COUNTIF(A$3:A3,A3)<=IFERROR(VLOOKUP(A3,$A$13:$B$17,2,0),0),A3,AGGREGATE(15,6,$A$13:$A$17/($A$13:$A$17>=MAX(A3,INDEX(A3:A$10,MATCH(1,INDEX(0+(A3:A$10<>A3),0),0)))),1))
【讨论】:
您好,感谢您的回复。我已经尝试过这个公式并且它部分正确,但是对于问题中列出的示例它不起作用,想添加日期格式是月/日/年。 我把“表A”放在A1:A13中,包括A1:“表A”,A2:B2(标题):“日期”和“结果”,“表B”放在A16中: A24, 包括 A16: "table B", A17:B17 (header) : "Date" 和 "Count" , 结果公式在 B3 =IF(COUNTIF(A$3:A3,A3)=MAX(A3,INDEX(A3:A) $13,MATCH(1,INDEX(0+(A3:A$13A3),0),0)))),1)) 根据您发布的示例,请说明哪个公式单元格结果与您的预期不匹配。请注意,我的公式使用了自 Excel 2010 起可用的 AGGREGATE 函数,较低的 Excel 版本将无法工作。 对于第 8 行 01-07-2018,我应该得到 01-10-2018 的答案,但我得到了 01-07-2018,虽然表 B 中的计数是设置为 3,日期为 01-07-2018。 不要在没有通知的情况下改变你的目标帖子,这是你第三次改变你的帖子原始数据。抱歉,无法为您提供任何帮助。以上是关于如何根据可用性表计算下一天/同一天?的主要内容,如果未能解决你的问题,请参考以下文章