2014-09-22 3 views
0

Я использовал код, приведенный ниже, из jonhaus.hubpages.com, чтобы удалить пустые столбцы, которые у меня есть.Оптимизация/оптимизация Excel VBA для удаления пустых столбцов

'Delete empty columns 
Dim c As Integer 
c = ActiveSheet.Cells.SpecialCells(xlLastCell).Column 
    Do Until c = 0 
    If WorksheetFunction.CountA(Columns(c)) = 0 Then 
      Columns(c).Delete 
    End If 
    c = c - 1 
Loop 

Однако, как я уже писал в VBA, это стало своего рода раздутой и медленно ... Я пытаюсь оптимизировать и оптимизировать свой код, исключающих петли, копирование/паст и т.д.

У вас есть предложения по коду, которые будут делать то же самое (удаление всех столбцов emtpy) БЕЗ необходимости в циклах «Do Until/If/End If/Loop»?

Ссылки: http://jonhaus.hubpages.com/hub/Excel-VBA-Delete-Blank-Blank-Columns http://www.ozgrid.com/VBA/SpeedingUpVBACode.htm

+0

Просто подумайте, но вместо того, чтобы делать итеративный '.Delete' внутри цикла, вы можете создать список столбцов для удаления, а затем удалить их все в одном '.Delete', вне цикла. Другими очевидными улучшениями являются отключить' Application.ScreenUpdating' и установить 'Application.Calculation = xlManual' * в течение * времени выполнения. (Не забудьте восстановить их нормальные функциональные возможности в конце подпрограммы , –

ответ

1

расширяющие на мой комментарий выше, создать диапазон внутри цикла, но удалить его только один раз.

Dim c As Integer 
Dim rngDelete As Range 

c = ActiveSheet.Cells.SpecialCells(xlLastCell).Column 
    Do Until c = 0 
     If WorksheetFunction.CountA(Columns(c)) = 0 Then 
      'Combine each empty column: 
      If Not rngDelete Is Nothing Then 
       Set rngDelete = Application.Union(rngDelete, Columns(c)) 
      Else 
       Set rngDelete = Columns(c) 
      End If 
     End If 
     c = c - 1 
    Loop 

    'Deletes ALL empty columns at once: 
    rngDelete.EntireColumn.Delete 

Другие очевидные улучшения, чтобы отключить Application.ScreenUpdating и установить Application.Calculation = xlManual во время выполнения. (не забудьте восстановить их нормальные функциональные возможности в конце подпрограммы.

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