2014-09-22 120 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,它得到有点臃肿和缓慢......我试图优化,并通过消除环路,复制/粘贴简化我的代码等

你们是否对代码做了相同的建议(删除整个静态列)而不需要循环“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' *(记得在子例程结束时恢复它们的正常功能。 – 2014-09-22 17:46:58

回答

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。 (记住要在子程序结束时恢复它们的正常功能