2016-09-02 90 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