2015-01-15 22 views
0

我被困在這個問題上,無法弄清楚它是我做錯了什麼。我正在編寫一個宏來循環透視表中的可見字段,查找那些已過濾的字段中的項目,然後將這些過濾器應用到源數據表。我遇到的特殊問題涉及應該在字段中查找的循環,找到可見的透視項目,然後將這些項目存儲爲變量。如果所有透視項都可見,我一直在試圖終止循環。下面是我到目前爲止有:如果然後通過樞軸項目循環

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

看起來你的支票的一部分應該在你的循環之外,它決定了可見的數量PivotItems

起初,我建議在第一個If - End If區塊後移動Next pi。然後你的count變量應該包含可見項目的數量。如果所有項目都可見,則應顯示您的消息框。但是,對於第二部分(複製可見項),您需要再次循環。

要避免第二個循環,您可能需要將pi.Name值複製到臨時範圍,並且僅當應用了過濾器時纔將此範圍複製到最終範圍。

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 

您的代碼不檢查城市在粘貼前是可見的,這就是爲什麼它總是粘貼每一個城市的名字。