我正在自动化在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, …Run Code Online (Sandbox Code Playgroud) 我想做的事情比较简单。我有一个根据标准进行过滤的数据集,因此隐藏了工作表中的一些行。我为过滤后的数据设置了一个范围,该范围应该只经过示例代码中可见的单元格。
With MyDataWorksheet.AutoFilter.Range
On Error Resume Next
Set AutoFilterRange = .SpecialCells(xlCellTypeVisible)
On Error GoTo 0
End With
Run Code Online (Sandbox Code Playgroud)
现在我想循环遍历 AutoFilterRange 变量中的所有数据,该变量应该捕获所有可见的行。我循环遍历它们,做类似的事情。
Sub aSub()
Dim DR As Range
For Each DR In AutoFilterRange
'Do something here
Next DR
End Sub
Run Code Online (Sandbox Code Playgroud)
我在每个循环中使用它来处理可见行,但是我想跳过数据范围中的第一个元素,因为该元素行号包含我的标题名称。我认为做这样的事情将有助于解决我的问题,但它所做的只是转到标题行元素之后的下一个隐藏行元素。
For Each DR In AutoFilterRange.Offset(1,0)
'Do something here
Next DR
Run Code Online (Sandbox Code Playgroud)