为什么我的Excel 10兆字节大?

时间:2015-01-21 11:27:19

标签: excel excel-vba storage pivot-table vba

我的Excel 2010工作簿包含

带有表格的4个数据表(即ListObject)

  • 送货,使用范围$ A $ 1:$ T $ 7647
  • 库存,使用范围$ A $ 1:$ V $ 22962
  • 销售,使用范围$ A $ 1:$ U $ 2348
  • 摘要,使用范围$ A $ 1:$ AA $ 9509(每个项目的生命周期摘要,在VBA中创建)

带有数据透视表的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的内部。

1 个答案:

答案 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