2016-06-11 11 views
1

処理に時間がかかるマクロがあります。これの主な理由は、数式で範囲を埋めるループです。VBAエクセル計算が遅い

高速化するために、オートフィル機能をある範囲で使用して、数式を高速に入力しました。これは動作しますが、マクロを実行するときには、式を更新するためにshift + F9を押す必要があります。

Excelで計算を処理するには20分かかりますが、数式で範囲を埋めるのに20秒かかります。

Excelで式を高速に更新するための回避策はありますか?

私は範囲を分解して、activesheet.calculation関数を使用しようとしましたが、すべてが遅くなります。

Sheets("Sheet").Range(CL1 & i.Row).Formula = "=ROUND(IF(Trim(Left(" & CL1 & "$2,4))="""",""Missing Value"",IF($B" & i.Row & "=""Sheet1"",SUMIFS(INDIRECT(""'""&$B" & i.Row & "&""'!""&SUBSTITUTE(ADDRESS(1,MATCH(trim(left(" & CL1 & "$2,4))&"" - Total"",Sheet2!$1:$1,0),4),""1"","""")&"":""&" & _ "SUBSTITUTE(ADDRESS(1,MATCH(trim(left(" & CL1 & "$2,4))&"" - Total"",Sheet2!$1:$1,0),4),""1"","""")),INDIRECT(""'""&$B" & i.Row & "&""'!""&SUBSTITUTE(ADDRESS(1,MATCH($C$3,Sheet2!$1:$1,0),4),""1"","""")&"":""& " & _ "SUBSTITUTE(ADDRESS(1,MATCH($C$3,Sheet2!$1:$1,0),4),""1"","""")),$C" & i.Row & ",INDIRECT(""'""&$B" & i.Row & "&""'!""&SUBSTITUTE(ADDRESS(1,MATCH($D$3,Sheet2!$1:$1,0),4),""1"","""")&"":""&" & _ "SUBSTITUTE(ADDRESS(1,MATCH($D$3,Sheet2!$1:$1,0),4),""1"","""")),$D" & i.Row & "),IF($B" & i.Row & "=""SOI"",IFERROR(SUMIFS(INDIRECT(""'SOI'!""&SUBSTITUTE(ADDRESS(1,MATCH($C" & i.Row & ", Sheet3!$1:$1,0)+2,4),""1""," & """"") & "":"" &SUBSTITUTE(ADDRESS(1,MATCH($C" & i.Row & ",SOI!$1:$1,0)+2,4),""1"","""")),INDIRECT(""'SOI'!""&SUBSTITUTE(ADDRESS(1,MATCH($C" & i.Row & ",SOI!$1:$1,0)+0,4),""1"","""") & "":"" &SUBSTITUTE(ADDRESS(1," & _ "MATCH($C" & i.Row & ",Sheet4!$1:$1,0)+0,4),""1"","""")),Trim(Left(" & CL1 & "$2,4)),INDIRECT(""'SOI'!""&SUBSTITUTE(ADDRESS(1,MATCH($C" & i.Row & ", Sheet3!$1:$1,0)+1,4),""1"","""") & "":"" &SUBSTITUTE(ADDRESS(1,MATCH($C" & i.Row & ",SOI!$1:$1,0)+1," & "4),""1"","""")),$D" & i.Row & "),""Classification Error""),if(B" & i.Row & "=""Unrealised"",INDEX(INDIRECT($B" & i.Row & "&""!A:ZZ""),MATCH($D" & i.Row & ",INDIRECT($B" & i.Row & "&""!A:A""),0),MATCH(trim(Left(" & CL1 & "$2,4))&"" - Movement"",INDIRECT($B" & i.Row & "&""!2:2""),0)),""Sheet Name Error"")" & _ ",if(B" & i.Row & "=""SOFP"",SUMIF(Sheet4!" & Str & ": A" & fin_Row & ", A" & i.Row & ",INDEX(Sheet3!E" & str_Row & ":" & fin_Col & fin_Row & ",0,MATCH(LEFT(" & CL1 & "$2,4), Sheet3!" & "E2:" & fin_Col & "2,0))),""Sheet Name Error""))),)" 
+1

数式を簡略化するか、数式を使用する代わりにコード内の値を計算します。しかし、質問にはコードや数式はありません。あなたはどんな答えを期待していますか? – BrakNicku

+0

こんにちはBrak、コードは仕事であり、すべての機密情報です - 申し訳ありません。私の質問は、Excelが式をどのように更新し、より速い方法があるかに関連しています。 – Lowpar

+0

次に、異なるデータとフィールド名を持つ簡略化されたバージョンを表示して、その概念を見ることができます。 – Mike

答えて

1

あなたがループの中に画面や計算の更新を無効にすることができれば、それはかなり各式インサートは再計算し、残りを強制する場合は特に、パフォーマンスが向上します。

+0

こんにちはMike、これらの関数は既に無効になっています。セルに埋め込まれた後に式を更新することと関連しています。オートフィルを使用すると関数は追加されますが、セルの値は追加されます数式はセル内にあります。 – Lowpar

+0

挿入するデータと数式の例を表示できますか? – Mike

+0

必要なものを提供するための別の方法があるかもしれません。また、下から上に範囲を設定しようとしましたか? (計算がオフになっていてもチェックするのが面白い場合は違いはありません) – Mike