#excel #vba #performance #copy-paste #array-formulas
Вопрос:
Мне нужно скопировать формулы из первой строки приведенного ниже шаблона листа Excel по крайней мере для 5000 строк.
- Задача 1 обновить формулы (я включил 2 варианта, и первый кажется немного быстрее)
- Задача 2 вставьте обновленные значения
- Задача 3 скопируйте форматы из первой строки в последнюю
Я использую следующий код, но он должен замедлиться. Есть ли более быстрое решение? Пожалуйста, не могли бы вы мне помочь?
Большое спасибо
Sub Refresh_cs()
‘ CS_PASTE_AREA = “A10:QZ5000”
Application.ScreenUpdating = FALSE
Dim Arr As Variant
If ActiveSheet.FilterMode = TRUE Then
ActiveSheet.ShowAllData
End If
**'1a REFRESHING Option 1**
'REFRESHING Calculation Sheet
ActiveSheet.Outline.ShowLevels RowLevels:=4
ActiveSheet.Range("A9").EntireRow.Copy
Range("CS_PASTE_AREA").Select
Selection.PasteSpecial Paste:=xlFormulas
**‘1b Refreshing Option 2**
Dim lastrow As Long
Dim lastcol As Long
' Find last CS Row
lastrow = Range("N3").Value - 1 - ActiveCell.Row
' Find last CS Column
ActiveSheet.Range("A9").Select
lastcol = ActiveSheet.Cells(ActiveCell.Row, Application.Columns.Count).End(xlToLeft).Column
'Range(ActiveCell, ActiveCell.Offset(0, lastcol - 1)).Select
Application.Calculation = xlCalculationManual
Arr = Range(ActiveCell, ActiveCell.Offset(0, lastcol - 1))
Range("A10").Resize(lastrow, UBound(Arr, 2)).Formula = Range(ActiveCell, ActiveCell.Offset(0, lastcol - 1)).Formula
Application.Calculation = xlCalculationAutomatic
' 2 PASTE VALUES
Range("CS_PASTE_AREA").Copy
Selection.PasteSpecial Paste:=xlValues
Application.CutCopyMode = False
' 3 PASTE FORMATS
ActiveSheet.Range("A10").EntireRow.Copy
Range("CS_PASTE_AREA").Select
Selection.PasteSpecial Paste:=xlFormats
Application.CutCopyMode = FALSE
Range("CS_END") = "-"
'ActiveSheet.Outline.ShowLevels RowLevels:=1
Application.ScreenUpdating = TRUE
End Sub
Комментарии:
1. 1) Насколько велики эти диапазоны?, 2) Какая часть медленная?, 3) Насколько она медленная сейчас и насколько быстрее она должна быть?
2. Подождите, теперь я вижу комментарий к диапазону .. Итак, что-то вроде 2 000 000 клеток?
3. Да, прибл. 2 млн клеток. Это замедляет копирование и вставку строк формул. Теперь выполнение требует 90 секунд, и я думаю, что есть более эффективный способ выполнить это действие
4. почему вы копируете формулу, а не выполняете необходимые вычисления непосредственно в vba?
5. Самая медленная часть копирования и вставки — это всегда буфер обмена. Если вы можете избежать использования буфера обмена Windows, вы можете значительно ускорить код. Это
Range1.Copy Destination:=Range2
позволяет избежать буфера обмена. ТакжеRange1.Value = Range2.Value
было бы быстрее, но пропускает форматирование.