我的Excel 2010工作簿包含
带有表格的4个数据表(即ListObject)
带有数据透视表的7个隐藏工作表,最大的工作表使用范围$ A $ 1:$ CS $ 37,参考上表
1个演示文稿,使用范围为$ A $ 1:$ X $ 108,包含7个表(ListObjects),其中任一个公式引用数据透视表,或者在VBA中从它们复制的值。
为什么我的档案如此庞大,我该怎么办?
编辑以响应其他用户的评论:
为了确保我过去没有接触太多细胞但又不再使用,我用
检索了上述范围For Each sht In ThisWorkbook.Sheets
Print sht.Name, sht.UsedRange.Address
Next
因此将数据和代码复制到新的干净工作簿是没有用的。
没有公式引用整个列,样式=match("anything", A:A)
,也没有其他公式引用使用范围之外的任何内容。
由于我是VBA开发人员,任何解决方案都应该对用户透明。这个人不应该知道Excel的内部。
答案 0 :(得分:3)
在工作簿上插入数据透视表时, Excel会缓存数据透视表数据源中的数据。 (这就是为什么您需要刷新数据透视表以将源数据中的更改合并到数据透视表中。)
数据缓存不到它缓存的工作表范围的一半,但很重要。 (在我的情况下,它增加了2.6MB到现有的6.5MB,显然一次超过10MB,Excel开始将数据交换到磁盘。)
如果您的源数据位于单独的工作表中,您可以删除源表,仅将数据保留在缓存中并节省空间,而不是使用数据透视表来破坏它。 (照顾你did_not_uncheck Save data with the file
,但是)
如果您以后需要编辑数据源,可以通过双击数据透视表上的总计来“钻取”到缓存中的数据。
阅读Massive Excel Spreadsheets – How to Reduce the Size of Pivot Table Workbooks了解详情。
作为VBA程序员,我必须为我的客户隐藏所有这些,所以我写了
用于提取数据和删除数据透视表的代码
Public Sub unpackPivots()
On Error GoTo goneWrong
Dim PSheet As Worksheet, PTable As PivotTable, PBody As Range
For Each PSheet In ThisWorkbook.Sheets
If PSheet.Name Like "*Pivot" Then
Set PTable = PSheet.PivotTables(1)
PTable.ClearAllFilters
Set PBody = PTable.DataBodyRange
Set PBody = PBody.Cells(PBody.Rows.Count, PBody.Columns.Count)
PSheet.Activate
PBody.Select
PBody.ShowDetail = True
Application.ActiveSheet.Name = Replace(PSheet.Name, "Pivot", "_Data")
Application.DisplayAlerts = False
PSheet.Delete
End If
Next
Application.DisplayAlerts = True
Exit Sub
goneWrong: Application.DisplayAlerts = True Debug.Print Err.Number,Err.Description Debug.Assert False Err.Clear 恢复 结束子
代码,用于从数据表创建数据透视表并删除表
Public Sub recreatePivots()
On Error GoTo goneWrong
Dim DSheet As Worksheet, DTable As ListObject
Dim PSheet As Worksheet, PCach As PivotCache
Dim PTable As PivotTable, PBody As Range
For Each DSheet In ThisWorkbook.Sheets
If DSheet.Name Like "*_Data" Then
Set PCache = ActiveWorkbook.PivotCaches.Create( _
SourceType:=xlDatabase, _
sourceData:=DSheet.ListObjects(1).Name, _
Version:=xlPivotTableVersion14 _
)
ThisWorkbook.Sheets.Add Before:=DSheet
Set PSheet = Application.ActiveSheet
PSheet.Name = Replace(DSheet.Name, "_Data", "_Pivot")
Set PTable = PCache.CreatePivotTable( _
TableDestination:=PSheet.Name + "!R3C1", _
DefaultVersion:=xlPivotTableVersion14 _
)
这是您依赖业务的东西
Select Case DSheet.Name
Case "Stock_Data"
PTable.PivotFields("Month").Orientation = xlPageField
PTable.PivotFields("Manufacturer").Orientation = xlRowField
PTable.PivotFields("Warehouse").Orientation = xlColumnField
PTable.AddDataField PTable.PivotFields("Key"), _
"Nr of products", xlSum
Case Else
' Some other configuration of a pivote table
End Select
DSheet.Delete
End If
Next
Exit Sub
goneWrong:
Application.DisplayAlerts = True
Debug.Print Err.Number, Err.Description
Debug.Assert False
Err.Clear
Resume
End Sub