我正在尝试找到一个5年移动平均线,它取一年中的一个月的条件。 A列包含从2010年1月1日到今天当前日期的每日日期。 B列包含每日数量。基本上我想在5年的滚动期内平均1月份的所有日子。我可以轻松地将其作为静态数字,但此表将每天更新。
例如:
class Base
{
public:
virtual void Method() = 0;
};
class Child : public Base
{
public:
void Method() override;
};
// source.cpp
void Child::Method() override // oops
{
...
}
等...
我写过这个公式:
Date Quantity
1/1/2010 14,113
1/2/2010 15,364
这会返回=AVERAGEIFS(OFFSET(B2,COUNT(B2:B10000)-1826,0,1826,1),A2:A10000,MONTH(A2:A10000)=1)
答案 0 :(得分:1)
您将无法使用AVERAGEIFS()。 AVERAGEIFS只进行简单的迭代,不进行转换。
在设置变量范围时,我更喜欢使用INDEX来获取范围,因为它不是Volatile。
此外,所有范围必须相同。因此,将B列限制为1826个单元但不限制A列到相同的1826个单元将导致第二个错误。
使用此数组公式:
=AVERAGE(IF(MONTH(INDEX(A:A,MATCH(1E+99,B:B)-1826):INDEX(A:A,MATCH(1E+99,B:B)))=1,INDEX(B:B,MATCH(1E+99,B:B)-1826):INDEX(B:B,MATCH(1E+99,B:B))))
作为一个数组公式,需要在退出编辑模式时使用Ctrl-Shift-Enter而不是Enter来确认。
您也可以使用日期本身而不是硬编码的1826天。这将允许闰年。
=AVERAGE(IF(MONTH(INDEX(A:A,MATCH(DATE(YEAR(TODAY())-5,MONTH(TODAY()),DAY(TODAY())),A:A,0)):INDEX(A:A,MATCH(TODAY(),A:A)))=1,INDEX(B:B,MATCH(DATE(YEAR(TODAY())-5,MONTH(TODAY()),DAY(TODAY())),A:A,0)):INDEX(B:B,MATCH(TODAY(),A:A))))
答案 1 :(得分:1)
这是另一个选择
=AVERAGE(IF(A2:A5000>EDATE(TODAY(),-60),IF(MONTH(A2:A5000)=1,B2:B5000)))
使用 CTRL + SHIFT确认 + ENTER
这不会尝试查找特定范围的数据,只查看所有数据并平均过去5年和1月份的日期行。在查看所有行时会有一些额外的开销,但是您的数据量相对较少,所以我不希望这些数据很重要