Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/google-app-engine/4.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 基于前12列求和列';行条目(滚动计数)_Excel_Vba - Fatal编程技术网

Excel 基于前12列求和列';行条目(滚动计数)

Excel 基于前12列求和列';行条目(滚动计数),excel,vba,Excel,Vba,请看图片。我有一个包含多行的数据表(我处理的实际数据有2000多行) 我需要将每列中的行条目相加,但我需要将这些相加分为两个不同的类别:“新建”和“返回”。新值从值出现的第一天开始,然后在接下来的12个月内被视为新值(因此,2005年1月10日-2006年1月10日)。在最初的12个月窗口之后,该类型的任何值都将被视为“返回”。但是,对于每种类型(石头、布、剪刀),第一个值出现的日期总是不同的,因此没有一个静态日期可以测量,对于每一行,第一个值可以出现在任何日期 因此,即使出现一个值,9个月后

请看图片。我有一个包含多行的数据表(我处理的实际数据有2000多行)

我需要将每列中的行条目相加,但我需要将这些相加分为两个不同的类别:“新建”和“返回”。新值从值出现的第一天开始,然后在接下来的12个月内被视为新值(因此,2005年1月10日-2006年1月10日)。在最初的12个月窗口之后,该类型的任何值都将被视为“返回”。但是,对于每种类型(石头、布、剪刀),第一个值出现的日期总是不同的,因此没有一个静态日期可以测量,对于每一行,第一个值可以出现在任何日期

因此,即使出现一个值,9个月后也会出现一个值,这两个值都是“新的”。只有在第一次发生后的12个月内,它才成为“返回”


很明显,我可以手动完成这项工作,但对于超过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