2017-06-13 88 views
1

我想转置一些数组,但有一些字符长度超过255给我麻烦。所以,我想看看是否有人可以帮我缩短下面的代码。VBA缩短代码小于255字符

我的数据具有标记的列(1或0)和量(AMT)。什么公式确实是我的标记栏的外观和发现3名1的是在同一行作为我的公式或以上,但只能仰视不超过11​​行以上。然后,一旦它找到三个1在标记列它的平均值的3分对应的AMT的。

IFERROR(IF(RC[-2]=1, AVERAGE(INDEX(R[-11]C[-1]:RC[-1], MATCH(2,1/(FIND(1,R[-11]C[-2]:RC[-2])))), INDEX(R[-11]C[-1]:R[-1]C[-1],MATCH(2,1/(FIND(1,R[-11]C[-2]:R[-1]C[-2])))), INDEX(R[-11]C[-1]:R[-2]C[-1],MATCH(2,1/(FIND(1,OFFSET(R[-2]C[-2],-9,0,MATCH(2,1/(FIND(1,R[-11]C[-2]:R[-1]C[-2])))-1)))))),0),0) 

假设该数据继续进行超过12个条目...

flag | amt | avg 
    1 | 5 | 0 
    1 | 6 | 0 
    1 | 2 | 4.33 = (2+6+5)/3 
    0 | 7 | 0 
    1 | 6 | 4.67 = (6+2+6)/3 
    1 | 11 | 6.33 = (11+6+2)/3 

回答

1

这种基于R1C1公式只162个字符,并且它不是一个阵列式这样:

Range("C2:C7").FormulaR1C1 = "=IFERROR(IF(RC1<>0,AVERAGEIFS(INDEX(C2:C2,AGGREGATE(14,6,ROW(R1C1:RC1)/(R1C1:RC1=1),3)):RC2,INDEX(C1:C1,AGGREGATE(14,6,ROW(R1C1:RC1)/(R1C1:RC1=1),3)):RC1,1),0),0)" 

enter image description here


所以限制,我们需要替换所有R1C1INDEX(C1:C1,MAX(1,ROW()-4))

Range("C2:C7").FormulaR1C1 = "=IFERROR(IF(RC1<>0,AVERAGEIFS(INDEX(C2:C2,AGGREGATE(14,6,ROW(INDEX(C1:C1,MAX(1,ROW()-4)):RC1)/(INDEX(C1:C1,MAX(1,ROW()-4)):RC1=1),3)):RC2,INDEX(C1:C1,AGGREGATE(14,6,ROW(INDEX(C1:C1,MAX(1,ROW()-4)):RC1)/(INDEX(C1:C1,MAX(1,ROW()-4)):RC1=1),3)):RC1,1),0),0)" 

公式中更换-4 s行的数量,有其中4个,与期望行的限制。

这确实增加了计数至254的4行的单一的数字限制。如果我们去到11它会在您所要求的255,但.FormulaR1C1没有一个字符的限制。

enter image description here

+0

有趣的过程,它似乎工作!一些事情; 1.有没有办法修改它,使其查找有限的数量?就像这个例子那样,单元格只查找4行。 ; 2.总计如何在索引中工作?我不熟悉聚合,但我与索引匹配。 – PVic

+0

@PVic看到编辑。 –

+0

至于Aggregate,它返回行号,找到第1行或所需行数up和放置公式的行之间A列中第1行的第3个行号。然后它将该行号返回到INDEX,然后将其返回到平均IF –