VBA - 自动过滤器可大幅增加纸张尺寸

时间:2014-04-02 12:02:08

标签: excel-vba vba excel

我有一个“Sheet1”,如下所示:

Sheet1

我的示例数据有73行。现在,我想基于某些列过滤此数据集,并将过滤后的数据集复制到另一个工作表“Sheet2”。使用此SO question中的代码(进行一些调整),我想出了以下代码:

Option Explicit
'Filter input sheet (Sheet1) and copy filtered sheet to new sheet
Sub FilterAndCopySheet1()
'https://stackoverflow.com/questions/13934821/vba-for-filtering-columns

    Dim LastRow As Long
    Sheets("Sheet2").UsedRange.Offset(0).ClearContents

    With Worksheets("Sheet1")
        .AutoFilterMode = False
        With Worksheets("Sheet1").Range("A1").CurrentRegion
            .AutoFilter

            'Array filter from NameList
            .AutoFilter field:=2, Criteria1:="USD", Operator:=xlFilterValues
            .AutoFilter field:=4, Criteria1:="OCR", Operator:=xlFilterValues
            .AutoFilter field:=5, Criteria1:="Europe", Operator:=xlFilterValues
            .AutoFilter field:=7, Criteria1:="Finance", Operator:=xlFilterValues
            LastRow = .Range("A" & .Rows.Count).End(xlUp).Row
            .Range("A1:A" & LastRow).SpecialCells(xlCellTypeVisible).EntireRow.Copy _
                    Destination:=Sheets("Sheet2").Range("A1")
        End With
        .AutoFilterMode = False
    End With

End Sub

代码工作得很好。唯一的问题是文件大小从大约25Kb增加到25MB。当然,这会减慢一切。

所以我的问题是:为什么这段代码会导致这样的增加?我的代码效率不高吗?或者这是自动过滤方法的固有问题?如果是这样,替代品会是什么?

1 个答案:

答案 0 :(得分:0)

玩了一会儿,阅读有关格式在Excel中疯狂的内容,我发现子末尾的这些代码行解决了这个问题:

With Sheets("Sheets2")
    LastRow = .Range("A" & .Rows.Count).End(xlUp).Row
    .Range(.Cells(LastRow + 1, 1), .Cells(.Rows.Count, .Columns.Count)).Clear
    .Range(.Cells(1, 9), .Cells(.Rows.Count, .Columns.Count)).Clear
End With

但是,原始代码会添加如此多的不需要的格式以使样本大小爆炸,这将会很有趣。