在Excel中根据多个条件计算平均值

我回来了我的新的Excel问题。 可以说我有这样的桌子。

| A | B ------------------------------------------ 1 | ENV | Value ------------------------------------------ 2 | ABC - 10/1/2014 1:38:32 PM | 4 3 | XYZ - 10/1/2014 1:38:32 PM | 6 4 | ABC - 9/1/2014 1:38:32 PM | 1 5 | XYZ - 10/1/2014 1:38:32 PM | 10 6 | ABC - 10/1/2014 1:38:32 PM | 7 7 | XYZ - 9/1/2014 1:38:32 PM | 1 8 | ABC - 9/1/2014 1:38:32 PM | 10 9 | ABC - 10/1/2014 1:38:32 PM | 7 10 | XYZ - 10/1/2014 1:38:32 PM | 7 

现在,在Cell C2中,我select了ABC。

因此,在单元格D2中,我要求所有“ABC”( col A )(其中月份= 10( col A )和所有“ABC”中的单元格E2,Max( 来自col B ))的平均值月份= 10( 栏A )。

所以,我的结果D2和E2分别是6和7。

我希望我的问题和例子是有道理的。

更新:
谢谢大家的帮助。
现在让我们说,我不知道这个电子表格上有多less行,所以我想出了这个公式,但它不工作,给我#DIV / 0! 错误。
*注意:我正在使用公式从单元格C2中获取“ABC”和“10”。

 =AVERAGEIFS( (OFFSET($A$1,1,1,COUNTA($B:$B)-1,1)), OFFSET($A$1,1,0,COUNTA($A:$A)-1,1), (MID(C2,1,(FIND("-",C2))-2)), OFFSET($A$1,1,0,COUNTA($A:$A)-1,1), (MID(C2,(FIND("-",C2)+1),(FIND("/",C2))-(FIND("-",C2)+1)))) 

甚至试过这个,但同样的错误:

 =SUMPRODUCT(((MID(A2:A10,1,(FIND("-",A2:A10))-1))=(MID(C2,(FIND("-",C2)+1),(FIND("/",C2))-(FIND("-",C2)+1))))* (MONTH(DATEVALUE(MID(A2:A10,7,99)))=(MID(C2,(FIND("-",C2)+1),(FIND("/",C2))-(FIND("-",C2)+1))))* (B2:B10))/SUMPRODUCT(((MID(A2:A10,1,(FIND("-",A2:A10))-1))=(MID(C2,(FIND("-",C2)+1),(FIND("/",C2))-(FIND("-",C2)+1))))* (MONTH(DATEVALUE(MID(A2:A10,7,99)))=(MID(C2,(FIND("-",C2)+1),(FIND("/",C2))-(FIND("-",C2)+1))))) 

你能帮助我吗?

具有中介价值的解决scheme

为了解决这个问题(我只testing了平均值 ),我首先使用了2个中间值:这个解决scheme不是最优的,将会有许多更聪明的方法来解决这个问题(例如数据透视表)。

 ENV Value Intermediary 1 Intermediary 2 ABC - 10/1/2014 1:38:32 PM 4 ABC 10 XYZ - 10/1/2014 1:38:32 PM 6 XYZ 10 ABC - 9/1/2014 1:38:32 PM 1 ABC 9 XYZ - 10/1/2014 1:38:32 PM 10 XYZ 10 

第一个中间列包含ENV列的前3个字符( =LEFT(A9,3) ),而第二个中间列包含月份( =MID(A9,7,2) )。 这只适用你的ENVlogging是固定大小和同质的(例如你的env名字恰好有3个字符)。

有了这个布局,你可以计算出平均放入任何单元格的公式:

 =AVERAGEIFS(D9:D12, F9:F12,"=ABC", G9:G12, "=10") 

其中D9:D12为数值区间, F9:F12为第一中间列, G9:G12为第二中间列。

One Shot Compact解决scheme(arrays)

一个优化的解决scheme可以依靠arraysfind。 例如,要根据2个“vector”条件计算一个区间的平均值和最大值,可以写下这一行:

 = MAX(IF((LEFT(A9:A12,3)="ABC")*(MID(A9:A12,7,2)="10"),D9:D12)) = AVERAGE(IF((LEFT(A9:A12,3)="ABC")*(MID(A9:A12,7,2)="10"),D9:D12)) 

A9:A12您的原始logging, D9:D12是值间隔。

这个解决scheme的优点是你不需要任何中间列,并且你可以扩展这个方法到所有其他没有' xxxxxIFS '的公式( MAX是这种情况)。

:您必须使用CTRL + SHIFT + RETURN确认此公式,否则您的公式将失败,并显示#VALUE错误。

现场演示

在这里输入图像说明

现场演示可在这里 。

您可以通过使用 – Data> Text to Columns以分隔符“ – ”将列A吐在date和字母的首位。 (F和G)后,可以使用函数“AVERAGEIF”,条件是检查“F”中的单元格的值是ABC,而Moth(单元格中的“G”)= 10.对于最大值,对于E列可以使用MAX(IF ….)。

SUMPRODUCT将允许您parsing组合string中最左侧和最后一个字符。 伪MAXIF()可以使用MAX()INDEX()类似地构造。

在D2使用=SUMPRODUCT((LEFT(A2:A10,3)="ABC")*(MONTH(DATEVALUE(MID(A2:A10,7,99)))=10)*(B2:B10))/SUMPRODUCT((LEFT(A2:A10,3)="ABC")*(MONTH(DATEVALUE(MID(A2:A10,7,99)))=10))

在E2中使用=MAX(INDEX((LEFT(A2:A10,3)="ABC")*(MONTH(DATEVALUE(MID(A2:A10,7,99)))=10)*(B2:B10),,))

SUMPRODUCTINDEX喜欢在parsing文本时窒息任何类似于错误的东西,因此请将单元格范围引用到您的实际数据,避免出现空白。

您的结果应该如下所示。

在这里输入图像说明