Добрый день. Помогите пожалуйста решить вопрос с ускорением макроса. Есть макрос, который проверяет заполненные строки и после каждой заполненной добавляет пустую строку. Но при большом кол-ве строк файл просто зависает и можно идти смотреть кино. Как можно ускорить этот процесс? Вот код этого макроса
Код
'Добавляем
Sub InsertRows()
Dim i As Long: i = 1
Do While i < 20000 '20000 - количество проверяемых строк
If Not IsEmpty(Cells(i, 1)) Then Cells(i + 1, 1).EntireRow.Insert
i = i + 2
Loop
End Sub
1 если вы Do While i < 20000 '20000 - количество проверяемых строк и i = i + 2, то вы проверяете ровно половину исходных строк. Если так и надо, то ок, если нет, то лучше начинать от последней к первой, тогда на сдвиг можно внимания не обращать. 2. а ускорить простыми отключениями
Код
With Application
KeepCalc = .Calculation
.Calculation = xlCalculationManual
.ScreenUpdating = False
.EnableEvents = False
End With
'Your code there
With Application
.Calculation = KeepCalc
.ScreenUpdating = True
.EnableEvents = True
End With
Если нужно радикально ускорить, то вариант: забрать исходный диапазон в массив, создать второй массив, который будет в два раза больше, затем цикл по первому с проверкой и перекладывать в нужные строки второго массива. Затем по количеству заполненных строк выгрузить второй массив на лист. Будет очень быстро.
Юрий М, БМВ, извините если я кого-то обидел, не для этого я создал тему. В интернете много непонятного и неверного, а тут практически онлайн общение да и люди знающие.
Юрий М написал: забрать исходный диапазон в массив
этот вариант может оказаться спорным, если данных много и массив большой. Время загрузки и выгрузки может оказаться существенным. + там всякие форматы надо учесть .... короче вариант однозначно рабочий, но применять надо , как и все прочие, осмысленно.
БМВ, я же про сам принцип (вариант) ускорения ) anddrei55, Вашего примера не было - набросал вариант для диапазона из трёх столбцов. Данные начинаются со второй строки. Доработать под большее колчество столбов проблем не составит.
Код
Sub Macro1()
Dim LastRow As Long, i As Long, x As Long, Arr()
LastRow = Cells(Rows.Count, 1).End(xlUp).Row
Arr = Range(Cells(2, 1), Cells(LastRow, 3)).Value
x = 1
ReDim arr2(1 To UBound(Arr) * 2, 1 To 3)
For i = 1 To UBound(Arr)
arr2(x, 1) = Arr(i, 1)
arr2(x, 2) = Arr(i, 2)
arr2(x, 3) = Arr(i, 3)
If Arr(i, 1) <> "" Then
x = x + 2
Else
x = x + 1
End If
Next
Range("A2").Resize(x, 3).Value = arr2
End Sub
Юрий М написал: БМВ, я же про сам принцип (вариант) ускорения )
То что Вы Умник в самом положительном смысле - я даже под сомнение ставить не стану. Просто отметил что способ может быть не так хорош, как ожидается, при определенных условиях.