优化VBA命令以删除带空格的行

时间:2015-09-15 20:47:11

标签: excel vba excel-vba

我有一个宏,我使用以下命令删除A =空白的所有行:

Range("A:A").SpecialCells(xlCellTypeBlanks).EntireRow.Delete

我通过此宏运行的文件范围从1kb到300mb。

进行一些压力测试时,看起来当文件低于15mb时,命令几乎会立即执行,导致宏的运行时间为20到6分钟。

第二个我插入一个大于15mb的文件,宏将被捕获这个命令30-40分钟。

有没有人有一个很好的技巧来优化这个命令的大文件?如果对于一个13mb的文件只需要几分之一秒,那么必须有一种方法可以让一个15mb的文件需要花费一秒钟的时间,并希望它能让它在300mb的文件中花费几分之一秒......

2 个答案:

答案 0 :(得分:0)

使用AutoFilter Method并暂时关闭所有可能的环境参数。

    Application.ScreenUpdating = False
    Application.DisplayAlerts = False
    Application.EnableEvents = False
    Application.Calculation = xlCalculationManual
    With Worksheets("Sheet1")
        If .AutoFilterMode Then .AutoFilterMode = False
        With .Cells(1, 1).CurrentRegion
            .Cells.Sort Key1:=.Columns(1), Order1:=xlAscending, _
                        Orientation:=xlTopToBottom, Header:=xlYes
            .AutoFilter Field:=1, Criteria1:="="
            .Resize(.Rows.Count - 1, 1).Offset(1, 0).EntireRow.Delete
            .AutoFilter
        End With
    End With
    Application.Calculation = xlCalculationAutomatic
    Application.EnableEvents = True
    Application.DisplayAlerts = True
    Application.ScreenUpdating = True

根据我的经验,即使从下到上循环遍历行,有时也可以通过Range.SpecialCells来取消删除xlCellTypeBlanks的调用。

答案 1 :(得分:0)

好吧,所以,基本上依靠Jeeped的建议,排序是最好的方法,我只是决定索引数据并排序:

'Insert column for index
Columns("A:A").Select
Selection.Insert Shift:=xlToRight, CopyOrigin:=xlFormatFromLeftOrAbove

'Apply index
Range("A1").Select
ActiveCell.FormulaR1C1 = "1"

Range("A2").Select
ActiveCell.FormulaR1C1 = _
    "=IF(RC[1]="""","""",R[-1]C+1)"

Range("A3:A" & Range("B" & Rows.Count).End(xlUp).Row).Formula = "=IF(RC[1]="""","""",IF(R[-1]C="""",R[-2]C+1,R[-1]C+1))"

'Sort blanks to bottom
Columns("A:Z").Select
ActiveWorkbook.Worksheets("MasterList").Sort.SortFields.Clear
ActiveWorkbook.Worksheets("MasterList").Sort.SortFields.Add Key:=Columns( _
    "A:A"), SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:= _
    xlSortNormal
With ActiveWorkbook.Worksheets("Masterlist").Sort
    .SetRange Columns("A:Z")
    .Header = xlGuess
    .MatchCase = False
    .Orientation = xlTopToBottom
    .SortMethod = xlPinYin
    .Apply
End With

Columns("A").Select
Selection.Delete Shift:=xlToLeft

哪个像黄油一样运行。在底部留下非真空行,这会使文件大小增加一些,这是不理想的,但是相反,运行宏运行速度快,文件大小需要一半梅格的惩罚比坐在这里等待我想要运行一个大文件40分钟。