请看图片。我有一个包含多行的数据表(我正在使用的实际数据有2,000多行)。
我需要对每列中的行条目求和,但我需要将这些总和分为两个不同的类别:“new”和“return”。新值从值出现的第一天开始,然后在接下来的12个月内被认为是新的(因此10/1/2005 - 10/1/2006)。在最初的12个月窗口之后,该类型的任何值都被视为“返回”。第一个值出现的日期总是不同,对于每种类型(Rock,Paper,Scissors),所以没有一个我可以测量的静态日期,对于每一行,第一个值可以在任何日期出现。
因此,即使出现值,9个月后出现一个值,这两个值都是“新的”。只有在第一次出现后的12个月之后它才会变成“返回”。
我可以手动执行此操作,但是超过2,000行可能需要永久性并导致很多错误。任何解决方案都是有用的 - 条件格式,公式,VBA。
答案 0 :(得分:2)
WOW !! - 这个对我来说是一个doozie,但它可以使用数组公式完成。 (我想知道我是否可以这样做 - 但更好的解决方案肯定是在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 + 输入)为了这个工作。
然后,您的新计算只是此列的总和减去您的回报。因此,在单元格R5
中,您将拥有:
=SUM(R2:R4)-R6
(作为正常公式输入)。
作为一个简单的解释,您使用矩阵乘法将每行中的值乘以1,并在每行的基础上将它们相加(MMULT()
部分),然后您就可以使用矩阵乘法。只需检查它是否返回>0
- 意味着过去12个月该行中至少有一个值。
然后,如果有值,则将当前月份的值添加到返回总和(这是使用SUMPRODUCT()
函数完成的)...这可以满足您的需求。
关于这一点的好处是它对于任何数量的数据行都很容易,所以你的情况应该得到满足,坏的是它将是相当处理器密集的,但它会工作!!
我希望这至少可以帮助你走上正轨!
答案 1 :(得分:1)
(我的答案从其他问题复制给任何感兴趣的人)
我添加了一个辅助列C,它找到了行中的第一个非空白(我的数据从D列到了AZ列)
=MATCH(TRUE,INDEX((D2:AZ2<>0),0),0)
这是我放入单元格D5并将其复制到
的公式=SUMIFS(D2:D4,$C2:$C4,">"&COLUMN(D1)-12-3)
12为12个月,3为C列,数据开始。
退货业务在D6和
之间=SUM(D2:D4)-D5