2016-06-11 4 views
1

У меня есть макрос, который занимает много времени для обработки. Основной причиной этого является цикл, который заполняет диапазон формулой.VBA Excel вычисляется медленно

Чтобы ускорить работу, я использовал функцию автозаполнения в диапазоне, чтобы быстрее заполнить формулу. Это работает, однако, когда я запускаю макрос, мне нужно нажать 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

Привет, Брак, код с работы и все конфиденциальные - извините. Мой вопрос больше связан с тем, как Excel обновляет формулы и существует более быстрый способ. – Lowpar

+0

Затем покажите упрощенную версию с разными именами данных и полей, чтобы мы могли видеть концепцию. – Mike

ответ

1

Если вы можете отключить обновление экрана и вычислений во время цикла, это позволит существенно улучшить производительность, особенно, если каждая формула вставки заставляет остальных пересчитывать.

+0

Привет, Майк, эти функции уже отключены, это больше связано с обновлением формул после того, как они встроены в ячейки, когда я использую autofill, он добавляет функцию, но значение из ячейки выше, мне нужно обновить значения один раз формула находится в ячейках. – Lowpar

+0

Можете ли вы показать нам пример данных и формул, которые вы вставляете? – Mike

+0

Возможно, существует другой способ доставки того, что вам нужно. Или вы пытались заполнить диапазон снизу вверх? (Не нужно делать разницу, если вычисление выключено, но интересно проверить) – Mike

Смежные вопросы