我坚持这个问题,无法弄清楚我做错了什么。我正在编写一个宏来循环遍历数据透视表中的可见字段,找到那些被过滤的字段中的项目,然后将这些过滤器应用于源数据表。我遇到的特殊问题是应该查看字段中的循环,查找可见的透视项,然后将这些项存储为变量。如果所有透视项都可见,我一直在试图终止循环。以下是我到目前为止:
Sub PivotTest2()
Dim pi As PivotItem
Dim count As Integer
Dim available As Integer
Dim row As Integer
available = ActiveSheet.PivotTables("Cities").PivotFields("City").PivotItems.count
row = 2 'This is your starting row for display
For Each pi In ActiveSheet.PivotTables("Cities").PivotFields("City").PivotItems
If pi.Visible Then
count = count + 1
End If
If count = available Then
MsgBox ("All Pivot Items Are Selected")
End If
If count <> available Then
row = row + 1
Range("'Sheet4'!G" & row) = pi.Name
End If
Next pi
End Sub
因此,只要我在城市或城市组上有过滤器,宏就会将它们粘贴到电子表格中的范围内。最后,我想将它们存储为变量,但是现在我只是为了处理代码而粘贴它们。您还可以看到,当可见项目的数量等于该字段中的枢轴项目总数时,我将返回一个消息框。最终,该消息框将消失并被代码替换,该代码告诉它开始查看下一个可见字段中的枢轴项。
我意识到这可能是不必要的,因为将所有可见项作为过滤器应用于源数据字段将导致显示所有项目,这将完成相同的事情。但是,我更好奇的是我在这一点上做错了什么。无论是否有过滤器,代码都会将所有项目粘贴到范围内。但是,仅当没有应用过滤器时,消息框才会返回,因此它似乎正常工作。
任何输入/反馈都将不胜感激。感谢。
答案 0 :(得分:0)
您的部分支票似乎应该在您的循环之外,这决定了可见PivotItems
的数量。
首先,我建议在第一个Next pi
- If
阻止后移动End If
。然后,您的count
变量应包含可见项目的数量。如果所有项目都可见,则应显示消息框。但是,对于第二部分(复制可见项),您需要再次循环。
为了避免第二次循环,您可能希望将pi.Name
值复制到临时范围,并且只有在应用过滤器时才将此范围复制到最终范围。
答案 1 :(得分:0)
试试这个:
For Each pi In ActiveSheet.PivotTables("Cities").PivotFields("City").PivotItems
If pi.Visible Then
count = count + 1
Range("'Sheet4'!G" & row) = pi.Name
row = row + 1
End If
Next pi
If count = available Then
MsgBox ("All Pivot Items Are Selected")
End If
您的代码在粘贴之前不会检查城市是否可见,这就是为什么它总是粘贴每个城市名称。