我有一个“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。当然,这会减慢一切。
所以我的问题是:为什么这段代码会导致这样的增加?我的代码效率不高吗?或者这是自动过滤方法的固有问题?如果是这样,替代品会是什么?
答案 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
但是,原始代码会添加如此多的不需要的格式以使样本大小爆炸,这将会很有趣。