ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

搜索
EH技术汇-专业的职场技能充电站 妙哉!函数段子手趣味讲函数 Excel服务器-会Excel,做管理系统 效率神器,一键搞定繁琐工作
HR薪酬管理数字化实战 Excel 2021函数公式学习大典 Excel数据透视表实战秘技 打造核心竞争力的职场宝典
让更多数据处理,一键完成 数据工作者的案头书 免费直播课集锦 ExcelHome出品 - VBA代码宝免费下载
用ChatGPT与VBA一键搞定Excel WPS表格从入门到精通 Excel VBA经典代码实践指南
查看: 11523|回复: 10

[求助] 如何在不提及pivotitems各个项目名字的前提下,将所有items设为隐藏

[复制链接]

TA的精华主题

TA的得分主题

发表于 2011-3-27 22:33 | 显示全部楼层 |阅读模式
请问如何将指定pivotfields 下的所有items设为隐藏?
通常在为一个数据透视表的生成的过程录制宏后,可以发现,程序默认特定pivotfields下所有pivotitems为显示,然后将需要隐藏的items,通过语句
.pivoitems("该item的名字“).visible=False,将需要隐藏的item隐藏起来。
可是这个过程有一个缺点,就是需要将该程序应用于表的数据源时,如果该数据源没有当时录制时数据源里,包含的任意一个被隐藏起来的item,程序运行即会出错。
所以希望改变程序逻辑,先把指定pivotfields下的所有items都隐藏起来,同时不提及这些items的具体名字,这样在下次运行时即不会出错。然后再将要显示的item显示出来。

就是怎样使橘色字过程避免绿色字过程中提到 具体item 的缺陷。

TA的精华主题

TA的得分主题

 楼主| 发表于 2011-3-28 05:23 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
这是我根据上面的问题做的VBA,我改用逻辑为遍历所有items,并对比他们与我需要的items的值,如果不是将这些items都隐藏起来。
Sub Macro2()
'
' Macro2 Macro
' 宏由 微软用户 录制,时间: 2011-3-26
'

'
    ActiveWorkbook.Names.Add Name:="database1", RefersToR1C1:= _
        "=OFFSET(Sheet1!R1C1,0,0,COUNTA(Sheet1!C1),3)"
    ActiveWorkbook.PivotCaches.Add(SourceType:=xlDatabase, SourceData:= _
        "database1").CreatePivotTable TableDestination:="", TableName:="数据透视表2", _
        DefaultVersion:=xlPivotTableVersion10
    ActiveSheet.PivotTableWizard TableDestination:=ActiveSheet.Cells(3, 1)
    ActiveSheet.Cells(3, 1).Select
    With ActiveSheet.PivotTables("数据透视表2").PivotFields("Name")
        .Orientation = xlRowField
        .Position = 1
    End With
    With ActiveSheet.PivotTables("数据透视表2").PivotFields("Sex")
        .Orientation = xlColumnField
        .Position = 1
    End With
    ActiveSheet.PivotTables("数据透视表2").AddDataField ActiveSheet.PivotTables("数据透视表2" _
        ).PivotFields("Score"), "求和项:Score", xlSum
    Dim i As Integer, j As Integer
    i = 1
    j = ActiveSheet.PivotTables("数据透视表2").PivotFields("Sex").PivotItems.Count
    For i = 1 To j
    If ActiveSheet.PivotFields("Sex").PivotItems(i).Value <> "F" And ActiveSheet.PivotFields("Sex").PivotItems(i).Value <> "M" Then
        With ActiveSheet.PivotTables("数据透视表2").PivotFields("Sex")
        .PivotItems(i + 1).Visible = False
        End With
    End If
    Next
End Sub
问题是运行时显示橘色这部分,对象不支持该属性或方法,错误为438.我想是不是Pivotitems(i).value<>"F", 不该这么表达呢?

TA的精华主题

TA的得分主题

发表于 2011-6-7 16:46 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
不知道你解决没有,我正好也碰到此问题

TA的精华主题

TA的得分主题

发表于 2011-6-7 18:56 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
没有附件,正常应该可以通过 Items(1) to Items(i)的循环来隐藏

TA的精华主题

TA的得分主题

发表于 2012-10-21 18:04 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
PivotItems(i).Visible只接受文本 ,你要将变量赋值时转换成文本。
即:用PivotItems(“” & i).Visible  这种形式即可将变量赋值给PivotItems.Visible
当然前提也是PivotItems中存在变量的值。具体方法自己想吧。

TA的精华主题

TA的得分主题

发表于 2013-2-5 16:25 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助






先取消第一個以後的
然後再選擇想要的項目
再取消第一個
這樣代碼應該比較少


  1. Dim i As Long
  2. .PivotItems(1).Visible = True
  3. For i = 2 To .PivotItems.Count
  4.     .PivotItems(i).Visible = False
  5. Next
复制代码




TA的精华主题

TA的得分主题

发表于 2016-9-18 23:56 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
我也有这个问题  数据源有3w多行
直接界面选择只显示一个item很快
但用代码就很慢   

TA的精华主题

TA的得分主题

发表于 2016-11-10 14:49 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
我也遇到同样的问题 有没有大大解决了 来分享下经验

TA的精华主题

TA的得分主题

发表于 2016-11-10 16:45 | 显示全部楼层
我用elseif解决了
With ActiveSheet.PivotTables("数据透视表2").PivotFields("Sex ")
        S = .PivotItems.Count
        For i = 1 To S
            If .PivotItems(i).Name = "M" Then
                .PivotItems(i).Visible = True
            ElseIf .PivotItems(i).Name = "F" Then
                .PivotItems(i).Visible = True
            Else
                .PivotItems(i).Visible = False
            End If
        Next i
    End With

评分

1

查看全部评分

TA的精华主题

TA的得分主题

发表于 2019-12-18 18:18 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
写诗读 发表于 2016-11-10 16:45
我用elseif解决了
With ActiveSheet.PivotTables("数据透视表2").PivotFields("Sex ")
        S = .Pivo ...

.PivotItems(i).Name = "M" 可以用通配符吗
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

手机版|关于我们|联系我们|ExcelHome

GMT+8, 2024-11-25 10:44 , Processed in 0.059390 second(s), 12 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

沪公网安备 31011702000001号 沪ICP备11019229号-2

本论坛言论纯属发表者个人意见,任何违反国家相关法律的言论,本站将协助国家相关部门追究发言者责任!     本站特聘法律顾问:李志群律师

快速回复 返回顶部 返回列表