2017-05-03 85 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

相关问题