2017-05-03 8 views
3

Der Code von this forum ist, was ich als Ausgangspunkt verwendet habe. Ich versuche, es zu ändern, um mehrere Blätter zu kopieren und sie alle als Werte anstelle von nur einem Blatt einzufügen.Bearbeiten VBA zum Einfügen mehrerer Blätter als Werte in neue Arbeitsmappe

Ich kopierte mehrere Blätter mit worksheets(array(1,2,3)).copy. Ich denke, das Problem ist With ActiveSheet.UsedRange, weil es nur das erste Blatt als Werte ersetzt und die restlichen Blätter als Formeln belassen.

Was muss ich ändern, damit alle Blätter als Werte eingefügt werden?

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 

Antwort

0

Sie müssen sich durch die Blätter in einer Schleife:

Dim ws As Worksheet 

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

Also, mit Ihrem Code, können Sie es wie dies tun könnte:

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 

Hinweis: Ich bin nicht sicher, ob die Arbeitsmappe Sie möchten die Werte einfügen. Wie oben beschrieben, geschieht dies in der COPIED-Arbeitsmappe, nicht im Original.

+0

Vielen Dank für Ihre Antwort! Ich versuche, die Werte in die ** kopierte ** Arbeitsmappe einzufügen, wie Sie sagten. Die ursprüngliche Arbeitsmappe sollte alle Formeln behalten. Wenn ich jedoch diesen Code ausprobierte, fügte er die Werte in das Originalblatt ein und der Arbeitsspeicher ging während der Schleife nicht mehr aus. Gibt es eine Möglichkeit zu begrenzen, wie viele Schleifen es tut? – tenvfa

+0

@tenvfa - Siehe den aktualisierten Code. Funktioniert es? Wenn der Arbeitsspeicher knapp wird, sollten Sie die Größe von 'UsedRange' überprüfen ... wie groß schätzen Sie das? – BruceWayne

+0

Ihre Bearbeitung hat das Problem behoben, dass Werte nur in die neue Arbeitsmappe kopiert werden. Vielen Dank. Es lief wieder der Speicher aus und der Debugger wurde mit 'wbNews.Worksheets (shts (i)) markiert. UsedRange.Value = wbNew.Worksheets (shts (i)). UsedRange.Value' als Fehler. Ich bin ein absoluter VBA-Anfänger ohne Programmiererfahrung, daher bin ich mir nicht sicher, ob ich Ihre Frage zur Größe verstanden habe. Das größte Blatt enthält Zellenwerte in 15 Spalten zu 25.000 Zeilen. Das kleinste Blatt hat 15 Spalten zu 2.000 Zeilen. – tenvfa

Verwandte Themen