我正在尝试遍历excel工作簿以在每个工作表上创建相同的数据透视表,但每个工作表在同一列中包含不同的数据。数据透视表工作正常,但完成第一个工作表后循环停止。
是否有人建议让循环运行所有工作表?
Sub PivotTableLoop()
Dim FinalRow As Long
Dim DataSheet As String
Dim PvtCache As PivotCache
Dim PvtTbl As PivotTable
Dim DataRng As Range
Dim TableDest As Range
Dim ws As Worksheet
Dim wb As Workbook
Set wb = ActiveWorkbook
FinalRow = Cells(Rows.Count, 1).End(xlUp).Row
DataSheet = ActiveSheet.Name
'Beginning of Loop
For Each ws In ActiveWorkbook.Worksheets
'set data range for Pivot Table
Set DataRng = Sheets(DataSheet).Range(Cells(1, 1), Cells(FinalRow, 8)) ' conversion of R1C1:R & FinalRow & C8
'set range for Pivot table placement
Set TableDest = Sheets(DataSheet).Cells(1, 9) ' conversion of R1C9
Set PvtCache = ActiveWorkbook.PivotCaches.Add(xlDatabase, DataRng)
'this line in case the Pivot table doesn't exit >> first time running this Macro
On Error Resume Next
Set PvtTbl = ActiveWorkbook.Sheets(DataSheet).PivotTables("PivotTable4") ' check if "PivotTable4" Pivot Table already created (in past runs of this Macro)
On Error GoTo 0
If PvtTbl Is Nothing Then ' "PivotTable4" doesn't exist >> create it
'create a new Pivot Table in "PivotTable4" sheet
Set PvtTbl = ActiveWorkbook.Sheets(DataSheet).PivotTables.Add(PivotCache:=PvtCache, TableDestination:=TableDest, TableName:="PivotTable4")
With PvtTbl.PivotFields("Document Type")
.Orientation = xlRowField
.Position = 1
End With
With PvtTbl.PivotFields("Accounting Event")
.Orientation = xlRowField
.Position = 2
End With
With PvtTbl.PivotFields("Document Number")
.Orientation = xlRowField
.Position = 3
End With
PvtTbl.AddDataField ActiveSheet.PivotTables( _
"PivotTable4").PivotFields("Amount"), "Sum of Amount", xlSum
ActiveCell.Offset(1, 0).Range("A1").Select
PvtTbl.PivotFields("Document Type").ShowDetail _
= False
ActiveCell.Offset(-1, 0).Range("A1").Select
PvtTbl.CompactLayoutRowHeader = _
"JIFMS Document Types"
ActiveCell.Offset(2, 1).Range("A1").Select
PvtTbl.PivotSelect "", xlDataAndLabel, True
PvtTbl.DataPivotField.PivotItems( _
"Sum of Amount").Caption = "JIFMS Sum of Amounts"
ActiveCell.Offset(5, 0).Range("A1").Select
Else
'just refresh the Pivot cache with the updated Range
PvtTbl.ChangePivotCache PvtCache
PvtTbl.RefreshTableenter code here
End If
Next ws
End Sub
答案 0 :(得分:0)
首先,学习缩进代码。当所有代码块的内容都在第1列时读取代码会让人头疼。难以阅读的代码是难以调试的代码。
获取VBE加载项。如果您使用的是32位Office,则可以使用 Smart Indenter 为您执行此操作。如果您使用的是64位Office,则可以使用最新的MZ-Tools(我认为是$$$),或免费的开源Rubberduck(其中,免责声明,我“我参与其中” - v2.x(仍为测试版)包含 Smart Indenter 的大部分功能。
还要摆脱烦人的无用线路延续,例如:
PvtTbl.PivotFields("Document Type").ShowDetail _ = False
/咆哮
在第一次迭代后,您没有将PvtTbl
设置回Nothing
,因此在分配了一次引用之后,整个If...End If
块将不会运行,可能是在第一次迭代中
通过将循环体提取到自己的过程中(因此PvtTbl
基本上限定为循环体),可以消除问题并提高代码的可读性。此操作称为“提取方法”重构。
你也在迭代活动工作簿中的所有工作表,但是你没有在循环体中的任何地方使用ws
,所以一切都在活动工作表中工作......这可能不是你的意图。