我有许多列,它们用诸如=average(E2:E4)
这样的公式计算一系列移动平均线(用于3天移动平均值)。我想使用数组公式代替,因为我不断地将数据添加到列表中。问题是,我为平均E1:E3
使用的数组与我想要创建的数组公式方向相同,其中的值将是,例如,E2:E
和E4:E
。
编辑:对不起。我只是想把我的问题说得太简洁。我想要一个更通用的公式,因为我不只是做一个3天的移动平均,而是一个7天,14天,和30天,每一个单独列。我真的不想把一个分母里的30个项目加在一起。
谢谢你到目前为止的回复。
发布于 2022-01-29 22:16:19
删除F2:F中的所有内容,只留下标题。
然后,如果您在一个使用逗号作为参数描述器的国际区域设置中,请在F2中放置以下公式:
=ArrayFormula(IF(E2:E="",,(SUMIF(ROW(E2:E),"<="&ROW(E2:E)+1,E2:E)-SUMIF(ROW(E2:E),"<"&ROW(E2:E)-1,E2:E))/ARRAY_CONSTRAIN(ISNUMBER(E:E)+ISNUMBER(E2:E)+ISNUMBER(E3:E),ROWS(E2:E),1)))
如果您在一个使用分号作为参数分隔符的国际区域设置中,请在F2中使用此版本:
=ArrayFormula(IF(E2:E="";;(SUMIF(ROW(E2:E);"<="&ROW(E2:E)+1;E2:E)-SUMIF(ROW(E2:E);"<"&ROW(E2:E)-1;E2:E))/ARRAY_CONSTRAIN(ISNUMBER(E:E)+ISNUMBER(E2:E)+ISNUMBER(E3:E);ROWS(E2:E);1)))
从本质上讲,这个公式表示,“将一行后向和一行之间的数字相加,然后除以其中许多单元格持有实数(例如,不是文本、布尔值或空值)。”
发布于 2022-01-29 19:30:00
尝试:
=transpose(index(query(transpose(split(regexextract(substitute(substitute("~"&join("~",indirect("E1:E"&max(row(E:E)*(E:E<>""))))&"~~","~","#",sequence(counta(E:E),1,4,1)),"~","#",sequence(counta(E:E),1,1,1)),"#(.*)#"),"~")),"select avg(Col"&join("), avg(Col",sequence(counta(E:E)))&")"),2))
编辑:这里有一个更通用的公式,它也适用于中间的空白单元格:
=index(iferror(transpose(index(query(--transpose(split(regexextract(substitute(substitute("~"&join("~",indirect("E1:E"&max(row(E:E)*(E:E<>""))+1))&"~~","~","#",sequence(rows(indirect("E1:E"&max(row(E:E)*(E:E<>""))+1)),1,4,1)),"~","#",sequence(rows(indirect("E1:E"&max(row(E:E)*(E:E<>""))+1)),1,1,1)),"#(.*)#"),"~")),"select sum(Col"&join("), sum(Col",sequence(rows(indirect("E1:E"&max(row(E:E)*(E:E<>""))+1))))&")"),2)/transpose(mmult(transpose(n(isnumber(ifna(transpose(split(regexextract(substitute(substitute("~"&join("~",indirect("E1:E"&max(row(E:E)*(E:E<>""))+1))&"~~","~","#",sequence(rows(indirect("E1:E"&max(row(E:E)*(E:E<>""))+1)),1,4,1)),"~","#",sequence(rows(indirect("E1:E"&max(row(E:E)*(E:E<>""))+1)),1,1,1)),"#(.*)#"),"~")))))),{1;1;1})))))
https://webapps.stackexchange.com/questions/162620
复制相似问题