2017-05-03 81 views
3

this forum的代碼是我用作起點的。我試圖修改它以複製多個工作表並將它們全部粘貼爲值,而不是僅限一個工作表。編輯VBA將多個工作表作爲值粘貼到新工作簿中

我複製了多張使用worksheets(array(1,2,3)).copy。我認爲問題是With ActiveSheet.UsedRange,因爲它只是將第一個工作表替換爲值並將其餘工作表作爲公式保留。

我需要更改哪些內容才能將所有工作表粘貼爲值?

Private Sub Workbook_BeforeClose(Cancel As Boolean) 
    Application.DisplayAlerts = False 
    Worksheets(Array("Sheet 1","Sheet 2","Sheet 3").Copy 
    With ActiveSheet.UsedRange 
     .Value = .Value 
    End With 
    Set wbNew = ActiveWorkbook 
    wbNew.SaveAs "L:\Performance Data\UK Sales\Sales (Latest).xlsx" 
    wbNew.Close True 
    Application.DisplayAlerts = True 
End Sub 

回答

0

您通過表需要循環:

Dim ws As Worksheet 

For Each ws In ActiveWorkbook.Worksheets 
    ws.UsedRange.Value = ws.UsedRange.Value 
Next ws 

所以,用你的代碼,你可以做這樣的:

Private Sub Workbook_BeforeClose(Cancel As Boolean) 
Dim wbOld As Workbook, wbNew As Workbook 
Dim ws As Worksheet, delWS As Worksheet 
Dim i  As Long, lastRow As Long, lastCol As Long 
Dim shts() As Variant 
Dim rng As Range 

Application.ScreenUpdating = False 
Application.DisplayAlerts = False 

Set wbOld = ActiveWorkbook 

shts() = Array("Sheet 1", "Sheet 2", "Sheet 3") 
Set wbNew = Workbooks.Add 
Set delWS = ActiveSheet 
wbOld.Worksheets(Array("Sheet 1", "Sheet 2", "Sheet 3")).Copy wbNew.Worksheets(1) 
delWS.Delete 

For i = LBound(shts) To UBound(shts) 
    With wbNew.Worksheets(shts(i)) 
     lastRow = .Cells(.Rows.Count, 1).End(xlUp).Row 
     lastCol = .Cells(1, .Columns.Count).End(xlToLeft).Column 
     Set rng = .Range(.Cells(1, 1), .Cells(lastRow, lastCol)) 
     rng.Value = rng.Value 
    End With 
Next i 

wbNew.SaveAs "L:\Performance Data\UK Sales\Sales (Latest).xlsx" 
wbNew.Close True 

Application.DisplayAlerts = True 
Application.ScreenUpdating = True 
End Sub 

注:我不知道這工作簿您想粘貼這些值。如上所示,它在COPIED工作簿中執行此操作,而不是原始操作。

+0

謝謝你的迴應! 我試圖將這些值粘貼到**複製的**工作簿中,如您所說。原始工作簿應該保留所有公式。 但是,當我嘗試這個代碼時,它粘貼了原始工作表中的值,並在循環時耗盡內存。有沒有辦法限制它有多少個循環? – tenvfa

+0

@tenvfa - 查看更新的代碼。那樣有用嗎?如果內存不足,您可能需要檢查UsedRange的大小......您預計它會有多大? – BruceWayne

+0

您的編輯修復了將值複製到新工作簿的問題,所以謝謝。 它再次耗盡內存,調試器標記爲 'wbNew.Worksheets(shts(i))。UsedRange.Value = wbNew.Worksheets(shts(i))。UsedRange.Value'作爲錯誤。我是一名完全沒有編碼經驗的VBA初學者,所以我不確定我是否理解你對尺寸的問題。 最大的工作表包含15列25,000行的單元格值。最小的紙張有15列2000行。 – tenvfa

相關問題