Excel 使用筛选器存储产品的动态数组(选择&x2B;sumproduct)

Excel 使用筛选器存储产品的动态数组(选择&x2B;sumproduct),excel,excel-formula,Excel,Excel Formula,我有一个日期栏和另外两个栏。我想制作一个动态数组函数,显示每个月的月份和其他两列的求和积,并在单元格D2中按年份过滤 我目前的公式是:=CHOOSE({1,2})、SORT(UNIQUE(TEXT(B5:B14,MMMM))、SUMPRODUCT(C5:C14,D5:D14,--(YEAR(B5:B14)=D2)) 它按年份过滤,但我不知道如何在动态数组中按月份进行sumproduct 我知道添加另一列并将两列相乘很容易,但这是针对一个文件超过200K行的实际任务,因此添加另一行不是一个选项。

我有一个日期栏和另外两个栏。我想制作一个动态数组函数,显示每个月的月份和其他两列的求和积,并在单元格D2中按年份过滤

我目前的公式是:
=CHOOSE({1,2})、SORT(UNIQUE(TEXT(B5:B14,MMMM))、SUMPRODUCT(C5:C14,D5:D14,--(YEAR(B5:B14)=D2))

它按年份过滤,但我不知道如何在动态数组中按月份进行sumproduct

我知道添加另一列并将两列相乘很容易,但这是针对一个文件超过200K行的实际任务,因此添加另一行不是一个选项。 (单击工作表配置的图像以查看动态arrray的示例)

样本数据表:

日期 价值1 价值2 2021-01-15 19 23 2021-01-15 12 15 2021-01-30 16 22 2021-02-15 13 11 2021-02-28 29 12 2021-02-28 15 14 2021-03-03 14 15 2021-03-03 25 27 2021-03-03 16 21 2021-03-03 29 27 2020-01-15 10 23 2020-01-20 18 30 2020-01-30 27 11 2020-02-15 22 18 2020-02-28 23 11 2020-02-28 22 18 2020-03-03 29 17 2020-03-03 20 17 2020-03-03 13 13 2020-03-03 19 22
您将需要一个帮助器列:

然后我们可以使用SUMIFS:

=LET(
      dt,     B5:B24,
      ttl,    E5:E24,
      tgt,   D2,
      mnt,    SORT(UNIQUE(FILTER(MONTH(dt),YEAR(dt)=tgt))),
      omnt,   UNIQUE(TEXT(SORT(FILTER(dt,YEAR(dt)=tgt)),"MMMM")),
      smttl,   SUMIFS(ttl,dt,">="&DATE(tgt,mnt,1),dt,"<"&DATE(tgt,mnt+1,1)),
      CHOOSE({1,2},omnt,smttl))

那么公式是:

=LET(
      dt,     B5:B24,
      fst,    C5:C24,
     scd,    D5:D24,
      tgt,   D2,
      mnt,    SORT(UNIQUE(FILTER(MONTH(dt),YEAR(dt)=tgt))),
      omnt,   UNIQUE(TEXT(SORT(FILTER(dt,YEAR(dt)=tgt)),"MMMM")),
      smttl,   SUMPRODUCTARRAY(dt,fst,scd,tgt,mnt),
      CHOOSE({1,2},omnt,smttl))

这将使用
FILTER
函数生成2个数据数组,其中月份和年份与指定的值相匹配(每列数据对应一个)。然后,它将这些数组聚合在一起

不幸的是,我不太可能只用1个
过滤器就可以工作,但是其他人可能会知道这是否可行


(注意:由于使用
文本
将日期转换为字符串,如果Excel未设置为您编写月份时使用的语言,则可能会出现问题;例如,如果Excel设置为英语,则它将无法识别示例中显示的西班牙语月份。)

我发现您正在使用
UNIQUE
功能;您的Excel版本是否也可以访问
过滤器
函数?如果您将数据放在一个我们可以复制粘贴而不是手动重新创建的表单中,这将非常容易。顺便说一句,您需要执行两个相乘的SUMIFS()。@Chronocidal是的,我可以访问所有动态数组函数,还有让和其他一些新函数。@ScottCraner抱歉,我不知道你把数据放在表单中的想法,你能解释一下吗?
SUM(FILTER($C$5:$C$24*$D$5:$D$D$24,TEXT($B$5:$B$24,“mmmmyyyyy”)=$G5&$D$2))
适合我。但这不能使其“溢出”。它需要被复制/拖下来。我只是看不到一种方法可以同时满足这两个要求,即无辅助列和可溢出。
=LET(
      dt,     B5:B24,
      fst,    C5:C24,
     scd,    D5:D24,
      tgt,   D2,
      mnt,    SORT(UNIQUE(FILTER(MONTH(dt),YEAR(dt)=tgt))),
      omnt,   UNIQUE(TEXT(SORT(FILTER(dt,YEAR(dt)=tgt)),"MMMM")),
      smttl,   SUMPRODUCTARRAY(dt,fst,scd,tgt,mnt),
      CHOOSE({1,2},omnt,smttl))
=SUMPRODUCT(
    FILTER($C$5:$C$24,
        TEXT($B$5:$B$24,"mmmmyyyy") = $G5&$D$2),
    FILTER($D$5:$D$24,
        TEXT($B$5:$B$24,"mmmmyyyy") = $G5&$D$2))