2012-04-30 37 views
0

我有一個大型Excel工作簿,其中包含多個工作表,其中包含與大型PowerPivot源關聯的數據透視表。我想將每個工作表單獨保存到工作簿中,僅作爲值。將包含數據透視表的工作表單獨分解爲單個工作簿

我已經設法在沒有數據透視表的工作簿上執行此操作。但是,我收到了這個項目的以下消息。我不想複製每次保存的嵌入數據,因爲它非常慢。任何提示或幫助?

Option Explicit 

Sub JhSeparateSave() 
    Dim ws As Worksheet 
    Dim NewName As String 

    If MsgBox("Copy specific sheets to a new workbook" & vbCr & _ 
    "New sheets will be pasted as values, named ranges removed" _ 
    , vbYesNo, "NewCopy") = vbNo Then Exit Sub 

    '  Input box to name new file 
    NewName = InputBox("Please Specify the name of your new workbook", "New Copy") 

    With Application 
     .ScreenUpdating = False 

     For Each ws In ThisWorkbook.Worksheets 
      If ws.Visible = xlSheetVisible Then 
       MsgBox ("Copy step 1") 
       ws.Copy 

       With ActiveWorkbook.Sheets(1).UsedRange 
        .Cells.Copy 
        .Cells.PasteSpecial xlPasteValues 
        .Cells(1).Select 
       End With 

       ActiveWorkbook.SaveAs ThisWorkbook.Path & "\" & NewName & "-" & ws.Name 
       ActiveWorkbook.Close 
       MsgBox ("Saved sheet: " & ws.Name) 
      End If 
     Next ws 

    End With 
End Sub 
+0

,而不是進行「複製」和「粘貼值」,爲什麼不直接將其保存爲CSV? –

+0

我不想要csv ...我想要一個xlsx,我可以發送給其他同事 – Julien

+0

還有一個選項,將它暫時保存爲csv並立即保存爲xlsx後刪除csv? –

回答

0

我最終使用:

Option Explicit 

Sub Copier() 

Dim ws As Worksheet 
Dim wsNew As Worksheet 
Dim NewName As String 
Dim wsOriginalName As String 

'On Error GoTo Errorcatch 

If MsgBox("1. Copy to new sheet. 2. Change to values. 3. Move to new workbook" & vbCr & _ 
"New sheets will be pasted as values, named ranges removed" _ 
, vbYesNo, "NewCopy") = vbNo Then Exit Sub 

'  Input box to name new file 
NewName = InputBox("Please Specify the month name of your new workbook", "New Copy") 


With Application 
    .ScreenUpdating = False 
    .DisplayAlerts = False 

    'iterate through all worksheets 
    For Each ws In ThisWorkbook.Worksheets 

     'ignore hidden worksheets 
     If ws.Visible = xlSheetVisible Then 

      'copy sheet within original workbook 
      wsOriginalName = ws.Name 
      ws.Copy After:=Sheets("FAQ") 

      'switch to copied sheet 
      Set wsNew = ActiveSheet 

      'convert to values and format 
      With wsNew.UsedRange 
       .Copy 
       .PasteSpecial xlPasteValuesAndNumberFormats 
       .PasteSpecial xlPasteFormats 
       .Cells(1, 1).Select 
      End With 

      'save into new workbook 
      wsNew.Copy 
      ActiveWorkbook.SaveAs ThisWorkbook.Path & "\" & "MIS-FY2013-" & NewName & "-" & wsOriginalName 
      ActiveWorkbook.Close 

      'MsgBox ("going to try to delete: " & wsNew.Name) 
      'delete copied sheet 
      wsNew.Delete 

     End If 
    Next ws 

End With 

末次

0

參見該示例(檢測過,並試圖)。

Option Explicit 

Sub JhSeparateSave() 
    Dim wbTemp As Workbook 
    Dim ws As Worksheet 
    Dim NewName As String 

    If MsgBox("Copy specific sheets to a new workbook" & vbCr & _ 
    "New sheets will be pasted as values, named ranges removed" _ 
    , vbYesNo, "NewCopy") = vbNo Then Exit Sub 

    '~~> Input box to name new file 
    NewName = InputBox("Please Specify the name of your new workbook", "New Copy") 

    With Application 
     .ScreenUpdating = False 

     For Each ws In ThisWorkbook.Worksheets 
      If ws.Visible = xlSheetVisible Then 
       MsgBox ("Copy step 1") 
       ws.Copy 

       ActiveWorkbook.SaveAs Filename:=ThisWorkbook.Path & "\" & NewName & ".csv", _ 
       FileFormat:=xlCSV, CreateBackup:=False 

       ActiveWorkbook.Close savechanges:=False 

       Set wbTemp = Workbooks.Open(ThisWorkbook.Path & "\" & NewName & ".csv") 

       wbTemp.SaveAs Filename:=ThisWorkbook.Path & "\" & NewName & "-" & ws.Name, _ 
       FileFormat:=xlOpenXMLWorkbook, CreateBackup:=False 

       wbTemp.Close savechanges:=False 

       Kill ThisWorkbook.Path & "\" & NewName & ".csv" 

       MsgBox ("Saved sheet: " & ws.Name) 
      End If 
     Next ws 

    End With 
End Sub 
+0

謝謝你的努力。然而這並不是最佳的。一旦運行ws.copy,我的整個20MB數據透視表源代碼就會被臨時複製,這需要很長時間。我想我會探索在原始筆記本中創建新工作表的策略,複製到該工作表中,僅更改爲值+格式,然後將其移至新工作簿。 – Julien

相關問題