Excel VBA遍历同工作表数据透视表顺序异常如何指定调用顺序
PivotTables集合的默认排序依据
工作表PivotTables集合不存在可手动调整的内置排序配置,其默认索引顺序以数据透视表的创建先后时间为唯一依据:
- 最早在工作表中创建的透视表固定对应索引1,后续新建的透视表索引按创建时间依次递增
- 后续移动透视表位置、修改透视表名称、删除已创建的透视表,都不会改变剩余透视表的原有索引值,集合也不会自动重排索引,这就是遍历顺序和视觉位置不匹配的根本原因
- 没有官方途径可以直接修改该内置集合的默认返回顺序。
自定义顺序遍历数据透视表的实现方案
由于无法直接修改集合默认排序,且透视表名称为动态值无法硬编码调用,可以通过读取所有透视表的位置属性,按自定义规则排序后完成遍历。最常用的场景是按工作表视觉位置(从上到下、同位置行从左到右)排序遍历,参考代码如下:
Sub TraversePivotByPosition() Dim ptList() As Variant, pt As PivotTable, i As Long, j As Long Dim temp As PivotTable ' 将工作表内所有透视表存入数组 ReDim ptList(1 To ActiveSheet.PivotTables.Count) i = 1 For Each pt In ActiveSheet.PivotTables Set ptList(i) = pt i = i + 1 Next ' 冒泡排序:优先按透视表顶部垂直坐标从小到大(从上到下),同一行按左侧水平坐标从小到大(从左到右) For i = LBound(ptList) To UBound(ptList) - 1 For j = i + 1 To UBound(ptList) If (ptList(j).TableRange1.Top < ptList(i).TableRange1.Top) Or _ (ptList(j).TableRange1.Top = ptList(i).TableRange1.Top And _ ptList(j).TableRange1.Left < ptList(i).TableRange1.Left) Then Set temp = ptList(i) Set ptList(i) = ptList(j) Set ptList(j) = temp End If Next Next ' 按排序后的顺序输出透视表名称 For i = LBound(ptList) To UBound(ptList) MsgBox ptList(i).Name Next End Sub
如果只需要严格按从左到右的水平顺序遍历,不需要区分上下行位置,删除排序逻辑中所有和Top属性相关的判断条件,仅保留TableRange1.Left的比较逻辑即可。
内容的提问来源于stack exchange,提问作者Ali
相关产品推荐
相关产品推荐

