2015-04-08 2 views
0

Есть ли более эффективный способ выполнить следующую операцию добавления трех значений ячеек в строку к соответствующим ячейкам выше, а затем удалить старую строку? Половина времени замораживания макроса; Я запускаю его примерно на 12 000 строк (на листе нет динамических формул).Макрос для удаления строк замерзает в половине случаев

Application.ScreenUpdating = False 

For a = Lcell To 2 Step -1 
    If Cells(a, 23).Value = Cells(a - 1, 23).Value Then 
     Cells(a, 16).Value = Cells(a, 16).Value + Cells(a - 1, 16).Value 
     Cells(a, 17).Value = Cells(a, 17).Value + Cells(a - 1, 17).Value 
     Cells(a, 18).Value = Cells(a, 18).Value + Cells(a - 1, 18).Value 
     Cells(a - 1, 1).EntireRow.Delete 
    End If 
Next a 

Application.ScreenUpdating = True 
+1

отправной на дне и рабочих, но тогда ваш удаление строки выше? как это будет работать ?! –

+0

никогда не используйте 'application.screenupdating = false', пока ваш код не будет работать правильно. Я уверен, что вы увидите проблему, если вы это прокомментируете. – FreeMan

+0

Вы прокомментировали 'application.screeunpdating' и прошли через код в отладчике, чтобы узнать, можете ли вы определить, где/почему это происходит неправильно? – FreeMan

ответ

0

на основе предположения Стива Мартина, попробуйте следующее:

For a = Lcell To 2 Step -1 
    If Cells(a, 23).Value = Cells(a - 1, 23).Value Then 
     Cells(a-1, 16).Value = Cells(a, 16).Value + Cells(a - 1, 16).Value 
     Cells(a-1, 17).Value = Cells(a, 17).Value + Cells(a - 1, 17).Value 
     Cells(a-1, 18).Value = Cells(a, 18).Value + Cells(a - 1, 18).Value 
     Cells(a, 1).EntireRow.Delete 
    End If 
Next a 
+0

Это дает тот же результат, что и приведенный выше код. – user3822304

0

Один вариант, когда удаление ячеек является использование UNION-УДАЛИТЬ шаблон. Это сохраняет шаг удаления до тех пор, пока логика не будет определена и не сделает все сразу. Этот метод позволяет удалить диапазон, который выполняется итерацией. Это также уменьшает операции, которые должны улучшить скорость увеличения. Однако я не тестировал его на скорость.

Edited код, чтобы удалить последнюю строку на основе комментариев

Dim rng_delete As Range 

For A = Lcell To 2 Step -1 
    If Cells(A, 23).Value = Cells(A - 1, 23).Value Then 
     Cells(A - 1, 16).Value = Cells(A, 16).Value + Cells(A - 1, 16).Value 
     Cells(A - 1, 17).Value = Cells(A, 17).Value + Cells(A - 1, 17).Value 
     Cells(A - 1, 18).Value = Cells(A, 18).Value + Cells(A - 1, 18).Value 

     'rng_delete starts empty which errors Union on first add 
     If rng_delete Is Nothing Then 
      Set rng_delete = Cells(A, 1).EntireRow 
     Else 
      Set rng_delete = Union(rng_delete, Cells(A, 1).EntireRow) 
     End If 
    End If 
Next A 

rng_delete.Delete 
+0

Хорошая идея Байрон, я тоже подумал об этом, но вам нужно удалить строки, пока вы прокручиваете строки, иначе он не будет консолидировать все значения в ячейке (a, 23), будут дубликаты. – user3822304

+0

@ user3822304, ах, я вижу это сейчас. Вы удаляете строку над последней. Пропустил «A-1». Можете ли вы удалить последнюю строку вместо этого и начать свой путь вверх, или есть что-то особенное в 2-й по последнюю строку? В моем коде, который будет: «Ячейки (A, 1) .EntireRow' вместо« A-1 ». И вышеприведенные формулы будут устанавливать «Ячейки (A-1,16) = ...» вместо «Ячейки (A, ...)». –

+0

Работал, спасибо Байрон! – user3822304

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