VBA将代码缩短至小于255 Char

时间:2017-06-13 15:54:30

标签: vba excel-vba excel

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

我的数据有一列标记(1或0)和数量(amt)。该公式的作用是查看我的标记列,并找到与我的公式或上面的行位于同一行的3个1,但只查找不超过11​​行。然后,一旦它在标记的列中找到三个1,它就会平均3个相应的amt's。

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 个答案:

答案 0 :(得分: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

所以要限制我们需要用R1C1替换所有INDEX(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,其中有4个,具有所需的行数限制。

这确实将计数增加到254,单个数字限制为4行。如果我们转到11,它将超过您请求的255,但.FormulaR1C1没有字符限制。

enter image description here