如果然后循环通过枢轴项目

时间:2015-01-15 15:57:21

标签: excel vba excel-vba pivot-table

我坚持这个问题,无法弄清楚我做错了什么。我正在编写一个宏来循环遍历数据透视表中的可见字段,找到那些被过滤的字段中的项目,然后将这些过滤器应用于源数据表。我遇到的特殊问题是应该查看字段中的循环,查找可见的透视项,然后将这些项存储为变量。如果所有透视项都可见,我一直在试图终止循环。以下是我到目前为止:

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

因此,只要我在城市或城市组上有过滤器,宏就会将它们粘贴到电子表格中的范围内。最后,我想将它们存储为变量,但是现在我只是为了处理代码而粘贴它们。您还可以看到,当可见项目的数量等于该字段中的枢轴项目总数时,我将返回一个消息框。最终,该消息框将消失并被代码替换,该代码告诉它开始查看下一个可见字段中的枢轴项。

我意识到这可能是不必要的,因为将所有可见项作为过滤器应用于源数据字段将导致显示所有项目,这将完成相同的事情。但是,我更好奇的是我在这一点上做错了什么。无论是否有过滤器,代码都会将所有项目粘贴到范围内。但是,仅当没有应用过滤器时,消息框才会返回,因此它似乎正常工作。

任何输入/反馈都将不胜感激。感谢。

2 个答案:

答案 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

您的代码在粘贴之前不会检查城市是否可见,这就是为什么它总是粘贴每个城市名称。