2016-09-02 93 views
1

我想弄清楚从大表过滤数据,过滤它,并将过滤的数据复制到新的工作表的最有效的方法。以下是我拥有的代码 - 可以工作,但需要一分钟才能完成。我的最终目标是采用模板工作簿(包括我的所有数据)并根据过滤的数据创建子工作簿。我尝试使用SaveCopyAs创建子工作簿,但最终失去了原始数据。所以,我试图将过滤的数据复制到不同的工作表中作为解决方法。请帮忙!从循环中的模板工作簿创建工作簿

wsDV.ListObjects("DVTable").Range.AutoFilter Field:=2, Criteria1:=wsMaster.Range("F" & x) 
    Application.DisplayAlerts = False 
    On Error Resume Next 
    wsDV.ListObjects("DVTable").HeaderRowRange.Copy Destination:=wsSalary.Range("C3") 
    wsDV.ListObjects("DVTable").DataBodyRange.SpecialCells(xlCellTypeVisible).Copy 
    wsSalary.Range("C4").PasteSpecial xlPasteValues 
    Application.CutCopyMode = False 

谢谢。

+0

尝试将“模板工作簿”中的表格转换为范围,然后执行其余的操作....我希望它能够快速执行.. – HA560

+0

10你在说什么循环?你是否试图在循环中做某件事 - 或者已经在循环中做了,而不是向我们展示?你有可用的代码 - 但仅适用于一个工作簿 - 是否正确? – dbmitch

+0

循环未显示,但基本上用于确定范围过滤器并将工作簿保存为该文件名。上面的代码可以复制......它太慢了。循环代码不起作用,因为我的原始工作簿会在应用过滤器后被覆盖。 – Chris2015

回答

0

有你可以做调整的速度

关闭动态和活动的小应用程序的变化: (!务必再将其打开后)

Application.ScreenUpdating = False 
Application.DisplayStatusBar = False 
Application.EnableEvents = False 

但最大的改进将来自删除复制/粘贴操作 - 尤其是使用剪贴板 - 并且如果您只是粘贴值,则可以执行此操作。

增加值范围直接

更改此:

wsDV.ListObjects("DVTable").HeaderRowRange.Copy Destination:=wsSalary.Range("C3") 
wsDV.ListObjects("DVTable").DataBodyRange.SpecialCells(xlCellTypeVisible).Copy 
wsSalary.Range("C4").PasteSpecial xlPasteValues 

这样:

Dim rgeFrom  As Range 
Dim rgeTo  As Range 

Dim numCols  As Long 
Dim startCol As Long 
Dim startRow As Long 

Dim endCol  As Long 
Dim endRow  As Long 

Set rgeFrom = wsDV.ListObjects("DVTable").HeaderRowRange 
numCols = rgeFrom.Columns.Count 
numRows = rgeFrom.Rows.Count 

startCol = 3 ' wsSalary Start Cell C3 
startRow = 3 

endCol = startCol + numCols - 1 
endRow = startRow + numRows - 1 

Set rgeTo = Range(Cells(startRow, startCol), Cells(endRow, endCol)) 

rgeTo.Value = rgeFrom.Value 

' Do same for next range DataBodyRange 

Set rgeFrom = wsDV.ListObjects("DVTable").DataBodyRange 
numCols = rgeFrom.Columns.Count 
numRows = rgeFrom.Rows.Count 

startCol = 3 ' wsSalary Start Cell C4 
startRow = 4 

endCol = startCol + numCols - 1 
endRow = startRow + numRows - 1 

Set rgeTo = Range(Cells(startRow, startCol), Cells(endRow, endCol)) 

rgeTo.Value = rgeFrom.Value