2016-04-29 32 views
7

Tôi cần chuyển an toàn bộ đệm của Bảng tổng hợp trên Tệp Excel, thành một trục trên một tệp khác. Tôi có thể làm cái này như thế nào?Chuyển Pivot Cache từ Pivot trên một tệp sang Pivot trên một tệp khác?


Đây là mã Tôi đang sử dụng hiện nay (Chú ý phương pháp này hoạt động ngay cả khi nguồn trục Data Source đã được loại bỏ):

Public Sub TransferPivotCache(Source As PivotTable, Target As PivotTable) 
    Dim TempSheet As Worksheet 
    Set TempSheet = ThisWorkbook.Sheets.Add 
    Source.TableRange2.Copy Destination:=TempSheet.Range("A1") 
    Target.CacheIndex = TempSheet.PivotTables(1).CacheIndex 
    TempSheet.Delete 
End Sub 

Tuy nhiên khi trục Tôi đang nhập khẩu là quá lớn tôi nhận được lỗi "Không đủ bộ nhớ" khi sửa đổi thuộc tính chỉ mục bộ nhớ cache. Và sau đó, ngay cả các tập tin đóng cửa và nếu tôi cố gắng mở lại nó, nó bị hỏng. Có cách nào tốt hơn để chuyển Pivot Cache giữa các bảng tổng hợp không?

enter image description here

+0

Hãy thử 'ActiveCell.PivotTable.CacheIndex = TempSheet.PivotTables (1) .CacheIndex' thay vì 'TargetPivot.CaceIndex = TempSheet.PivotTables (1) .CacheIndex' –

+0

gì phiên bản Excel bạn đang sử dụng? – dee

+0

Tôi đang sử dụng Excel 2013 – lisovaccaro

Trả lời

0

Tôi đã không thể tái tạo các vấn đề tài nguyên với tôi Excel Professional 2010 ... Nhưng bạn đã thử khả năng này đơn giản hơn ?:

Public Sub TransferPivotCache(SourcePivot As PivotTable, TargetPivot As PivotTable) 
    TargetPivot.CacheIndex = SourcePivot.CacheIndex 
End Sub 

Dường như nó không được giống nhau (ít nhất là trong cùng một bảng tính) và tránh tạo một trang tính hoàn toàn mới.

+0

Tôi nghĩ rằng tôi đã thử điều này và nó không hoạt động giữa các sổ làm việc khác nhau. Tôi sẽ thử nó sau và xác nhận. – lisovaccaro

+0

Tôi không thể làm cho mã của bạn hoạt động được giữa các sổ làm việc khác nhau, nhưng có thể tôi đã tạo nhanh trục nguồn và đích. –

+0

Nó hoạt động, nó giống như: 'Gọi TransferPivotCache (Workbooks (" example "). Sheets (" example "). PivotTables (1), ThisWorkbook.Sheets (" example "). PivotTables (1))' bạn đã làm một cái gì đó khác nhau? – lisovaccaro

4

Nếu mục tiêu của bạn để cập nhật một bảng tổng hợp khác nhắm mục tiêu cùng một dữ liệu, thì cách khác sẽ là tạo một PivotCache mới trỏ đến cùng một nguồn. Bằng cách này, sổ làm việc được nhắm mục tiêu sẽ xây dựng cùng một PivotCache mà không cần phải sao chép DataTable, có thể là nguyên nhân gây ra vấn đề bộ nhớ của bạn.

Public Sub TransferPivotCache(source As PivotTable, target As PivotTable) 
    Dim pivCache As PivotCache, sh As Worksheet, rgData As Range, refData 

    ' convert the `SourceData` from `xlR1C1` to `xlA1` ' 
    source.Parent.Activate 
    refData = Application.ConvertFormula(source.SourceData, xlR1C1, xlA1, xlAbsolute) 
    If IsError(refData) Then refData = source.SourceData 

    If Not IsError(source.Parent.Evaluate(refData)) Then 
     ' create a new pivot cache from the data source if it exists ' 

     Set rgData = source.Parent.Evaluate(refData) 
     If Not rgData.ListObject Is Nothing Then Set rgData = rgData.ListObject.Range 

     Set pivCache = target.Parent.Parent.PivotCaches.Create(_ 
      XlPivotTableSourceType.xlDatabase, _ 
      rgData.Address(external:=True)) 

     pivCache.EnableRefresh = False 
     target.ChangePivotCache pivCache 
    Else 
     ' copy the pivot cache since the data source no longer exists ' 

     Set sh = source.Parent.Parent.Sheets.Add 
     source.PivotCache.CreatePivotTable sh.Cells(1, 1) 
     sh.Move after:=target.Parent ' moves the temp sheet to targeted workbook ' 

     ' replace the pivot cache ' 
     target.PivotCache.EnableRefresh = True 
     target.CacheIndex = target.Parent.Next.PivotTables(1).CacheIndex 
     target.PivotCache.EnableRefresh = False 

     'remove the temp sheet ' 
     target.Parent.Next.Delete 
    End If 

End Sub 
+0

hi Florent, tôi đã thử nghiệm phương pháp A và tôi tiếp tục nhận được lỗi 'Phương thức' ChangePivotcache 'của đối tượng' PivotTable 'không thành công' trên dòng cuối cùng.Tôi sẽ kiểm tra cái kia ngay bây giờ. – lisovaccaro

+0

Tôi đã thử nghiệm phương pháp thứ hai (cả hai SourceData là xlDatabase) tuy nhiên tôi nhận được lỗi "Tham chiếu không hợp lệ" trên dòng 'pivCache.SourceData = dataSource'. Tôi đã thử nhập khẩu các trục khác nhau và cả hai quy trình làm việc cho một thiểu số các trụ của tôi, nhưng trong hầu hết các trường hợp, tôi gặp phải các lỗi này. – lisovaccaro

+0

btw Tôi đã chỉnh sửa câu trả lời của bạn và thêm nhận xét vào khối mã thứ hai. Tôi có thể sai về nó. – lisovaccaro