2017-06-13 16 views
1

いくつかの配列を転置しようとしていますが、255より長い文字を持つものがあります。だから、私は誰かがこのコードを短くするのを助けることができるかどうかを見たいと思った。VBAを255文字未満に短縮

私のデータには、フラグ(1または0)と量(amt)の列があります。数式は、私のフラグ付きの列を見て、私の数式またはそれ以上と同じ行にあるが、11行しか探していない3 1を見つけます。次に、フラグ付きの列に3つの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) 

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文字である...このデータは、12の以上のエントリの上の継続と仮定し、そのように配列数式ではない:

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式で-4 Sを交換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があります。

これにより、1桁の制限が4行でカウントが254に増加します。私たちが11に行くと、あなたが要求した255を越えるでしょうが、.FormulaR1C1は文字制限がありません。

enter image description here

+0

興味深いプロセスであり、動作しているようです!カップルのこと。 1.それを修正して有限の量を調べる方法はありますか?同様に、この例では、セルは4行しかルックアップしません。 ; 2.インデックス内の集計はどのように機能しますか?私は集計に精通していませんが、私はインデックスマッチです。 – PVic

+0

@Pvic編集を参照してください。 –

+0

集計では、行番号を返します。行1または希望の行数の間の列Aに1を持つ3番目に大きい行番号と、数式が配置されている行を検索します。その後、その行番号をINDEXに返し、それをaverageIFに返します。 –

関連する問題