VBA中检查PivotItems时If语句失效,请求排查解决
问题分析与修正
你的代码核心问题出在开头强制重置了数据透视表的筛选状态:
ActiveSheet.PivotTables("Draaitabel7").PivotFields("afdeling").CurrentPage = "(All)"
这行代码会把"afdeling"字段下所有选项(包括"Pack")强制设为可见,导致后面的If判断永远得到True,每次执行都会进入隐藏"Pack"的分支,完全没法实现切换功能。
修正后的代码
Sub Set_graph_pack() 'toggle pack filter on/off Dim pvtField As PivotField '直接引用对象,避免冗余的Select/Activate操作 Set pvtField = Sheets("Blad4").PivotTables("Draaitabel7").PivotFields("afdeling") With pvtField If .PivotItems("Pack").Visible Then '若Pack当前可见,切换为隐藏Pack、显示空白项 .PivotItems("Pack").Visible = False .PivotItems("(blank)").Visible = True Else '若Pack当前不可见,切换为显示Pack、隐藏空白项 .PivotItems("Pack").Visible = True .PivotItems("(blank)").Visible = False End If End With '直接定位目标单元格,无需先选中工作表 Sheets("dashboard").Range("A1").Select End Sub
关键修改说明
- 移除了强制重置筛选状态的
CurrentPage = "(All)"行,保留当前筛选状态供判断逻辑使用 - 用
With语句简化代码结构,避免重复书写冗长的字段引用路径 - 去掉不必要的
Select/Activate操作,直接引用对象让代码更稳定高效 - 简化
If判断条件,If .PivotItems("Pack").Visible等价于判断其状态为True,写法更简洁
内容的提问来源于stack exchange,提问作者Ot.H
相关产品推荐
相关产品推荐

