У меня есть макрос, который занимает много времени для обработки. Основной причиной этого является цикл, который заполняет диапазон формулой.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""))),)"
Упростить формулу или рассчитать значения в коде вместо использования формул. Но в этом вопросе нет кода или формулы, так какой ответ вы ожидаете? – BrakNicku
Привет, Брак, код с работы и все конфиденциальные - извините. Мой вопрос больше связан с тем, как Excel обновляет формулы и существует более быстрый способ. – Lowpar
Затем покажите упрощенную версию с разными именами данных и полей, чтобы мы могли видеть концепцию. – Mike