- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
好吧,我是 VBA 新手,但我知道这必须是可能的。我花了一段时间编写 Android 应用程序,但我不会称自己为专家,说实话,甚至可能不是中级专家。然而,可惜的是,excel 不使用 java。这是我的问题:
我所需要的只是在同一张纸上制作其他 6 个数据透视表,模仿我所说的主数据透视表。它需要模仿的唯一功能(目前我认为)是当主扩展/折叠时,其他功能应该效仿。
我猜测代码将类似于java中的onclicklistener,当代码“听到”主数据透视表中折叠或展开的点击时,它只是将相同的折叠或展开应用于其他六个。其他 6 个枢轴将始终具有相同的行标签,因此将点击的“位置”从主枢轴转移到其他枢轴的错误永远不会成为问题。
我尝试记录数据透视表中行标签之一的扩展,并得到了此代码。
ActiveSheet.PivotTables("PivotTable1").PivotFields("Year").PivotItems("2005"). _
ShowDetail = True
但我知道,这是执行该扩展的编码(并且 ShowDetail = False 会使其崩溃)。我认为我需要的是像我说的那样,一个监听器来“听到”主数据透视表的任何展开/折叠的点击,一种存储/携带有关单击的行标签的信息的方法(“位置”)点击的,如果你愿意的话),然后使用我猜测的 for 循环在其他 6 个代码上执行上述代码的通用版本。
我走在正确的道路上吗?有什么帮助吗?一如既往地非常感谢。
最佳答案
这应该适合你:
将其放入标准模块中(这是效率较低的方法 - 因为它检查所有字段):
Sub LinkPivotTables_ByFieldItemName_ToShowDetail(pt As PivotTable)
Dim wkb As Workbook
Set wkb = ThisWorkbook
Dim wks As Worksheet
Set wks = wkb.Sheets(1)
Dim PivotTableIndex As Integer
Dim PivotFieldIndex As Integer
Dim PivotItemIndex As Integer
Dim PivotFieldIndexName As String
Dim PivotItemIndexName As String
Dim BoolValue As Boolean
Application.ScreenUpdating = False
Application.EnableEvents = False
On Error Resume Next
For PivotFieldIndex = 1 To pt.PivotFields.Count
PivotFieldIndexName = pt.PivotFields(PivotFieldIndex).Name
For PivotItemsIndex = 1 To pt.PivotFields(PivotFieldIndex).PivotItems.Count
PivotItemIndexName = pt.PivotFields(PivotFieldIndex).PivotItems(PivotItemsIndex).Name
BoolValue = pt.PivotFields(PivotFieldIndex).PivotItems(PivotItemsIndex).ShowDetail
For PivotTableIndex = 1 To wks.PivotTables.Count
' This If statement will dramatically increase efficiency - because it takes a long long time to set the value but it doesn't take long to check it.
If wks.PivotTables(PivotTableIndex).PivotFields(PivotFieldIndexName).PivotItems(PivotItemIndexName).ShowDetail <> BoolValue Then
wks.PivotTables(PivotTableIndex).PivotFields(PivotFieldIndexName).PivotItems(PivotItemIndexName).ShowDetail = BoolValue
End If
Next PivotTableIndex
Next PivotItemsIndex
Next PivotFieldIndex
Application.ScreenUpdating = True
Application.EnableEvents = True
End Sub
然后,要在任何数据透视表编辑上自动运行此宏,您需要将其放入 Sheet1 代码中(如果您需要帮助,请告诉我)。
Sub Worksheet_PivotTableUpdate(ByVal Target As PivotTable)
Call LinkPivotTables_ByFieldItemName_ToShowDetail(Target)
End Sub
如果所有数据透视表都在第一张纸上,它将起作用。您可能必须先复制/粘贴到写字板或其他文本编辑器中,因为我不担心行长度限制(注意自动换行)。
编辑/添加:
这是将代码放在特定工作表对象上的方法:
编辑2/添加2 - 效率方法:
这种方法会大大提高效率,但你必须具体告诉它你想要同步哪个字段(它不会全部同步):
Sub LinkPivotTables_ByFieldItemName_ToShowDetail(pt As PivotTable) 'takes as argument - pt As PivotTable
Dim wkb As Workbook
Set wkb = ThisWorkbook
Dim wks As Worksheet
Set wks = wkb.Sheets(1)
Dim PivotTableIndex As Integer
Dim PivotItemIndex As Integer
Dim PivotFieldIndex As String
Dim BoolValue As Boolean
Dim ItemName As String
Application.ScreenUpdating = False
Application.EnableEvents = False
PivotFieldIndex = "Year"
On Error Resume Next
For PivotItemsIndex = 1 To pt.PivotFields(PivotFieldIndex).PivotItems.Count
BoolValue = pt.PivotFields(PivotFieldIndex).PivotItems(PivotItemsIndex).ShowDetail
ItemName = pt.PivotFields(PivotFieldIndex).PivotItems(PivotItemsIndex).Name
For PivotTableIndex = 1 To wks.PivotTables.Count
' This If statement will dramatically increase efficiency - because it takes a long long time to set the value but it doesn't take long to check it.
If wks.PivotTables(PivotTableIndex).PivotFields(PivotFieldIndex).PivotItems(PivotItemsIndex).ShowDetail <> BoolValue Then
wks.PivotTables(PivotTableIndex).PivotFields(PivotFieldIndex).PivotItems(PivotItemsIndex).ShowDetail = BoolValue
End If
Next PivotTableIndex
Next PivotItemsIndex
Application.ScreenUpdating = True
Application.EnableEvents = True
End Sub
您必须在此行中手动告诉它您想要同步哪个字段:
PivotFieldIndex = "Year"
我在网上找到了几个其他解决方案,它们使用相同的循环方法来同步数据透视表 - 问题是,当您获得适当大小的数据透视表时,它们都会遇到相同的效率问题。这些方法通过包含一个 IF 语句来在某种程度上解决该问题,该语句在设置 Item.ShowDetail 值之前检查该值(因为设置该值比仅检查该值花费的时间要长得多)。祝你好运。
关于excel - 使一张纸上的所有数据透视表在行扩展和折叠方面相互模仿,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12352905/
我试图学习python并以此开始,当我尝试运行它时,我一直收到语法错误。光标跳到def start部分的close结束处。我不确定语法错误来自哪里,因为我用语音标记了所有打印件 #! python3
在我的应用程序中,我使用了 polymer 的 paper-dialog 元素。对话框的样式总是将它定位在中心,但我希望它在对话框和窗口右侧之间设置一个最小距离,所以当窗口缩小时,纸质对话框不会靠近右
我需要实现一个石头剪刀布锦标赛模拟器,它将玩完所有回合并返回锦标赛。 这是我的锦标赛数组: tournament = [ [ [ ["Armando",
所以我实际上是用自定义元素包装标准 paper-slider 元素,并希望包含一些样式。以下是我目前拥有的: /* Works */ paper-slider {
对于仅包含图像的 HTML 文档,如何缩放图像以填满整个工作表?我希望图像缩放它的宽度/高度以尽可能大/尽可能小以适合一张纸。 我开始用它来分页 footer {page-break-after:al
我正在尝试扩展 Polymer paper-slider 元素,以便能够获取枚举列表并在 slider 中迭代这些值,而不是仅显示数值。但是我在使样式起作用时遇到了麻烦。如您所见,如果您运行此代码片段
我是 paper.js 的新手。 对于这个项目,我需要一个将在许多情况下使用的形状(具有不同的填充颜色),因此使用符号显然更好(而不是使用 Path.clone() 方法)。但是,一旦我将符号实例化为
我想重新组合我的 PDF 文档以使用我的打印机的 A4 格式在 A5 上打印它们。 我还需要在每个 A5 页面上打印两个站点(幻灯片),当然应该是双面的。因此 A4 页面是横向格式。比我想把它剪在中间
我有两个元素一个在另一个上面,也就是说,一个挡住了另一个。假设 Item2 被 Item1 阻止。现在每当我使用 project.hitTest(Item2); 它工作正常。 但是当我使用鼠标的eve
我有一个网站,它本质上是一个大 Canvas 图像。目前,当 body 被加载时,它开始通过这段代码淡入: 但是我想在我的 paperscript 中调用它,因为有时 body 会在图像从 pape
我是一名优秀的程序员,十分优秀!