我们如何在Excel中汇总时间序列?

时间:2019-10-07 18:32:53

标签: excel excel-formula

鉴于以下现金流量的时间序列,我如何才能将其汇总为Excel中的现金流量的累积时间序列,理想情况下是仅使用数组公式且不使用VBA宏?

具体来说,我得到了每个交易的现金流时间序列:

enter image description here

考虑到每个时期的交易数量(在F列中),我希望能够计算总现金流量的总计时间序列(在G列中,以黄色突出显示),最好使用数组公式只有VBA宏吗?

enter image description here

注意:H到J列仅用于说明如何显示G列的计算方式,我不想在最终电子表格中包含它们。

非常感谢您的帮助!

3 个答案:

答案 0 :(得分:2)

我相信您可以通过公式来做到这一点-最简单的方法是将现金流量转回并乘以当前和之前的5笔交易:

=SUMPRODUCT(INDEX(F:F,MAX(ROW()-5,3)):F16*INDEX(C:C,MAX(11-ROW(),3)):$C$8)

在G3中。

这是一个普通的非数组公式。

enter image description here

答案 1 :(得分:1)

确定,将此数组公式放入G3:

=IFERROR(SUMPRODUCT(INDEX($B$2:$B$7,N(IF({1},MODE.MULT(IF(INDEX(F:F,MAX(ROW()-5,3)):F3>0,(ROW()-ROW(INDEX(F:F,MAX(ROW()-5,3)):F3)+1)*{1,1}))))),INDEX(INDEX(F:F,MAX(ROW()-5,3)):F3,N(IF({1},MODE.MULT(IF(INDEX(F:F,MAX(ROW()-5,3)):F3>0,(ROW(INDEX(F:F,MAX(ROW()-5,3)):F3)-MIN(ROW(INDEX(F:F,MAX(ROW()-5,3)):F3))+1)*{1,1})))))),0)

作为数组公式,退出编辑模式时必须使用Ctrl-Shift-Enter而不是Enter进行确认。然后复制下来。

enter image description here


一旦Microsoft发布FILTERSEQUENCE,它可以缩短:

=IFERROR(SUMPRODUCT(INDEX($B$2:$B$7,FILTER(SEQUENCE(ROW()-MAX(ROW()-5,3)+1,,ROW()-MAX(ROW()-5,3)+1,-1),INDEX(F:F,MAX(ROW()-5,3)):F3>0)),FILTER(INDEX(F:F,MAX(ROW()-5,3)):F3,INDEX(F:F,MAX(ROW()-5,3)):F3>0)),0)

答案 2 :(得分:1)

这也可以在Power Query中完成。

请参阅此article,以了解如何在您的Excel版本上使用 Power Query 。它在 Excel 2010 Professional Plus和更高版本中可用。我的演示使用的是 Excel 2016

步骤是:

  1. time series of cash-flow和您的2-column output table这两个表都加载到电源查询编辑器中,然后您应该具有:

Tables

  1. 对于第一个表,将Period列与Cashflow列合并,并用分号;作为分隔符;
  2. 转置该列/表,然后使用逗号,作为分隔符合并这些列;
  3. 使用此公式="Connector"添加自定义列,该公式将用单词Connector填充该列,那么您应该具有:

Table 1 - Final

  1. 对于第二张表,还使用相同的公式="Connector"添加一个自定义列,该公式将用单词Connector填充该列;
  2. 使用Custom列作为连接将第二个表与第一个表合并,然后展开新列以显示第一个表中的Merged列,那么您应该:

Table 2 - merged

  1. 删除Custom列,然后用定界符Merged分隔,列,并将结果放入行
  2. 再次用定界符Merged分隔;列,以将PeriodCashflow与第一张表分开;
  3. 添加自定义列以计算New Period=[Period]+[Merged.1]的情况;
  4. 添加另一个自定义列以计算Cashflow=[#"# Tran"]*[Merged.2],那么您应该具有以下内容:

Table 2 - added columns

  1. CashflowNew Period列进行分组/求和。

Table 2 - Final

完成后,您可以关闭并加载结果到新的工作表中(默认情况下)。如果要在最终输出中显示# Trans列,可以在进行任何更改之前复制第二张表,然后通过Period列将其与最终输出表合并以显示相应的交易次数。

以下是第一张表的功率查询M代码:

let
    Source = Excel.CurrentWorkbook(){[Name="Tbl_CFS"]}[Content],
    #"Changed Type" = Table.TransformColumnTypes(Source,{{"Period", Int64.Type}, {"Cashflow", Int64.Type}}),
    #"Merged Columns1" = Table.CombineColumns(Table.TransformColumnTypes(#"Changed Type", {{"Period", type text}, {"Cashflow", type text}}, "en-AU"),{"Period", "Cashflow"},Combiner.CombineTextByDelimiter(";", QuoteStyle.None),"Merged"),
    #"Transposed Table" = Table.Transpose(#"Merged Columns1"),
    #"Merged Columns" = Table.CombineColumns(Table.TransformColumnTypes(#"Transposed Table", {{"Column1", type text}, {"Column2", type text}, {"Column3", type text}, {"Column4", type text}, {"Column5", type text}, {"Column6", type text}}, "en-AU"),{"Column1", "Column2", "Column3", "Column4", "Column5", "Column6"},Combiner.CombineTextByDelimiter(",", QuoteStyle.None),"Merged"),
    #"Added Custom" = Table.AddColumn(#"Merged Columns", "Custom", each "Connector")
in
    #"Added Custom"

这是第二张表的代码:

let
    Source = Excel.CurrentWorkbook(){[Name="Tbl_Total"]}[Content],
    #"Changed Type" = Table.TransformColumnTypes(Source,{{"Period", Int64.Type}, {"# Tran", Int64.Type}}),
    #"Added Custom" = Table.AddColumn(#"Changed Type", "Custom", each "Connector"),
    #"Merged Queries" = Table.NestedJoin(#"Added Custom", {"Custom"}, Tbl_CFS, {"Custom"}, "Tbl_CFS", JoinKind.LeftOuter),
    #"Expanded Tbl_CFS" = Table.ExpandTableColumn(#"Merged Queries", "Tbl_CFS", {"Merged"}, {"Merged"}),
    #"Removed Columns" = Table.RemoveColumns(#"Expanded Tbl_CFS",{"Custom"}),
    #"Split Column by Delimiter" = Table.ExpandListColumn(Table.TransformColumns(#"Removed Columns", {{"Merged", Splitter.SplitTextByDelimiter(",", QuoteStyle.Csv), let itemType = (type nullable text) meta [Serialized.Text = true] in type {itemType}}}), "Merged"),
    #"Changed Type1" = Table.TransformColumnTypes(#"Split Column by Delimiter",{{"Merged", type text}}),
    #"Split Column by Delimiter1" = Table.SplitColumn(#"Changed Type1", "Merged", Splitter.SplitTextByDelimiter(";", QuoteStyle.Csv), {"Merged.1", "Merged.2"}),
    #"Changed Type2" = Table.TransformColumnTypes(#"Split Column by Delimiter1",{{"Merged.1", Int64.Type}, {"Merged.2", Int64.Type}}),
    #"Added Custom1" = Table.AddColumn(#"Changed Type2", "New Period", each [Period]+[Merged.1]),
    #"Added Custom2" = Table.AddColumn(#"Added Custom1", "Cashflow", each [#"# Tran"]*[Merged.2]),
    #"Grouped Rows" = Table.Group(#"Added Custom2", {"New Period"}, {{"Sum", each List.Sum([Cashflow]), type number}})
in
    #"Grouped Rows"

所有步骤都使用内置函数,因此应该简单明了并且易于执行。让我知道是否有任何问题。干杯:)