2014-07-19 108 views
0

我已經有了一個宏,它可以在特定文件夾中的新工作簿中保存三個特定工作表。每次我需要保存大約20-30個工作簿。但是,我可以看到每次調用宏時,在任務行中生成了一個新的工作簿,並且在一些新的工作簿之後(到目前爲止它就像1500+一樣),將創建一個新的工作簿並在此之後關閉等等。整件事情花費太多時間。如果我必須一次生成20個新的工作簿,則需要30秒或更長的時間。有什麼辦法可以讓它更快?高效地將工作表保存在新工作簿中

Sheets(Array("Statement", "Current Run", "Stock")).Copy 
    ActiveWorkbook.SaveAs Filename:="C:\solved\" & st & ".xlsx", Password:="",  
    WriteResPassword:="", ReadOnlyRecommended:=False 
    //Just adding some row before closing 
    finalLine.Copy 
    ActiveWorkbook.Sheets("Current Run").Range("A1").End(xlDown).Offset(1, 0).PasteSpecial 
    ActiveWorkbook.Sheets("Current Run").Range("A2").CurrentRegion.Borders.LineStyle = xlContinuous 
    ActiveWorkbook.Close SaveChanges:=True 
+0

您正在保存每個工作簿兩次。將'SaveAs'移到'Close'之前應該有所幫助。然後你可以修改最後一行的SaveChange參數爲False。除此之外,你的問題很混亂。我不明白是否是20-30或1500個工作簿。我不明白「在任務欄中生成了一個新的工作簿。」 –

+0

好。在任務管理器行中會出現一個名爲「book 1500」的新工作簿,然後該名稱將更改爲相關的名稱,例如「Run15」,然後從任務管理器中消失。然後下一個工作簿出現在任務管理器的名稱「book 1501」下,然後重命名並關閉,等等。 – george

+0

這就是我期望看到的。您正在創建和保存工作簿,這就是您所看到的。通過「任務管理器」,我想你是指通常在VBE左側出現的窗格。你有沒有嘗試我的建議?另外,我認爲在代碼的開始和結束處切換'Application.ScreenUpdating'會有所幫助。 –

回答

1

如果您減少對任何特定對象的調用次數,您可能會看到一些性能提升。在你的情況,你正在做的ActiveWorkbook對象,它可以在一個With塊來處理多個調用,而其他人只使用一個調用Save方法中提到:

Sheets(Array("Statement", "Current Run", "Stock")).Copy 
With ActiveWorkbook 
    //Just adding some row before closing 
    finalLine.Copy 
    With .Sheets("Current Run"). 
     .Range("A1").End(xlDown).Offset(1, 0).PasteSpecial 
     .Range("A2").CurrentRegion.Borders.LineStyle = xlContinuous 
    End With 
    .SaveAs Filename:="C:\solved\" & st & ".xlsx", Password:="",  
     WriteResPassword:="", ReadOnlyRecommended:=False 
    .Close 
End With 

這是否將是一個明顯的改善,我不確定。可能不會,除非你在循環內多次這麼做。但無論如何這是很好的做法。

相關問題