【问题标题】:Finding a shorter period of days within a longer period for calculation在较长的时间内找到较短的天数进行计算
【发布时间】:2018-06-29 06:37:41
【问题描述】:

我有一组日期,共有 7 个周期,跨越 6 个月,每个周期都有相应的计算因子。

我将让用户输入他们希望完成计算的时间段,该时间段可以属于 6 个月期间之一,也可以完全或部分包含两个或多个此类期间。

插图:

  1. 预设周期:

  1. 用户输入:

我已经获得了用户输入的周期的十进制值(按月计算)。对于第一个实例(请参阅用户输入),从 01-01-2015 到 29-04-2015 期间的十进制值将是每月 3.97。该时期的计算如下:

n*3.97*113%

对于第二种情况,2015 年 4 月 4 日至 2015 年 6 月 30 日期间的十进制值将是 2.03,将用于以 113% 进行计算,然后将结果添加到已完成的计算中使用 01-07-2015 至 20-12-2015 期间的十进制值 5.65 为 119%:

(n*2.03*113%)+(n*5.65*119)

我认为我可以处理期间的拆分,因为修订活动在特定日期每两年举行一次,但欢迎就此提出建议。更重要的是,我需要帮助跟踪用户输入的周期对应的预设计算因子(比如 132%),如上图所示。可行吗?

【问题讨论】:

  • 我想这是可能的,但我们需要更多关于计算如何工作的细节 - 看起来好像第二个用户输入指定 10 天为 132%,然后 6 个月为 136 % ?
  • @TomSharpe 我从我的智能手机发布了这个问题,无法添加太多细节和截图。我会用适当的插图稍微更新一下这个问题。
  • 答案很可能是一个数组类型的公式,例如 sumproduct(n*[formula for decimal number]*[formula for percent]) 。应该可以计算出[百分比公式],但仍然无法在不知道 n 是什么以及 [十进制数公式] 应该是什么的情况下测试整个事情。
  • 我从您的示例中猜测十进制数是完整日历月的数量 + 任何不完整月份的总和(不完整月份中的期间/不完整月份中的天数)所以我们只需要知道如果 n 是一个常数或可能在整个投资期间发生变化?加上您在每种情况下所期望的结果。
  • 我草拟了一些似乎可行的东西,但希望早上再看一遍并做更多检查(我在 BST)

标签: excel excel-formula


【解决方案1】:

我将使用标准方法来查找overlap between two dates,并将任务分成三个部分,就像我对this recent question 的回答一样。

(1) 第一部分是查找用户的日期范围与整个月的一个或多个修订期之间的重叠,并且需要一个数组公式。我选择使用Datedif function 1 来获取重叠开始和结束之间的月差。如果没有重叠,则输入到 Datedif 的开始日期将在结束日期之后,并且它将返回一个错误,该错误可以被 Iferror 捕获。如果用户的日期从 A2 和 B2 开始,则在 C2 中给出:

=SUM(IFERROR((DATEDIF(IF(K$2:K$8>A2,K$2:K$8,A2),IF(L$2:L$8<B2,L$2:L$8,B2),"m")+1)*M$2:M$8,0))

必须使用 CtrlShiftEnter

作为数组公式输入

上述结果包括用户输入的第一个月和最后一个月,即使它们是不完整的月份。然后有必要减去第一个月和最后几个月的任何缺失天数。

(2) 第一个月的缺失天数占该月 D2 天数的一小部分:

=SUMIFS($M$2:$M$8,$K$2:$K$8,"<="&A2,$L$2:$L$8,">="&A2)*(A2-EOMONTH(A2,-1)-1)/(EOMONTH(A2,0)-EOMONTH(A2,-1))

OP 指出,这也可以使用 sumproduct、vlookup 或 index/match 完成。

(3) E2 中上个月的缺失天数占该月天数的一小部分:

=SUMIFS($M$2:$M$8,$K$2:$K$8,"<="&B2,$L$2:$L$8,">="&B2)*(EOMONTH(B2,0)-B2)/(EOMONTH(B2,0)-EOMONTH(B2,-1))

总数只有 (1)-(2)-(3) 或

=C2-D2-E2

我将OP的两个例子的结果放在H2和H3中进行比较:我的结果与前3位有效数字一致。

n*3.97*113%

(n*2.03*113%)+(n*5.65*119)  

在所有情况下,我都设置了 n=1 并忽略了比率是百分比这一事实。


这显示了如何手动计算结果:


1 使用 Datedif 的优点:

(1) 与仅使用 Month 函数不同,可以跨年份工作。 (2) 与 Iferror 一起方便地识别不匹配的日期范围。

使用 Dateif 的缺点:

(1) 它是一个未记录的函数,将来可能会被撤销。 (2) 在这种特殊情况下,所有日期计算都在同一年内,因此月份可用。

【讨论】:

  • 感谢汤姆的回答,感谢您指出 119% 的错误,我在问题中解决了这个问题。我仍然在思考答案,并试图找出为什么你的结果中的分数对我来说有点偏离。它们是否包括期间的第一个和最后一个日期?
  • 分数确实包括期间的第一个和最后一个日期。我认为差异只是因为您问题中的十进制数字仅显示前 3 位数字-也许如果您可以用更多小数位显示它们,我们可以检查一下。
  • 这是带有 7 个小数位的输出屏幕截图 - prntscr.com/k23mv6 我在一个空单元格中输入了十进制值的公式以供参考。我已经对用户输入进行了多次计算,并且该公式似乎产生了准确的结果。
  • 第一个和第四个(不跨越多个修订期)是正确的。我需要一个以上的十进制数字,尽管它确实像您在问题中所做的那样跨越多个时期 (n*2.03*113%)+(n*5.65*119) 但有更多数字。我也不能完全理解你截图中的持续时间。请注意,我必须观看某场足球比赛,因此从现在开始,回复可能会断断续续...:-)
  • 好的,我的回答不会适应问题发布后所做的任何更改。但是,我添加了额外的手动计算列,以准确显示我的结果来自何处。
猜你喜欢
  • 2020-03-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-03-30
  • 2022-01-05
  • 2019-05-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多