【发布时间】:2018-11-19 04:30:07
【问题描述】:
我正在自动化在 Excel 中创建数据透视表的过程。我遇到的问题是我使用宏创建的数据透视表比我手动创建的数据透视表大得多。两个数据透视表看起来相同,但文件大小有很大差异。
如上图所示,由我的宏创建的宏大约大 6 倍!我怀疑这是我在创建数据透视表时缓存数据的方式。所以,这是我用来创建数据透视表的通用代码。
Sub pivottable1()
Dim PSheet As Worksheet, DSheet As Worksheet
Dim PCache As PivotCache
Dim PTable As PivotTable
Dim PField As PivotField
Dim PRange As Range
Dim LastRow As Long
Dim LastCol As Long
Dim PvtTable As PivotTable
Dim SheetName As String
Dim PTName As String
SheetName = "MySheetName1"
PTName = "PivotTable1"
On Error Resume Next
Application.DisplayAlerts = False
Worksheets(SheetName).Delete
Sheets.Add After:=ActiveSheet
ActiveSheet.Name = SheetName
Application.DisplayAlerts = True
Set PSheet = Worksheets(SheetName)
Set DSheet = Worksheets(1)
LastRow = DSheet.Cells(Rows.Count, 1).End(xlUp).Row
LastCol = DSheet.Cells(1, Columns.Count).End(xlToLeft).Column
Set PRange = DSheet.Cells(1, 1).Resize(LastRow, LastCol)
Set PCache = ActiveWorkbook.PivotCaches.Create _
(SourceType:=xlDatabase, SourceData:=PRange). _
CreatePivotTable(TableDestination:=PSheet.Cells(4, 1), _
TABLENAME:=PTName)
Set PTable = PCache.CreatePivotTable _
(TableDestination:=PSheet.Cells(1, 1), TABLENAME:=PTName)
Sheets(SheetName).Select
Set PvtTable = ActiveSheet.PivotTables(PTName)
'Rows
With PvtTable.PivotFields("TypeCol")
.Orientation = xlRowField
.Position = 1
End With
With PvtTable.PivotFields("NameCol")
.Orientation = xlRowField
.Position = 2
End With
'Columns
With PvtTable.PivotFields("CategoryCol")
.Orientation = xlColumnField
.Position = 1
End With
'Values
PvtTable.AddDataField PvtTable.PivotFields("Values1"), "Value Balance", xlSum
PvtTable.AddDataField PvtTable.PivotFields("Values2"), "Value 2 Count", xlCount
With PvtTable
.PivotFields("TypeCol").ShowDetail = False
.TableRange1.Font.Size = 10
.ColumnRange.HorizontalAlignment = xlCenter
.ColumnRange.VerticalAlignment = xlTop
.ColumnRange.WrapText = True
.ColumnRange.Columns.AutoFit
.ColumnRange.EntireRow.AutoFit
.RowAxisLayout xlTabularRow
.ShowTableStyleRowStripes = True
.PivotFields("TypeCol").AutoSort xlDescending, "Value Balance" 'Sort descdending order
.PivotFields("NameCol").AutoSort xlDescending, "Value Balance"
End With
'Change Data field (Values) number format to have thousand seperator and 0 decimal places.
For Each PField In PvtTable.DataFields
PField.NumberFormat = "#,##0"
Next PField
End Sub
这就是我如何创建 6 个不同的数据透视表,它们都使用位于同一工作簿中且位于该工作簿的第一个工作表中的相同数据源。因此,例如,我的第二个数据透视表宏代码看起来像这样。
Sub pivottable2()
Dim PSheet As Worksheet, DSheet As Worksheet
Dim PCache As PivotCache
Dim PTable As PivotTable
Dim PField As PivotField
Dim PRange As Range
Dim LastRow As Long
Dim LastCol As Long
Dim PvtTable As PivotTable
Dim SheetName As String
Dim PTName As String
SheetName = "MySheetName2"
PTName = "PivotTable2"
On Error Resume Next
Application.DisplayAlerts = False
Worksheets(SheetName).Delete
Sheets.Add After:=ActiveSheet
ActiveSheet.Name = SheetName
Application.DisplayAlerts = True
Set PSheet = Worksheets(SheetName)
Set DSheet = Worksheets(1)
LastRow = DSheet.Cells(Rows.Count, 1).End(xlUp).Row
LastCol = DSheet.Cells(1, Columns.Count).End(xlToLeft).Column
Set PRange = DSheet.Cells(1, 1).Resize(LastRow, LastCol)
Set PCache = ActiveWorkbook.PivotCaches.Create _
(SourceType:=xlDatabase, SourceData:=PRange). _
CreatePivotTable(TableDestination:=PSheet.Cells(4, 1), _
TABLENAME:=PTName)
Set PTable = PCache.CreatePivotTable _
(TableDestination:=PSheet.Cells(1, 1), TABLENAME:=PTName)
Sheets(SheetName).Select
Set PvtTable = ActiveSheet.PivotTables(PTName)
'Rows
With PvtTable.PivotFields("ManagerCol")
.Orientation = xlRowField
.Position = 1
End With
With PvtTable.PivotFields("IDCol")
.Orientation = xlRowField
.Position = 2
End With
'Columns
With PvtTable.PivotFields("CategoryCol")
.Orientation = xlColumnField
.Position = 1
End With
'Values
PvtTable.AddDataField PvtTable.PivotFields("Values1"), "Value Balance", xlSum
End Sub
我只更改宏名称、工作表名称、数据透视表名称和数据透视表的输入行/列/数据值。
我希望完成的是将宏创建的数据透视表的文件大小减小到类似于我手动创建的数据。
如果你们还有什么想知道的,欢迎评论。我将对问题进行编辑并分别添加详细信息。
【问题讨论】:
-
可能是 VBA 本身导致代码如此之大,如果您将代码放在 WorkBook_Macro 中并将代码工作簿中的代码运行到数据工作簿中,您将设法缩小尺寸?因为现在的方式我强烈建议您不要使用该代码(但无论如何都要感谢您发布它!)
-
@HilaDG “可能是 VBA 本身导致代码变得那么大”不太清楚你的意思是什么,但我很确定这是我为枢轴缓存数据的方式创建它们时会导致文件大小有如此大差异的表。我使用的代码是我认为在互联网上构建数据透视表的最常用方法。它为每个数据透视表创建一个单独的缓存,而不是在彼此之间共享它们。我想知道,我将如何重新调整代码,以便我创建的数据透视表都共享相同的数据缓存? :)
-
看起来您的代码为每个 Sub 创建了两个可枢转数据 - 一个在 A4,一个在 A1 - 这是故意的吗?您可以只创建一个数据透视缓存并将每个数据透视表指向该缓存 - 您尝试过吗?
-
@TimWilliams “看起来您的代码为每个 Sub 创建了两个可枢转对象”哦,不错。那是我的一个错误。我排除了在不同位置创建另一个数据透视表的两行额外代码。但是,这对文件大小没有任何影响。 “您可以只创建一个数据透视缓存并将每个数据透视表指向该缓存”,我将如何做到这一点?我是否必须将这两个宏都包含在新的子例程中,以便它们能够共享相同的缓存?
-
@DSM 我的意思是代码本身占用了一些空间,这可能就是为什么(在下面发布的答案中)手动版本和自动版本之间存在细微差别。顺便说一句,请接受下面的答案,因为它看起来是正确的。