Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/mongodb/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在Excel中聚合时间序列?_Excel_Excel Formula - Fatal编程技术网

如何在Excel中聚合时间序列?

如何在Excel中聚合时间序列?,excel,excel-formula,Excel,Excel Formula,给定以下现金流时间序列,如何在Excel中将其聚合为现金流的累积时间序列(理想情况下,仅使用数组公式而不使用VBA宏) 具体而言,我获得了每笔交易的现金流时间序列: 考虑到F列中关于每个期间交易数量的输入,我希望能够计算G列中总现金流的聚合时间序列(以黄色突出显示),理想情况下仅使用数组公式,而不使用VBA宏 注:H列至J列仅用于说明G列应如何计算的插图,我不想在最终电子表格中使用它们 非常感谢你的帮助 OK将此数组公式放入G3: =IFERROR(SUMPRODUCT(INDEX($B$2:$

给定以下现金流时间序列,如何在Excel中将其聚合为现金流的累积时间序列(理想情况下,仅使用数组公式而不使用VBA宏)

具体而言,我获得了每笔交易的现金流时间序列:

考虑到F列中关于每个期间交易数量的输入,我希望能够计算G列中总现金流的聚合时间序列(以黄色突出显示),理想情况下仅使用数组公式,而不使用VBA宏

注:H列至J列仅用于说明G列应如何计算的插图,我不想在最终电子表格中使用它们


非常感谢你的帮助

OK将此数组公式放入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确认。然后抄下来

一旦Microsoft放松了过滤器和顺序,它就可以缩短:

=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)

好,把这个数组公式放在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确认。然后抄下来

一旦Microsoft放松了过滤器和顺序,它就可以缩短:

=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)

我相信你可以通过公式来实现——最简单的方法是将现金流倒转,乘以当前和之前的5笔交易:

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

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


我相信你可以通过公式来实现——最简单的方法是将现金流倒转,乘以当前和之前的5笔交易:

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

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


这也可以在电源查询中完成

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

步骤如下:

将现金流时间序列的两个表和两列输出表加载到power query editor,然后您应该有: 对于第一个表,使用分号将期间列与现金流列合并;作为定界符; 转换列/表,然后以逗号作为分隔符合并列; 添加一个自定义列使用此公式=Connector,它将用单词Connector填充该列,然后您应该具有: 对于第二个表,还添加一个自定义列,使用相同的公式=Connector,该公式将用单词Connector填充该列; 使用自定义列作为连接将第二个表与第一个表合并,然后展开新列以显示第一个表中的合并列,然后您应该具有: 移除自定义列,然后用分隔符逗号拆分合并列,并将结果放入行中; 以分号分隔符再次拆分合并列;将期间和现金流从第一个表中分离出来; 添加自定义列以计算新期间=[Period]+[Merged.1]; 添加另一个自定义列以计算现金流=[Tran]*[Merged.2],然后您应该有如下内容: 按新期间对现金流列进行分组/求和。 完成后,默认情况下,您可以关闭并将结果加载到新工作表中。如果要在最终输出中显示Trans列,可以在进行任何更改之前复制第二个表,然后按句点列将其与最终输出表合并,以显示相应的事务数

以下是第一个表的power query 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"

所有步骤都使用内置函数,因此应该是直接的,易于执行。如果有任何问题,请告诉我。干杯:

这也可以在电源查询中完成

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

步骤如下:

将现金流时间序列的两个表和两列输出表加载到power query editor,然后您应该有: 对于第一个表,使用分号将期间列与现金流列合并;作为定界符; 转换列/表,然后以逗号作为分隔符合并列; 添加一个自定义列使用此公式=Connector,它将用单词Connector填充该列,然后您应该具有: 对于第二个表,还添加一个自定义列,使用相同的公式=Connector,该公式将用单词Connector填充该列; 使用自定义列作为连接将第二个表与第一个表合并,然后展开新列以显示第一个表中的合并列,然后您应该具有: 移除自定义列,然后用分隔符逗号拆分合并列,并将结果放入行中; 以分号分隔符再次拆分合并列;将期间和现金流从第一个表中分离出来; 将自定义列添加到calcu 新期间的后期=[Period]+[Merged.1]; 添加另一个自定义列以计算现金流=[Tran]*[Merged.2],然后您应该有如下内容: 按新期间对现金流列进行分组/求和。 完成后,默认情况下,您可以关闭并将结果加载到新工作表中。如果要在最终输出中显示Trans列,可以在进行任何更改之前复制第二个表,然后按句点列将其与最终输出表合并,以显示相应的事务数

以下是第一个表的power query 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"

所有步骤都使用内置函数,因此应该是直接的,易于执行。如果有任何问题,请告诉我。干杯:

谢谢!你能解释一下这两个公式是如何工作的吗?@vkc这需要对所有部分都有深入的了解。可以这样说,它使用N向索引返回一个行号数组,该数组根据F中的值相对于公式所在位置大于0的位置提取正确的值。必须处理这样一个事实,即标准范围内的单元格将少于交易中的单元格。这就是为什么vba更适合这种情况。易于维护。谢谢!你能解释一下这两个公式是如何工作的吗?@vkc这需要对所有部分都有深入的了解。可以这样说,它使用N向索引返回一个行号数组,该数组根据F中的值相对于公式所在位置大于0的位置提取正确的值。必须处理这样一个事实,即标准范围内的单元格将少于交易中的单元格。这就是为什么vba更适合这种情况。易于维护。感谢您提供的简洁优雅的解决方案。是否有一个简单的Excel公式可以帮助逆转C列中的现金流?谢谢,问得好!在这种特殊情况下,它将是=INDEXB:B,11行。下一个问题是,你是否可以把这一点直接放在主要公式中——你必须考虑一下这个公式。简短的回答是,我认为你最终会使用偏移量或相当古怪的indexB:B,nif{1}。。。哪种构造失去了原始公式的简单性。感谢您简洁优雅的解决方案。是否有一个简单的Excel公式可以帮助逆转C列中的现金流?谢谢,问得好!在这种特殊情况下,它将是=INDEXB:B,11行。下一个问题是,你是否可以把这一点直接放在主要公式中——你必须考虑一下这个公式。简短的回答是,我认为你最终会使用偏移量或相当古怪的indexB:B,nif{1}。。。哪种构造失去了原公式的简单性。