2017-05-03 29 views
3

this forumのコードは、私が出発点として使用したものです。私は、複数のシートをコピーして、それらをすべて1つのシートではなく値として貼り付けるように修正しようとしています。新しいブックに値として複数のシートを貼り付けるように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 

注:私はわからないそのワークブック上記のように、これは元のコピーではなくコピーしたブックで行います。

+0

ありがとうございます。 あなたが言ったように**コピーされた**ブックに値を貼り付けようとしています。元のブックはすべての数式を保持する必要があります。 しかし、私はこのコードを試したときに、元のシートに値を貼り付け、ループ中にメモリ不足になりました。ループの数を制限する方法はありますか? – tenvfa

+0

@tenvfa - 更新されたコードを参照してください。それは動作しますか?メモリが不足している場合は、 'UsedRange'のサイズを確認することができます。どのくらいの大きさになると思いますか? – BruceWayne

+0

あなたの編集で、新しいワークブックのみに値をコピーする問題が修正されました。ありがとうございます。 もう一度メモリ不足になり、デバッガは 'wbNew.Worksheets(shts(i))のフラグを立てます。UsedRange.Value = wbNew.Worksheets(shts(i))。UsedRange.Value'をエラーとして返します。私はコーディング経験のないVBAの初心者ですので、あなたのサイズについてのご質問が分かりません。 最大のシートには、15列×25,000行のセル値が含まれています。最小のシートは15列×2,000列です。 – tenvfa

関連する問題