是否存在可以创建扩展数组公式的功能,该公式可以根据多个条件有条件地对列进行求和?

时间:2018-12-31 22:57:04

标签: google-sheets

首先,这是我的第一次发帖,所以请告诉我是否可以以任何方式修正我的帖子,以使其更易于回答。

我正在尝试创建一个自动展开的数组公式

我有一张包含我的投资资产组合的表格,其中包括每只特定股票的拥有量,还有一张追踪我何时收到股息的表格。我的目标是编写一个自动扩展的数组公式,该公式将在收到股利之日总计股票拥有量,然后返回该值。我写了三个不同的公式来完成此任务,但是它们都不会将其自动展开为数组。

我确定有很多解决方案我被忽略了。归根结底,我需要一个扩展的数组公式,该公式将有条件地对资产组合表的“ Shares”列(“ Asset Mix”!D2:D或“ AssetMixShares”)求和。在“股息”!C2:C中输入的股票名称需要与“资产组合”!A2:A中的股票名称匹配(或命名范围为“ AssetMixStocks”)。然后,它需要对照“股息”!A2:A中的日期检查“资产组合”!C2:C(或“ AssetMixDates”)中的日期,并对购买日期小于(早于)购买日的所有股份金额求和。除息日。

我可能会在“运行总计”列上写某种vlookup数组-'Asset Mix'!E:E-这样可以解决问题,但是我希望消除该列。我非常强烈地认为,没有总计栏的帮助,我想做的事情应该是可能的-我只是不了解。

我尝试了无数的函数和公式,但是示例工作表中当前拥有的四个函数是 SUM SUMPRODUCT DSUM ,和查询

尝试1

SUM IF

=ArrayFormula(SUM(IF('Asset Mix'!A:A=C2,IF('Asset Mix'!C:C<A2,'Asset Mix'!D:D))))

尝试2

SUMPRODUCT

=({arrayformula(SUMPRODUCT(--((AssetMixStock=(indirect("C"&ROW())))*(AssetMixDate<(indirect("A"&ROW())))),AssetMixShares))})

尝试3

DSUM

=DSUM('Asset Mix'!A:E,"Shares",{"Date","Stock";"<"&A2,C2})

尝试4

查询

=arrayformula(query(AssetMix,"Select sum(D) where A = '"&C2:C&"' and C < date'"&(text(year(A2:A),"0000") & "-" & text(month(A2:A),"00") & "-" & text(day(A2:A),"00"))&"' label sum(D) ''",0))

只要我手动将公式向下拖动,这些都将起作用,但是我想编写某种公式,该公式会自动扩展到“股息”表的底部。

我试图创建一个包含两个相关工作表的虚拟工作表。请让我知道您是否可以访问它-链接在下面。 https://docs.google.com/spreadsheets/d/1wlKffma0NJ0KrlWxyX_N20y62azsGpFp3enhmjzJK1Q/edit?usp=sharing

非常感谢您所做的一切以及您能提供的任何帮助!

2 个答案:

答案 0 :(得分:0)

我们可以专注于第一个公式来理解使其“可自扩展”的方法。如我们所见,它包含对“股息”表中单元格A2和C2的引用:

=ArrayFormula(SUM(IF('Asset Mix'!A:A=C2,IF('Asset Mix'!C:C<A2,'Asset Mix'!D:D))))

每当这些列(A和C)中出现某些数据时,该公式都将起作用。如果手动编辑,我们可以通过onEdit trigger控制公式的存在。考虑代码:

function onEdit(e) {
  var sheet = SpreadsheetApp.getActive().getActiveSheet();
  if (sheet.getName() == 'Dividends') {
    var row = e.range.getRow();
    for (var offset = 0; offset < e.range.getHeight(); offset++) {
      sheet.getRange(3, 10).copyTo(sheet.getRange(row + offset, 10));
    }
  }
}

它检查工作表“股息”上的所有修改,并将所需的公式复制到修改后的行。这样,公式就可以扩展为正在使用的其他行。

答案 1 :(得分:0)

好,解决了!万一其他人有同样的问题,我会保留。

一个善良的灵魂向我解释了MMULT()的魔力,并写下了这个解决方案。

=ARRAYFORMULA(MMULT((C2:C=TRANSPOSE('Asset Mix'!A2:A))*(A2:A>TRANSPOSE('Asset Mix'!C2:C)),N('Asset Mix'!D2:D))