具有多个条件的四个日期的平均值

时间:2018-11-07 18:00:48

标签: excel vba function excel-formula

我有两个Excel工作表。工作表1具有以下记录:

Salon          coach       date         amount
Sal1           col1       11/7/2018     500
Sal1           col1       11/1/2018     400
Sal1           col1       10/25/2018    600
Sal1           col1       10/19/2018    700
Sal1           col1       10/1/2018     250
And so on

第2页具有以下列和记录:

Salon         coach       average of lastest 4 dates
Sal1          col1                       ???

我想找到最近四个日期(不包括最近日期)的平均金额。计算应从最近的第二个日期到最近的第五个日期,并与沙龙和教练的条件相匹配。

enter image description here

2 个答案:

答案 0 :(得分:2)

最终版本(灵活的日期参数和定义的名称)

具有数组函数(因此您必须使用ctrl + shift + enter输入),并具有命名范围,以使公式更易于理解:

{=AVERAGE(IF(
     (r_salon=A14)*
     (r_coach=B14)*
     (r_date>=LARGE(IF((r_salon=A14)*(r_coach=B14);r_date;);
                    MIN(d_last;COUNTIFS(r_salon;A14;r_coach;B14))))*
     (r_date<=LARGE(IF((r_salon=A14)*(r_coach=B14);r_date;);
                    MIN(d_first;COUNTIFS(r_salon;A14;r_coach;B14))));
      r_amount))} 

为了进行测试,我将公式与数据放在同一张纸上,因此Sal1在单元格A14中,col1在单元格B14中。

公式的说明(因此您可以根据需要进行微调):

  • 内部的两个IF为Sal1和col1(单元格A14B14)创建了一个包含所有日期的数组,其周围的LARGE函数采用n-最大价值; n实际上是分别根据sal1 / col1组合中实际存在的日期/行数分别计算为d_firstd_last的最小值(这将解决某些沙龙/教练组合的日期可能少于d_firstd_last个日期;
  • 外部IF然后创建一个满足所有条件的所有日期的数组,例如,对于d_first之后的Sal1 AND col1 AND d_last之前的 AND (在上一步中以内部IF计算); *AND运算符的简写,它也适用于数组公式(AND无效);
  • AVERAGE当然是微不足道的。

为使公式更灵活,我使用了两个参数(定义的名称):d_first是要包括的最近日期,而d_last是要包括的最后日期。一些示例:

  • d_first=2d_last=5:回答您实际的(更新的)问题,即平均4个日期,从最近的第二个开始到最近的第五个;
  • d_first=1d_last=4:与答案的第一个版本相同,即结果将是最近四个日期的平均值;
  • d_first=2d_last=4:这是最近的第二个日期到第4个日期的平均值;
  • d_first=1d_last=1:这只会导致最近的日期(一个值的平均值就是值本身)。

您只需要确保d_first是一个正整数(大于零),并且d_last必须大于或等于d_first。如果它们大于数据集中的日期总数,则结果是与最早日期相对应的值。

您还必须考虑如果在同一日期有多个条目,会发生什么情况。当前公式适用于截止日期(最早和最晚),而不适用于实际平均记录数((如果您有多个具有相同日期在截止日期内的记录,则所有这些都将用于平均值的计算)。

版本2 (增加了灵活性)

公式:

{=AVERAGE(IF(($A$2:$A$11=A14)*($B$2:$B$11=B14)*($C$2:$C$11>=LARGE(IF(($A$2:$A$11=A14)*($B$2:$B$11=B14);$C$2:$C$11;);MIN(d_last;COUNTIFS($A$2:$A$11;A14;$B$2:$B$11;B14))))*($C$2:$C$11<=LARGE(IF(($A$2:$A$11=A14)*($B$2:$B$11=B14);$C$2:$C$11;);MIN(d_first;COUNTIFS($A$2:$A$11;A14;$B$2:$B$11;B14))));$D$2:$D$11))}

版本1 (原始问题,即最近4个日期的平均值;该问题不相关,因为该问题已更新)

您可以使用以下数组公式来完成此操作(因此必须使用ctrl + shift + enter来输入):

{=AVERAGE(IF(($A$2:$A$11=A14)*($B$2:$B$11=B14)*($C$2:$C$11>=LARGE(IF(($A$2:$A$11=A14)*($B$2:$B$11=B14);$C$2:$C$11;);MIN(4;COUNTIFS($A$2:$A$11;A14;$B$2:$B$11;B14))));$D$2:$D$11))}

注意
仅供参考,以防您使用F9调试公式并检查各种数组中间结果
数组不仅包含满足条件的值,而且大小与IF的参数相同(即,其值将与数据集中的行数一样多),并且对于不符合条件的行,用FALSE填充。由于AVERAGE函数(与许多其他函数一样)没有考虑FALSE的值,因此对结果没有影响,因此我没有使公式过于复杂以仅保留匹配的日期数组。

答案 1 :(得分:1)

enter image description here

嗯,这个应该可以。我希望我已经针对所有可能的情况进行了测试。

 =SUMPRODUCT(
 (Table1[Salon]=G5)*(Table1[coach]=H5)*
 (Table1[date]>=LARGE(((Table1[Salon]=G5)*(Table1[coach]=H5)*(Table1[date])),5))*
 (Table1[date]<=LARGE(((Table1[Salon]=G5)*(Table1[coach]=H5)*(Table1[date])),2))*
 Table1[amount])/4

让我知道它如何为您工作。

干杯