【问题标题】:excel 2010 vba loop pivot tablesexcel 2010 vba循环数据透视表
【发布时间】:2016-05-14 06:49:06
【问题描述】:

当用户按下按钮时,我需要更新 16 个数据透视表。需要运行的代码如下:

ActiveSheet.PivotTables("PivotTable10").PivotFields("count").ClearAllFilters
        ActiveSheet.PivotTables("PivotTable10").PivotFields("scrap code").ClearAllFilters
               ActiveSheet.PivotTables("PivotTable10").PivotFields("count").ShowAllItems = True

        With ActiveSheet.PivotTables("PivotTable10").PivotFields("count")
            .PivotItems("0").Visible = False
        End With

数据透视表的名称是: MSP,MSP30,FSP,FSP30,MRP,MRP30,FRP,FRP30,MPP,MPP30,FPP,FPP30,MCP,MCP30,FCP,FCP30

我想将PivotTable10 替换为一个循环遍历该数据透视表列表的变量。现在我的代码是上面代码的 16 块。我对循环知之甚少,并且在我的谷歌搜索中没有找到这种类型的循环的一个很好的例子。

编辑:最终代码有效,下面的两个答案都运行良好,此代码运行速度稍快

Sub IteratePivots()

Application.ScreenUpdating = False

On Error Resume Next

Worksheets("Analytics Admin").Activate

Dim pvtTables As PivotTables
Dim pvtTable As PivotTable
Set pvtTables = Application.ActiveSheet.PivotTables
For Each pvtTable In pvtTables
    pvtTable.PivotFields("count").ClearAllFilters
    pvtTable.PivotFields("scrap code").ClearAllFilters
    pvtTable.PivotFields("count").ShowAllItems = True

    With pvtTable.PivotFields("count")
        .PivotItems("0").Visible = False
    End With
Next

Application.ScreenUpdating = False
End Sub

【问题讨论】:

  • 只有 Pivottable 名称才会在您的代码中发生变化,对吗?
  • 那是正确的,我每次都会准确地运行 4 行(当唯一的值为 0 时,我可能需要添加一个错误更正)。

标签: vba excel loops pivot-table


【解决方案1】:

这有点像 hack,但这样的事情可能会成功:

  Dim pt As PivotTable
  Dim ws As Worksheet
  Dim names As Variant
  Dim found As Boolean

  Set ws = ActiveWorkbook.ActiveSheet
  names = Split("MSP,MSP30,FSP,FSP30,MRP,MRP30,FRP,FRP30,MPP,MPP30,FPP,FPP30,MCP,MCP30,FCP,FCP30", ",")

  For Each pt In ws.PivotTables
    found = False

    For i = 1 To UBound(names)
      If pt.Name = names(i) Then
        found = True
      End If
    Next i

    If found Then
      pt.PivotFields("count").ClearAllFilters
      pt.PivotFields("scrap code").ClearAllFilters
      pt.PivotFields("count").ShowAllItems = True

      pt.PivotFields("count").PivotItems("0").Visible = False
    End If

  Next pt

您可能会注意到我笨拙地检查名称是否在数组中...对于该部分来说这是一个更好的解决方案:

https://stackoverflow.com/a/10952705/190829

【讨论】:

  • 这该死的接近我试图做的,唯一的问题是一些数据透视表的唯一值是 0 ,我收到一个错误unable to set the visible property of the PivotItem class
  • @AlbertoBrown,在这种情况下检查,如果值0,然后再继续。
【解决方案2】:

试试这个代码。此代码将遍历工作表中的所有可旋转对象。

Sub IteratePivots()
Dim pvtTables As PivotTables
Dim pvtTable As PivotTable
Set pvtTables = Application.ActiveSheet.PivotTables
For Each pvtTable In pvtTables
    pvtTable.PivotFields("count").ClearAllFilters
    pvtTable.PivotFields("scrap code").ClearAllFilters
    pvtTable.PivotFields("count").ShowAllItems = True

    With pvtTable.PivotFields("count")
        .PivotItems("0").Visible = False
    End With
Next
End Sub

【讨论】:

  • 感谢它的运行速度比@hambones 代码稍快,大约快 6 秒。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-07-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-09-25
相关资源
最近更新 更多