Excel 基于前12列求和列';行条目(滚动计数)
请看图片。我有一个包含多行的数据表(我处理的实际数据有2000多行) 我需要将每列中的行条目相加,但我需要将这些相加分为两个不同的类别:“新建”和“返回”。新值从值出现的第一天开始,然后在接下来的12个月内被视为新值(因此,2005年1月10日-2006年1月10日)。在最初的12个月窗口之后,该类型的任何值都将被视为“返回”。但是,对于每种类型(石头、布、剪刀),第一个值出现的日期总是不同的,因此没有一个静态日期可以测量,对于每一行,第一个值可以出现在任何日期 因此,即使出现一个值,9个月后也会出现一个值,这两个值都是“新的”。只有在第一次发生后的12个月内,它才成为“返回”Excel 基于前12列求和列';行条目(滚动计数),excel,vba,Excel,Vba,请看图片。我有一个包含多行的数据表(我处理的实际数据有2000多行) 我需要将每列中的行条目相加,但我需要将这些相加分为两个不同的类别:“新建”和“返回”。新值从值出现的第一天开始,然后在接下来的12个月内被视为新值(因此,2005年1月10日-2006年1月10日)。在最初的12个月窗口之后,该类型的任何值都将被视为“返回”。但是,对于每种类型(石头、布、剪刀),第一个值出现的日期总是不同的,因此没有一个静态日期可以测量,对于每一行,第一个值可以出现在任何日期 因此,即使出现一个值,9个月后
很明显,我可以手动完成这项工作,但对于超过2000行的数据,这可能会花费很长时间,并导致很多错误。任何解决方案都是有用的-条件格式、公式、VBA。WOW!!-这对我来说是个难题,但可以使用数组公式来完成。(我想看看我是否能做到这一点——不过,更好的解决方案肯定是在VBA中做到这一点) 我的方法是,假设您设置的数据与示例图片中的数据完全相同,这样您的
10/1/2005
数据将位于B列。
因此,为了了解您每年将如何执行此操作,假设您正在为2/1/2007
列工作(给出此示例,它将位于列R中)
因此,您的返回值计算(在单元格R6
中)如下所示:
=SUMPRODUCT(--(MMULT(IF(F2:Q4="",0,F2:Q4),TRANSPOSE({1,1,1,1,1,1,1,1,1,1,1,1}))>0),R2:R4)
请注意,必须将其作为数组函数输入(输入后使用ctrl+shift+Enter)才能工作
然后,您的New计算就是该列的总和减去您的回报。因此,在单元格
R5
中,您将有:
=SUM(R2:R4)-R6
(作为正常公式输入)
作为一个简单的解释,您使用矩阵乘法将每行中的值乘以1,并在每行的基础上求和(
MMULT()
部分),然后您只需检查它是否返回>0
——这意味着在过去12个月内该行中至少有一个值
然后,如果有一个值,则将当前月份的值添加到返回值和中(这是使用SUMPRODUCT()
函数完成的)…这将提供您所需的内容
这样做的好处是,它对任意数量的数据行都很好,因此您的情况应该是令人满意的,缺点是它将相当占用处理器,但它会工作
我希望这至少能帮助你走上正轨!(我的答案是从其他问题中抄出来的,供感兴趣的人参考)
我添加了一个助手列C,该列查找行中的第一个非空列(我的数据从D列转到AZ列)
12表示12个月,3表示数据开始的C列
退货业务位于D6和D6之间
=SUM(D2:D4)-D5
太棒了!感谢您的反馈。非常接近!因此,如果一行中填充的最左边的值+接下来的11列是“新建”窗口。如果该窗口中有任何内容,则该窗口是新建的。该窗口右侧的所有内容现在都是“返回”。您的公式适用于滚动(我知道这在我的标题中-抱歉,我有点不清楚,但这个问题甚至有点难以用语言表达。所以我只需要一个公式,从一行的第一个条目开始指定一个12个月的窗口,并将数组右边的所有内容都视为“返回”.我对你的答案投了赞成票,因为它确实回答了标题问题,这让我非常接近。另外,我知道我需要一个滚动函数。我经常处理矩阵。将来我会进入R,因为我知道矩阵数学可能更适合于这一点。恐怕我不理解你的更新要求…你在尝试什么o怎么办?甚至可以将其作为一个新问题发布,并发布一个链接?以下是新问题:
=SUMIFS(D2:D4,$C2:$C4,">"&COLUMN(D1)-12-3)
=SUM(D2:D4)-D5